Webhacking.kr 7 -SQLi
- 7번 문제는 생각보다 간단했는데 아직은 미숙해서 필터링 문제가 나오면 해매게 됩니다.
- 그래서 포스팅을 해보게 되었는데요.
- <html>
- <head>
- <title>Challenge 7</title>
- </head>
- <body>
- <!--
- db에는 val=2가 존재하지 않습니다.
- union을 이용하세요
- -->
- <?
- $answer = "????";
- $go=$_GET[val];
- if(!$go) { echo("<meta http-equiv=refresh content=0;url=index.php?val=1>"); }
- $ck=$go;
- $ck=str_replace("*","",$ck);
- $ck=str_replace("/","",$ck);
- echo("<html><head><title>admin page</title></head><body bgcolor='black'><font size=2 color=gray><b><h3>Admin page</h3></b><p>");
- if(eregi("--|2|50|\+|substring|from|infor|mation|lv|%20|=|!|<>|sysM|and|or|table|column",$ck)) exit("Access Denied!");
- if(eregi(' ',$ck)) { echo('cannot use space'); exit(); }
- $rand=rand(1,5);
- if($rand==1)
- {
- $result=@mysql_query("select lv from lv1 where lv=($go)") or die("nice try!");
- }
- if($rand==2)
- {
- $result=@mysql_query("select lv from lv1 where lv=(($go))") or die("nice try!");
- }
- if($rand==3)
- {
- $result=@mysql_query("select lv from lv1 where lv=((($go)))") or die("nice try!");
- }
- if($rand==4)
- {
- $result=@mysql_query("select lv from lv1 where lv=(((($go))))") or die("nice try!");
- }
- if($rand==5)
- {
- $result=@mysql_query("select lv from lv1 where lv=((((($go)))))") or die("nice try!");
- }
- $data=mysql_fetch_array($result);
- if(!$data[0]) { echo("query error"); exit(); }
- if($data[0]!=1 && $data[0]!=2) { exit(); }
- if($data[0]==1)
- {
- echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=
- alert('Access_Denied!')><p>");
- echo("<!-- admin mode : val=2 -->");
- }
- if($data[0]==2)
- {
- echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=
- alert('Congratulation')><p>");
- @solve();
- }
- ?>
- <!--
- index.phps
- -->
- </body>
- </html>
일단 기본적으로 저는 문제에 해당되는 답을 미리 만든후에 필터링을 회피하는 편입니다.
저기서 2가 테이블에 없으니 union을 쓰라고 하는데, 사용법을 조금 찾아봤습니다.
이 블로그를 참고했었습니다.
rand(1,5) 랜덤 값에 따라 괄호의 개수가 달라지는데요. 언젠가는 1이 나오기 떄문에 1이 나올때 답을 인증할 수 있는 답만 만들었습니다.
@mysql_query("select lv from lv1 where lv=($go)") or die("nice try!")
$result=@mysql_query("select lv from lv1 where lv=($_GET[val]) or die("nice try!");
더 쉽게 보기위해 저렇게 바꾸도록 하겠습니다.
테이블에는 2가 없기 때문에 다른 수를 넣어야하는데 제가 생각하기에는 0을 넣으면 0과 내가 union으로 넣어줄 2때문에 0과 2로 data[0]에서, 필터링에 걸릴것 같고
.....if(!$data[0]) { echo("query error"); exit(); }
1을 넣어주면 data[0]이 1이 될 것같고.... 그래서 그냥 3을 넣어주기로 했습니다.
3) union select (2
이렇게 넣어준다면
$result=@mysql_query("select lv from lv1 where lv=(3) union select (2)") or die("nice try!");
이렇게 될 것입니다. 그럼 union은 서로 합쳐주는 역할을 하기 떄문에 넣어준 2가 생기게 됩니다. 그럼 인증이 될 것이라고 생각했습니다.
하지만 spacebar와 2가 필터링이 되어있었습니다.
그렇다면, Spacebar는 %0A인 Linefeed로 대체하고, 2는 3-1로 우회하겠습니다. 사실 2를 어떻게 대체해야할지 너무 오래걸렸습니다. 간단한게 그냥 마이너스를 해주면 되더라고요.
그렇다면 3) union select (2 ==>> 3)%0Aunion%0Aselect%0A(3-1
이렇게 필터링을 우회할 수가 있었습니다.
0 개의 댓글