반응형
문제분석 & 풀이
sql injection 문제다.
○ 코드 분석
1. no 파라미터를 통해 값을 전송받고 있다.
2. no는 # , select , ( , 공백 , limit , = , 0x 중 하나라도 있을시 hack으로 간주한다.
3. sql 쿼리를 실행해서 결과로 나온 id값이 "admin"이면 문제가 해결된다.
필터링을 우회하는 인젝션 쿼리는 다음과 같다.
# Injection Query
0) or id like 'admin'--
# Complete Query
select id from chall27 where id='guest' and no=(0) or id like 'admin'-- )
where문을 보면 or 를 이용해서 id='guest' 를 무효시키고 id가 'admin'인 값을 찾고 있다. 여기서 like를 사용한 이유는 = 는 필터링에 걸리기 때문이다.
마지막에 --[공백]을 사용하였는데 이유는 )를 무효시켜야하는데, 이를 위해서는 주석을 사용해야한다.
그러나 #는 필터링에 걸리기 때문에 다른 주석인 --[공백]을 사용했다.
주석을 보면 뒷 부분에 공백이 붙는데 이유는 "--" + [공백]은 쿼리 종료를 의미하기 때문에 반드시 뒤에 공백이 붙어줘야한다. (공백을 붙이지 않으면 query error가 발생한다.)
마지막으로 일반 공백문자가 필터링에 걸리기 때문에 공백은 TAB(%09)로 우회했다.
다음은 완성된 injection payload다.
0)%09or%09id%09like%09'admin'--%09
no 파라미터로 전송해보자.
클리어!
반응형