본문 바로가기
Wargame/webhacking.kr

webhacking.kr 18번

by morae23 2019. 1. 29.

18번 문제를 보면




다음과 같이 no라는 input 창을 볼 수 있다.

이 때, form의 method가 get이고, action이 index.php임을 알게 된다.



 

따라서 index.phps를 보면 다음과 같다.







우선 입력 받은 값에서 스페이스나 select, union 등을 필터링하는 것을 알 수 있다. 또한 mysql_qurery()의 결과를 배열 형태로 저장하는 것을 볼 수 있다. 여기서 첫 번째 행, 즉 $q[0]이 admin인 경우 solve()를 호출한다.

따라서 “select id from challenge18_table where id=’guest’ and no=$_GET[no]”에서 첫 번째 결과 행이 admin이 되도록 해야한다.

 

where의 조건이

id = ‘guest’ and no = $_GET[no]이기 때문에

$_GET[no]가 {num} or no = {admin_no}이 되면,

( id = ‘guest’ and no = {num} ) or no = {admin_no}

와 같이 동작한다. 단, 이 때 {num}의 값이 guest의 no 값이 아니어야한다. 만약 guest의 no일 경우에는 첫 번째 결과 행($q[0])이 guest가 되기 때문이다.




 




no에 대한 정보를 알아보기 위해 0, 1, 2 등을 입력해보면

1을 입력했을 때 “hi guest”가 출력되는 것을 볼 수 있다.

따라서 guest의 no가 1임을 알게 된다. 이 때 admin의 no는 0 또는 2일 것이라는 추측을 할 수 있다.

 

이제 해야할 일은

0 or no = 2를 필터링 된 문자를 이용하지 않고 입력하는 것이다.

스페이스를 이용하지 않고 입력하는 방법에는 여러가지가 있는데 지금 사용할 것은 \n에 해당하는 %0a이다.

 

따라서 0%0aor%0ano=2를 입력하면 된다.



 




그런데 입력 창에 해당 값을 입력할 경우, url 인코딩으로 인해

0%0aor%0ano=2 이

0%250aor%250ano%3D2 으로 변환된 것을 알 수 있다.

 

따라서 input 창이 아닌 url에 직접

?no=0%0aor%0ano=2 으로 입력해야 한다.

 






 

위와 같이 입력하면 clear할 수 있다.


 



'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 26번  (0) 2019.01.29
webhacking.kr 39번  (0) 2019.01.29
webhacking.kr 16번  (0) 2019.01.29
webhacking.kr 17번  (0) 2019.01.29
webhacking.kr 14번  (0) 2019.01.29

댓글