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 |