이번 문제도 sqli 문제인 것 같다.
소스를 봐보자.
소스를 분석해보자.
1. lv 파라미터로 값을 받고 addslashes() 를 통해 이스케이프 처리 후 여러번의 치환과정을 거친다. (2~8번줄)
2. lv에 select , 0x , limit , cash 가 들어있으면 프로그램 강제종료된다. (9번줄)
3. sql 쿼리를 실행하여 id, cash 값을 받는다.
4. id가 "admin" 이면 문제가 해결된다.
lv 파라미터는 이스케이프 처리됐기 때문에 ' , " 등은 사용할 수 없을 것이다.
그리고 치환 과정을 보면 공백, / , * , % 는 모두 없애고 있어서 이것 또한 사용할 수 없을 것이다.
소스 분석 2번에서 언급한 것들 또한 사용할 수 없다.
이제 위 사실을 참고하여 공격 쿼리를 완성해보자.
select id,cash from chall46 where lv=0%09or%09id%09like%090b110000101100100011011010110100101101110
(공격쿼리, 빨간색이 페이로드)
select id,cash from chall46 where lv=0 or id='admin'
(위 쿼리와 같은 의미로 쉽게 이해하고자 같이 썼다.)
생각보다 간단하게 공격쿼리를 완성했다.
우선 where 문에서 lv로 이뤄진 조건문은 무조건 false가 되어야 뒤쪽에서 내가 원하는 조건문을 삽입할 수 있기 때문에 DB에 없는 lv 값을 찾아봤고 메인페이지에서 입력결과 0이 DB에 존재하지 않는 값이란 것을 알아냈다. (1~4가 존재한다.)
0 이후 or 로 lv=0을 무시하게 만들었고 id='admin'을 추가하려했으나 addslashes() 때문에 ' 를 사용 할 수 없어서 admin을 16진수로 표현한 값으로 대체하려했다.
그러나 0x가 정규표현식에서 필터링 되면서 16진수로 표현할 수 없게 됐고 대신 2진수로 표현하기로 했다.
마지막으로 공백은 치환과정에 의해 사용할 수 없기 때문에 TAB(%09)로 대체하였다.
이제 완성한 페이로드를 lv 파라미터로 전송해보자!
클리어!!!