2016. 7. 30. 10:46 :: 문제풀이/WebHacking,kr

안녕하세요. Message입니다.

Webhacking.kr Lv2 문제풀이입니다.

 

------------------------------------------------------------------------------------------------------------------------------------------

1. 문제분석

------------------------------------------------------------------------------------------------------------------------------------------

 

해당 문제는 홍길동 문제라는 아주 유명한 문제더군요

단서들간의 연관성을 짓기가 매우 어려웠고,

예전에는 힌트가 주어졌다고 했는데, 힌트도 없이 풀면 난이도가 더 상승하겠죠.

 

2번 문제에 접속합니다.

 

1) 첫번째 단서

문제풀이용으로 홈페이지가 구축되어 있습니다.

소스를 살펴보면 첫번째 단서를 얻을 수 있습니다.

아래 하이라이트 처리된 부분을 보면 admin 페이지가 노출되어 있다는 사실입니다.

 

접속해보면 아래와 같은 페이지가 나옵니다. 패스워드를 어떻게 알아낼 수 있을까요?

 

2) 두번째 단서

두번째 단서는 주석처리 되어 있는 시간 값입니다.

 

3) 세번째 단서

세번째는 패스워드가 설정되어 있는 게시글입니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

2. 문제풀이

------------------------------------------------------------------------------------------------------------------------------------------

 

이번문제의 핵심은 admin 페이지에 설정되어 있는 time 인자값과

메인 페이지의 주석처리 되어 있는 부분의 연관성입니다.

바로 아래의 time 부분에 Injection 시도가 가능한가? 라는 발상이 문제풀이의 핵심입니다.

 

아마 문제풀이가 아니고 실제 모의해킹을 수행하는 과정이었다면

Burp Suite로 time 인자값에 Injection을 한번쯤 수행해봤겠지만,

인젝션 수행 후에 어떤 값이 바뀌는지 인지하는것 또한 어려웠을겁니다.

 

아래와 같은 간단한 인젝션을 테스트해봅니다.

1) 결과값이 False인 경우 : <!--2070-01-01 09:00:00-->

  

 

2) 결과값이 True인 경우 : <!--2070-01-01 09:00:01-->

  

 

위와 같은 결과값을 이용하여 우리는 Blind SQL Injeciton 공격을 이용할 수 있습니다.

예전에는 테이블명을 Hint로 주었다고 하는데,

힌트없이 진행하려고 시도해봤지만

MySQL 버전이 낮아서 information.schema 를 활용할 수 없는 관계로...

힌트를 참고하여 테이블명 FreeB0aRd, admin 값을 이용하여 인젝션을 시도합니다.

 

주요 쿼리문은 아래와 같이 구성합니다.

----------------------------------------------------------------------------------------------------------------------------------------

MySQL Version : time=1469864699 and substr(version(),1,1) > '5'; PHPSESSID=%s

DB Length : time=1469864699 and substr(length(database()),1,1) = %d; PHPSESSID=%s

DB Name : time=1469864699 and substr(database(),%d,1) = char(%d); PHPSESSID=%s

PW Length : time=1469864699 and (select ascii(substr(password,%d,1)) from FreeB0aRd) = %d; PHPSESSID=%s

PW : time=1469864699 and (select length(password) from FreeB0aRd) = %d; PHPSESSID=%s

첨부파일 >blind.py

----------------------------------------------------------------------------------------------------------------------------------------

 

패스워드를 알아냈다면 암호가 걸려있던 admin 페이지로 갑니다.

매뉴얼 패스워드를 알려줍니다.

 

매뉴얼은 패스워드가 걸려있던 게시글에 첨부되어 있습니다.

압축파일에 암호가 걸려있으며, 매뉴얼 패스워드를 입력합니다.

 

압축을 풀고 열어보면 문제 2번을 클리어할 수 있는 패스워드를 알아낼 수 있습니다.

 

 Tip. Accept-Encoding

 서버로부터의 응답이 인코딩된 문자열로 들어와서 삽질을 했습니다.

 처음에는 이클립스의 인코딩 설정인줄 알고 건드리다가

 응답값에 URL, BASE64 등등의 디코딩을 해봐도 안되더군요...

 

 

 근데 다른분들의 코딩을 살펴봐도 디코딩을 하신분은 없길래 약간 의아했습니다.

 문제는 헤더값을 모두 설정해주겠다고 제가 입력한 Accept-Encoding 입니다.

 

 

 Accept-Encoding은 클라이언트가 웹 서버에게 보내는 HTTP Request 헤더에 들어있는 값으로서

 클라이언트가 해당 인코딩 또는 디코딩할 수 있음을 서버에 알려주는 역할입니다.  

 

 그래서 제가 받은 html문서의 body 부분은 Content-Encoding 에 명시된 gzip으로 인코딩 되었습니다.

 FIddler가 인코딩 되어 있음을 알려주고 있으며, 클릭하면 디코딩할 수 있습니다.

 Tip. MySQL Query (APMSETUP)

 Blind SQL Injection에 사용되는 문법을 보는데 이해가 잘 안되더군요

 확실히 숙지 하지 못하고, 머리속으로 상상하면서 코딩을 했습니다.

 당연히 시간이 지연되고 오류도 많이....하아

 사용되는 문법에 대한 흐름을 간략히 APM Setup에서 테스트해보았습니다.

 APMSETUP 설치경로(C:\APM_Setup\Server\MySQL5\bin)에서 아래와 같이 실행합니다.

 

제가 테스트 해보고 싶었던 부분은 select 뒤에 오는

 

 ascii(substr(password, 1,1)) 부분입니다. (이해가 잘 안되더군요)

 정확한 컬럼명을 입력해야 하는거 아닌가 싶어서요..

 하지만 password 컬럼을 검색한 결과값에서 필터가 적용되는것으로 보입니다.

 

 

 사용한 MYSQL 주요 명령어는 아래와 같습니다.

 - DB생성 : CREATE DATABASE dbname;

 - DB검색 : SHOW DATABASES;

 - DB선택 : USE dbanme;

 - TB검색 : SHOW TABLES;

 

posted by Red_Message