27번은 SQL Injection 문제이다.
view-source를 통해 소스코드를 보자.
위의 소스코드를 보면,
no 값에 입력값이 들어가고,
no=2가 되면 admin으로 인식되면서 문제가 풀리는 것을 알 수 있다.
SQL 문장을 좀 더 자세히 보자.
select id from chall27 where id='guest' and no=({$_GET['no']})")
$_GET['no']가 입력값이고, no에 들어가는 값이 ()로 묶이는 것을 볼 수 있다.
우리는 no에 2라는 값을 넣어야 하기 때문에 where문에서 기존에 적혀 있던 값은 무효화 하고 no=2를 넣어주어야 한다.
즉, 아래와 같은 값을 넣는 것이다.
아무값) or no = 2 --
이때 아무값 뒤에 )가 붙는 이유는 no에 들어가는 값이 ()로 묶이기 때문이고,
--가 붙는 이유는 뒤에 붙을 )를 주석처리 해서 쿼리 에러가 뜨지 않게 하기 위해서이다.
우리가 해결해야 하는 것은 공백과 =이 필터링 된다는 것이다.
공백의 경우에는 %09(탭)으로 =는 like로 대체 가능하다.
정리하자면
아무값)%09or%09no%09like%09--%09를 입력해주면
select id from chall27 where id='guest' and no=(아무값) or no like 2 -- )
가 되면서 no = 2가 되는 sql 문을 완성할 수 있게 되는 것이다.
이때 입력창 안에 이 값을 입력하게 되면 query error가 발생한다.
그 이유는 입력창 값이 전달되면서 한 번 더 url encoding을 수행하게 되는데
서버에서는 decoding을 1번만 수행하기 때문에 아래와 같이 인식되기 때문이다.
select id from chall27 where id='guest' and no=(아무값)%09or%09no%09like%092%09--%09)
이에 주소 입력창에 아무값)%09or%09no%09like%09--%09를 입력해주면 문제가 풀리게 된다.
'webhacking.kr' 카테고리의 다른 글
webhacking.kr 10번문제풀이 (2) | 2022.07.22 |
---|---|
webhacking.kr 18번 문제풀이 (1) | 2022.07.17 |
webhacking.kr 16번문제풀이 (0) | 2022.07.16 |
webhacking.kr 26번 문제풀이 (2) | 2022.07.14 |
webhacking.kr 14번(old) (0) | 2022.07.10 |