[webhacking.kr] pro 46 문제풀이
[webhacking.kr] pro 46 문제를 풀어보도록 하겠습니다. 문제에 들어가면 아래와같은 화면이 출력됩니다.
SQL INJECTION이라고 합니다. 무작정 1을 입력해봤습니다. 그랬더니 위 사진과 같이 출력됩니다. 그럼 이제 index.phps를 확인해보도록 하겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <html> <head> <title>Challenge 46</title> </head> <body> <form method=get action=index.php> level : <input name=lv value=1><input type=submit> </form> <? if(time()<1256900400) exit(); ?> <!-- index.phps --> <? $_GET[lv]=str_replace(" ","",$_GET[lv]); $_GET[lv]=str_replace("/","",$_GET[lv]); $_GET[lv]=str_replace("*","",$_GET[lv]); $_GET[lv]=str_replace("%","",$_GET[lv]); if(eregi("union",$_GET[lv])) exit(); if(eregi("select",$_GET[lv])) exit(); if(eregi("from",$_GET[lv])) exit(); if(eregi("challenge",$_GET[lv])) exit(); if(eregi("0x",$_GET[lv])) exit(); if(eregi("limit",$_GET[lv])) exit(); if(eregi("cash",$_GET[lv])) exit(); $q=@mysql_fetch_array(mysql_query("select id,cash from members where lv=$_GET[lv]")); if($q && $_GET[lv]) { echo("$q[0] information<br><br>money : $q[1]"); if($q[0]=="admin") @solve(); } ?> </body> </html> | cs |
이렇게 코드가 있습니다. 코드를 확인해보면 union,select,from,challenge,0x,limit,cash 이lv값에 파라미터로 들어가면 exit함수가 실행됩니다.
또한 공백, /,*,%가 들어오면 str_replace함수로 필터링이 됩니다. 그리고 값이 admin이면 문제가 해결됩니다.
Exploit Vector
lv에 파라미터로 admin값을 넣어주어야합니다. 근데 앞에 쿼리를 거짓으로 만들어주고 공백을 우회하며 admin값을 대입해야합니다.
하지만 그냥 admin을 넣으니까 안되는걸 봐서는 magic_quotes_gpc가 설정되있는것 같습니다. 그래서 char을 이용하여 우회를 해야합니다.
Exploit
아주간단합니다. 앞에 쿼리에 거짓을 위해서 2값을 넣어준후, or연산자를 이용하여 id=admin값을 넣어주어야합니다.
그런데 magic_quotes_gpc 설정을 우회하기 위하여 '가 없는 char과 아스키코드를 이용하여 admin값을 넣어주어야합니다.
또한 공백은 %0a를 이용하여 str_replace를 우회해야합니다. 그렇다면 최종 쿼리문은 2%0aor%0aid=char(97,100,109,105,110) 입니다.
짜잔
webhacking.kr pro 46 Clear!