http://webhacking.kr/challenge/web/web-32/index.php
기초적인 sqli.
<?
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!");
}
}
?>
no를 받아서 공백,/,(,),탭,|,&,union,select,from,0x를 필터링 후 해당 쿼리문에 집어넣음.
no=1입력시 hi guest가 뜨는 것으로 보아
challenge18_table은
id | no
guest | 1
이런식으로 구성되있을거라고 예측할수 있다. 결과가 admin이면 통과인데 admin으로 가려면
크게 두가지가 있다. 없는 값을 만들거나, 있는 값으로 우회하거나.
없는 값을 만들려면 union이 필요한데 필터링되어 있으므로 있는 값으로 우회하라는 것이다.
고칠수 없는 부분은 select id from challenge18_table where id='guest' and no= 부분이다.
no에 어떤 값을 입력해도 1이 아니면 id='guest' and no=숫자 가 틀린 값이 될것이다.
admin의 no값이 0이나 2이라고 가정하고 no에 2을 입력해도.
id | no
admin | 2
guest | 1
이라 해도 id='guest' and no=2이 되어 false가 된다. or로 한번 꼬아주면 된다.
id = 'guest' and no=-1 or no=2 처럼 입력하면 (id = 'guest' and no=-1) or no=2
과 같이 우선순위가 된다. 괄호부분은 거짓이라서 사라지고, 남은 조건이 no=2밖에 없어서
no=2인 admin이 출력된다. id='guest' and no=1 or no=2 처럼 하면 안되는 이유는
웹상에 출력이 될 경우에 무조건 한 가지 결과값만 출력이 되기 때문이다.
id = 'guest' and no=1 or no=2 처럼 하면 결과값으로 guest와 admin이 나올텐데,
가장 위에 있는 값만 출력이 된다. 이 경우에는 guest만 출력되는것으로 보아
id | no
guest | 1
admin | 2
처럼 guest가 더 위쪽에 결과가 있음을 예상해볼 수 있다. 이건 가장 간단한 해답이고
전체 값이 다 출력되게 한 후 limit 으로 제한된 결과를 출력해도 답이 나온다.
no=1 or 1=1 limit 1,1 등등....
sqli에 익숙하지 않다면 답만 알고 가기보다는 여러 벡터를 실험해보는게 좋을 듯 싶다..
'webhacking > sql, sql injection' 카테고리의 다른 글
wargame.kr web_chatting (0) | 2014.10.06 |
---|---|
wargame.kr tmitter (0) | 2014.10.04 |
wargame.kr DB is really GOOD (0) | 2014.10.01 |
information_schema (0) | 2014.09.28 |
wargame.kr lonely_guys (0) | 2014.09.28 |