본문 바로가기

보안공부/Webhacking.kr 풀이

webhacking.kr 27번 문제 풀이

오늘은 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번 문제 클리어!