본문 바로가기

Web/wargame

[Webhacking.kr] old-18

SQL Injection을 활용하는 문제라고 생각된다.

아래의 view-source로 소스코드를 보자!

 

먼저, GET 방식으로 no를 전달받고, db를 연결시킨다.

 

preg_match()

- <?php preg_match('/찾거나 필터링할 문자/', 'input한 문자', $match);

- ' 와 같은 특수문자를 필터링할 때는 앞에 \를 붙이면 됨 ex) '/\'/'

- '/찾거나 필터링할 문자/'i 이렇게 i가 붙는 경우는 대소문자를 구분하지 않음

- 검거당한 문자열은 $match 에 배열 형태로 저장됨

- 하나라도 문자열이 검거되면 1을 반환, 그렇지 않으면 0을 반환

참고: https://flash-ctf.tistory.com/43

 

공백 입력 결과 ↓

preg_match() 와 정규 표현식으로 공백, &, select, from 과 같은 문자열이 필터링되는 것 같다. 

 

아래의 if문을 보면, id가 admin일 때에 문제가 해결될 것으로 보인다.

 

mysqli_fetch_array()

- mysql 서버가 응답한 결과를 배열로 리턴

 

select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2 에서

id는 guest로 고정되어 있고

주석을 보면, no가 2일 때 문제가 해결되는 것 같다.

따라서, (True and False) or True → True 속성을 이용해서 no를 2로 만들어주려고 한다!

→ select id from chall18 where id='guest' and no='-1' or no='2'));

 

하지만, '-1' or no='2' 를 입력해보면

필터링으로 인해 no hack 이라는 문구가 뜨기 때문에

이를 우회하기 위해서 URL Encoding 을 사용해야 한다.

 

' → %27

= → %3D

공백 → %09

 

공백만 우회해주면 되므로

-1%09or%09no=2 를 URL에 입력해주면

해결!

 

참고로, 텍스트 창에 입력하면 인코딩되어서 링크로 들어가기 때문에 이상하게 인코딩된다.

따라서 URL에 직접 입력해줘야 문제를 해결할 수 있었다.

'Web > wargame' 카테고리의 다른 글

[Webhacking.kr] old-20  (0) 2021.10.31
[Webhacking.kr] old-06  (0) 2021.10.03
[Webhacking.kr] old-14  (0) 2021.09.26
[Webhacking.kr] old-17  (0) 2021.09.24
[Webhacking.kr] old-16  (0) 2021.09.21