zj3t

email: euntaejang@gmail.com

Latest Posts

Webhacking.kr 8-sql Injection

By 오후 10:41


  1. <html>
  2. <head>
  3. <title>Challenge 8</title>
  4. <style type="text/css">
  5. body { background:black; color:white; font-size:10pt; }
  6. </style>
  7. </head>
  8. <body>
  9. <br><br>
  10. <center>USER-AGENT

  11. <?

  12. $agent=getenv("HTTP_USER_AGENT");
  13. $ip=$_SERVER[REMOTE_ADDR]; --내 ip 

  14. $agent=trim($agent);  --앞뒤 문자열 공백 제거

  15. $agent=str_replace(".","_",$agent);  --  . => _
  16. $agent=str_replace("/","_",$agent);  --  / => _

  17. $pat="/\/|\*|union|char|ascii|select|out|infor|schema|columns|sub|-|\+|\||!|update|del|drop|from|where|order|by|asc|desc|lv|board|\([0-9]|sys|pass|\.|like|and|\'\'|sub/";

  18. $agent=strtolower($agent); --소문자로 변신 

  19. if(preg_match($pat,$agent)) exit("Access Denied!"); --필터링 겹치면 X

  20. ; --싱글 쿼터(')=>""
  21. $_SERVER[HTTP_USER_AGENT]=str_replace("\"","",$_SERVER[HTTP_USER_AGENT]); --("\") => ""$_SERVER[HTTP_USER_AGENT]=str_replace("'","",$_SERVER[HTTP_USER_AGENT])

  22. $count_ck=@mysql_fetch_array(mysql_query("select count(id) from lv0"));
  23. if($count_ck[0]>=70) { @mysql_query("delete from lv0"); }


  24. $q=@mysql_query("select id from lv0 where agent='$_SERVER[HTTP_USER_AGENT]'"); -- 핵심 구문

  25. $ck=@mysql_fetch_array($q);

  26. if($ck)
  27. echo("hi <b>$ck[0]</b><p>");
  28. if($ck[0]=="admin")

  29. {
  30. @solve();
  31. @mysql_query("delete from lv0");
  32. }

  33. }

  34. if(!$ck)
  35. {
  36. $q=@mysql_query("insert into lv0(agent,ip,id) values('$agent','$ip','guest')") or die("query error");
  37. echo("<br><br>done!  ($count_ck[0]/70)");
  38. }


  39. ?>

  40. <!--

  41. index.phps

  42. -->

  43. </body>
  44. </html>
  45.  

만약에 agent='$_SERVER[HTTP_USER_AGENT] 이 곳에서 lv0 테이블안에 id가 admin을 가져오지 못한다면 밑에 구문을 실행하게 된다.

HTTP_USER_AGENT란 

  1. User-Agent:
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
이렇게 브라우저 환경을 나타내 주는 값
  1. $q=@mysql_query("insert into lv0(agent,ip,id) values('$agent','$ip','guest')") or die("query error");
이 sql insert 구문으로 $agent는 agent에, $ip는 ip에, $id는 id에 넣는다.

만약 이 구문에서 id에 admin을 넣을 수만있다면, admin을 넣었을 때의 agent를 인자로 주면 id 가 admin이 될 것이다.

where agent='$_SERVER[HTTP_USER_AGENT]


zjet','1','admin')--

이러한 값을 넣어주면 되는데, 그렇게 되면
$q=@mysql_query("insert into lv0(agent,ip,id) values('zjet,"1","admi")--','$ip','guest')")

이 되서 agent가 zjet이고 agent가 zjet인 곳에서의 id는 admin이 되는 것이다.

하지만 '-' 를필터링하고 숫자를 필터링 한다. 따라서 zjet','abc','admin');# 이렇게 넣어주면 된다.

주석은 -- 이외에 #도 있기 때문이다.

하지만 여기서 ' 를 필터링해서 "" 로 만들어주는데 어떻게 zjet','abc','admin');# 이값을 넣어?? 그렇게 되면 zjet,abc,admin);# 이되서 

$q=@mysql_query("insert into lv0(agent,ip,id) values('zjet,abc,admin);#

오류가 날텐데?? 라고 생각하시는 분들이 있을 거에요 저 또한 그걸로 해맸습니다.  ' (싱글쿼터)를 ""로 만드는 것은 맞습니다. 하지만 

$_SERVER[HTTP_USER_AGENT]=str_replace("'","",$_SERVER[HTTP_USER_AGENT]) 에서 보듯이  $_SERVER[HTTP_USER_AGENT] 변수가 필터링 되는 것이지 $agent 자체가 필터링 되지는 않습니다.








You Might Also Like

0 개의 댓글