webhacking.kr

webhacking.kr 27

webhacking지구 2022. 7. 17. 21:40

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