오늘은 27번 문제를 풀어보자.
이 페이지의 코드를 확인해 봤을떄 필터를 한번 거친 후 넘겨받은 no를 db 쿼리문에 바로 넣어 처리하는 것 같았다.
<?
if($_GET[no])
{
if(eregi("#|union|from|challenge|select|\(|\t|/|limit|=|0x",$_GET[no])) exit("no hack");
$q=@mysql_fetch_array(mysql_query("select id from challenge27_table where id='guest' and no=($_GET[no])")) or die("query error");
if($q[id]=="guest") echo("guest");
if($q[id]=="admin") @solve();
}
?>
따라서 no를 순서 인덱싱이라고 가정하고 우선 0부터 쳐봅시다.
하지만 아무런 결과도 나오지 않는다.
하지만 1을 치니
guest라는 결과가 나왔고, 이로써 no가 index라는 추측이 맞다는 것을 확인할 수 있었다.
이제 2를 입력해보자.
2를 넣었을때 결과는 쿼리 에러를 내뱉었다.
0을 넣었을때는 아무 값도 나오지 않았고,
1을 넣었을 때 guest가 떴고,
2를 넣었을때는 쿼리 에러가 발생하였다.
따라서 admin은 0 또는 2에 있다는것을 알 수 있었다.
쿼리에 사용하는 구문이 select id from challenge27_table where id='guest' and no=($_GET[no]) 이니 no를 통해 값을 변조할 수 있을것 같다.
no=0 or no=2를 만들어줘야 하는데 =라는 문구는 필터에서 걸리니 같거나 비슷한 기능을 하는 like로 바꿔 처음의 쿼리문에 있던 no=를 제외하고 no=0 or no like 2가 되어야 한다.
이때 괄호가 말썽이다. 하지만 no를 통해 괄호도 전송해주면 될것 같다.
따라서 no = 0) or no like 2를 전송해주면 select id from challenge27_table where id='guest' and no = 0) or no like 2) 가 된다.
하지만 마지막 괄호가 또 문제를 일으키니 SQL의 한줄 주석문인 -- 를 써보자. 그러면 다음과 같은 쿼리문이 완성된다.
select id from challenge27_table where id='guest' and no = 0) or no like 2 -- )
이 쿼리문을 전송하기 위헤 위 폼에 0) or no like 2 -- 를 보내주자.
다음과 같이 쿼리문을 전송해주면
다음과 같이 문제가 풀리게 된다.
WEBHACKING.KR 27번 문제 클리어!
'보안공부 > Webhacking.kr 풀이' 카테고리의 다른 글
webhacking.kr 33번 문제 풀이 (1) | 2018.09.06 |
---|---|
webhacking.kr 32번 문제 풀이 (0) | 2018.08.29 |
webhacking.kr 38번 문제 풀이 (0) | 2018.08.23 |
webhacking.kr 42번 문제 풀이 (2) | 2018.08.22 |
webhacking.kr 3번 문제 풀이 - 또는참 (0) | 2018.08.04 |