Home [Wargame] Webhacking.kr old-39 (SQL Injection)
Post
Cancel

[Wargame] Webhacking.kr old-39 (SQL Injection)

🚩 문제 νŒŒμ•…


image

문제 νŽ˜μ΄μ§€μ— μ ‘μ†ν•˜λ©΄ νšŒμ›κ°€μž…κ³Ό λ‘œκ·ΈμΈν•  수 μžˆλŠ” 폼을 확인할 수 μžˆλ‹€. μ½”λ“œλ₯Ό 확인해보면 JOIN μ‹œ IDλŠ” id, PHONE은 phone의 name을 κ°€μ§€κ³ , LOGINμ‹œ IDλŠ” lid, PHONE은 lphone의 name을 κ°€μ§€λŠ” 것을 확인할 수 μžˆλ‹€. view-sourceλ₯Ό 톡해 ν”„λ‘œκ·Έλž¨ μ†ŒμŠ€μ½”λ“œλ₯Ό ν™•μΈν•΄λ³΄μž.


  • JOIN 처리 μ½”λ“œ
1
2
3
4
5
6
7
8
if($_POST['id'] && isset($_POST['phone'])){
    $_POST['id'] = addslashes($_POST['id']);
    $_POST['phone'] = addslashes($_POST['phone']);
    if(strlen($_POST['phone'])>=20) exit("Access Denied");
    if(preg_match("/admin/i",$_POST['id'])) exit("Access Denied");
    if(preg_match("/admin|0x|#|hex|char|ascii|ord|select/i",$_POST['phone'])) exit("Access Denied");
    mysqli_query($db,"insert into chall59 values('{$_POST['id']}',{$_POST['phone']},'guest')");
}
  1. addslashes ν•¨μˆ˜λ‘œ μž…λ ₯ 값을 μ²˜λ¦¬ν•˜κΈ°μ— μ‹±κΈ€μΏΌν„° 'λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.
  2. phone κ°’μ˜ κΈΈμ΄λŠ” 20 이상일 수 μ—†λ‹€.
  3. id 값은 /admin/i μ •κ·œμ‹μ„ λ§Œμ‘±ν•  수 μ—†λ‹€.
  4. phone 값은 /admin|0x|#|hex|char|ascii|ord|select/i μ •κ·œμ‹μ„ λ§Œμ‘±ν•  수 μ—†λ‹€.
  5. λͺ¨λ“  쑰건을 λ§Œμ‘±ν–ˆμ„ μ‹œμ— insert into chall59 values('{$_POST['id']}',{$_POST['phone']},'guest') ꡬ문을 μ‹€ν–‰ν•œλ‹€.


  • LOGIN 처리 μ½”λ“œ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if($_POST['lid'] && isset($_POST['lphone'])){
    $_POST['lid'] = addslashes($_POST['lid']);
    $_POST['lphone'] = addslashes($_POST['lphone']);
    $result = mysqli_fetch_array(mysqli_query($db,"select id,lv from chall59 where id='{$_POST['lid']}' and phone='{$_POST['lphone']}'"));
    if($result['id']){
        echo "id : {$result['id']}<br>lv : {$result['lv']}<br><br>";
        if($result['lv'] == "admin"){
            mysqli_query($db,"delete from chall59");
            solve(59);
        }
        echo "<br><a href=./?view_source=1>view-source</a>";
        exit();
    }
}
  1. addslashes ν•¨μˆ˜λ‘œ μž…λ ₯ 값을 μ²˜λ¦¬ν•˜κΈ°μ— μ‹±κΈ€μΏΌν„° 'λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.
  2. λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‚¬μš©μžκ°€ μž…λ ₯ν•œ lid와 lphone에 ν•΄λ‹Ήν•˜λŠ” λ°μ΄ν„°μ˜ lv이 admin일 경우 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.


SQL Injection을 톡해 lv이 admin인 κ³„μ •μœΌλ‘œ νšŒμ›κ°€μž…ν•˜κ³  λ‘œκ·ΈμΈν•˜λ©΄ 문제λ₯Ό ν’€ 수 μžˆλ‹€.



🚩 문제 풀이


μš°μ„  lv이 admin 값을 κ°€μ§€λŠ” 계정을 μƒμ„±ν•΄λ³΄μž. join μ‹œμ™€ login μ‹œμ— λͺ¨λ‘ μ‹±κΈ€μΏΌν„°λ₯Ό μ‚¬μš©ν•  수 없기에 이λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  계정을 μƒμ„±ν•˜λŠ” 방법을 μ°Ύμ•„μ•Όν•œλ‹€.


μš°λ¦¬κ°€ μž…λ ₯ν•œ 값은 insert ꡬ문을 κ΅¬μ„±ν•˜μ—¬ MySQL 쿼리λ₯Ό μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ— MySQLμ—μ„œ μ§€μ›ν•˜λŠ” λ¬Έμžμ—΄ κ΄€λ ¨ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ admin 계정을 μƒμ„±ν•΄λ³΄μž.


id=admi&phone=1,concat(id,chr(110))--+ (주석 처리 뒀에 곡백 문자 ν•„μš”)

λŒ€ν‘œμ μΈ λ¬Έμžμ—΄ κ΄€λ ¨ ν•¨μˆ˜λŠ” concat, substr, replace, reverse, upper, lower 등이 μžˆλŠ”λ°, μ²˜μŒμ—λŠ” 이 쀑 concat ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ POST μš”μ²­ μ‹œ μ „μ†‘ν•˜λŠ” λ°”λ”” 값을 κ΅¬μ„±ν•˜μ˜€λ‹€. κ·ΈλŸ¬λ‚˜, phone κ°’μ˜ 길이가 20이상일 수 μ—†λ‹€λŠ” 쑰건에 μΆ©μ‘±ν•˜μ§€ λͺ»ν•˜μ˜€λ‹€.


id=nimda&phone=1,reverse(id))--+

κ·Έλž˜μ„œ reverse ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬μ„±ν•˜μ˜€κ³ , μ΄λŠ” λͺ¨λ“  쑰건을 μΆ©μ‘±ν•˜μ˜€λ‹€.


image

νŽ˜μ΄μ§€μ— 직접 μž…λ ₯ν•˜μ—¬ joinν•˜λ©΄ 이런 λͺ¨μŠ΅μ΄ 될 것이닀.


lid=nimda&lphone=1

μš”μ²­μ„ 보내고 μœ„μ˜ λ°”λ”” κ°’μœΌλ‘œ LOGIN을 μ‹œλ„ν•˜μ˜€λ”λ‹ˆ 문제λ₯Ό ν’€ 수 μžˆμ—ˆλ‹€.


image

νŽ˜μ΄μ§€μ— 직접 μž…λ ₯ν•˜μ—¬ loginν•˜λ©΄ μœ„μ˜ κ·Έλ¦Όκ³Ό κ°™λ‹€.

This post is licensed under CC BY 4.0 by the author.

[pwnable] Over The Wire - Bandit

[Wargame] Webhacking.kr old-42 (Base64)