https://dreamhack.io/wargame/challenges/1227
access-log
Description [\[함께실습\] access-log](https://learn.dreamhack.io/654)에서 실습하는 문제입니다. 당신은 이번 해킹 사건의 분석을 담당하게 되었습니다. 그런데 access.log 파일 하나만이 제공 가능하다고 합니
dreamhack.io
웹 해킹 + 포렌식 문제
다른 웹해킹 문제 풀다 너무 탈주하고 싶어서 풀게 되었다....😭
문제 파일을 다운받아보자. 이번 문제는 포렌식이 합쳐져서인지 사이트가 없다.
텍스트 문서 하나 있다. 이걸 일단 열어보자.
오....오...?
웹사이트의 요청과 응답에 대한 기록들을 정리해놓은 로그파일인데, 양이 꽤 많다.
이거 다 보면 세월 다갈듯
일단 요청 하나를 가져와서 분석해보자.
172.20.0.1 - - [26/Apr/2024:17:38:09 +0000] "GET /vulnerabilities/sqli/?id=1&Submit=Submit HTTP/1.1" 200 1686 "-" "sqlmap/1.2.4#stable (http://sqlmap.org)"
172.20.0.1 : 요청을 보내는 클라이언트 측의 ip
[26/Apr/2024:17:38:09 +0000] : 요청을 보낸 시간
"GET /vulnerabilities/sqli/?id=1&Submit=Submit HTTP/1.1" : get 요청으로 /vulnerabilities/sqli/?id=1&Submit=Submit 이 리소스를 요청했다는 의미
"sqlmap/1.2.4#stable (http://sqlmap.org)" : user-agent 문자열로, 해당 요청이 sqlmap 툴을 이용해서 만들어져서 사이트에 보내졌다는 걸 의미한다.
user agent 는 request header에 담긴 값 중 하나로, HTTP 요청을 보내는 디바이스와 브라우저 등 사용자 소프트웨어의 식별 정보를 담고 있다.
flag를 찾아보자.
notepad에서 문서에서 전체 찾기로 flag 문자열을 포함한 값들을 모두 찾아보았다.
flag를 포함한 문자열 중 값이 본격적으로 바뀌는 몇개의 문자열을 두고 분석해보자.
172.20.0.1 - - [26/Apr/2024:17:50:53 +0000] "GET /vulnerabilities/sqli/?id=1%27%20AND%209329%3DIF%28%28ORD%28MID%28%28SELECT%20IFNULL%28CAST%28%60value%60%20AS%20CHAR%29%2C0x20%29%20FROM%20dvwa.flag%20ORDER%20BY%20id%20LIMIT%200%2C1%29%2C1%2C1%29%29%3E137301%29%2CSLEEP%281%29%2C9329%29--%20QEcW&Submit=Submit HTTP/1.1" 200 1807 "-" "sqlmap/1.2.4#stable (http://sqlmap.org)"
알아보기 힘드니까 url decoding 후 분석해보도록 하자.
172.20.0.1--[26/Apr/2024:17:50:53+0000]"GET/vulnerabilities/sqli/?id=1' AND 9329=IF((ORD(MID((SELECT IFNULL(CAST(`value` AS CHAR),0x20) FROM dvwa.flag ORDER BY id LIMIT 0,1),1,1))>137301),SLEEP(1),9329)-- QEcW&Submit=SubmitHTTP/1.1"200 1807"-""sqlmap/1.2.4#stable(http://sqlmap.org)"
- AND 9329=IF(...):
- IF 조건문으로 SQL 쿼리를 확장.
- IF(조건, 참일 때 동작, 거짓일 때 동작):
- 참일 경우 SLEEP(1)로 서버가 1초 대기
- 거짓일 경우 9329를 반환
- 조건 비교 (> x):
- 추출된 ASCII 값과 x를 비교:
- > x: ascii값이 x보다 큰지 확인
- 추출된 ASCII 값과 x를 비교:
- SLEEP(1):
- 조건이 참이면 서버가 1초 대기
해당 쿼리는 time-based sql injection을 이용한 쿼리문으로, 일부러 거짓이 되는 요청을 보내고, 서버의 응답을 확인하고 있다.
서버가 거짓 요청을 받을 때는 "200 1807" 이렇게 보내는 것을 확인할 수 있는데, 이와 다른 바이트 크기값을 보낼 경우 서버가 올바른 요청을 받고, 올바른 응답을 돌려보냈다는 것을 의미한다는 것을 알 수 있다.
1807과 다른 응답 바이트를 보내는 쿼리문을 찾아보도록 하자.
172.20.0.1 -- [26/Apr/2024:17:50:55+0000]"GET /vulnerabilities/sqli/?id=1' AND 9329=IF((ORD(MID((SELECT IFNULL(CAST(`value` AS CHAR),0x20) FROM dvwa.flag ORDER BY id LIMIT 0,1),1,1))>68),SLEEP(1),9329)-- QEcW&Submit=SubmitHTTP/1.1"200 1804"-""sqlmap/1.2.4#stable(http://sqlmap.org)"
172.20.0.1 -- [26/Apr/2024:17:50:55+0000]"GET /vulnerabilities/sqli/?id=1' AND 9329=IF((ORD(MID((SELECT IFNULL(CAST(`value` AS CHAR),0x20) FROM dvwa.flag ORDER BY id LIMIT 0,1),1,1))>66),SLEEP(1),9329)-- QEcW&Submit=SubmitHTTP/1.1"200 1664"-""sqlmap/1.2.4#stable(http://sqlmap.org)"
MID 함수를 이용해 SELECT 구문에서 부분적으로 값을 가져오고 있다.
MID(SELECT 구문, 1, 1)은 SELECT 구문에서 가져온 값의 첫 번째부터 1바이트 가져온 값을 의미함
이를 BYTE(1) 라고 할 때, 위의 두 구문은 BYTE(1) 값이 68 초과인지, 66 초과인지 각각 비교하고 있다.
그런데 응답 바이트가 1800 이상이고 1664인 것으로 보아 서로 결과가 다름 -> 서버의 반응을 통해 어느 값이 올바르고 어느 값이 틀린지 확인 가능
즉 BYTE(1)은 67 혹은 68 이라는 걸 알수 있는데, ascii 십진수로 67은 C를, 68은 D를 의미한다.
이렇게 범위를 좁힌 후, !=로 비교하고 있다.
172.20.0.1 -- [26/Apr/2024:17:50:57+0000]"GET /vulnerabilities/sqli/?id=1' AND 9329=IF((ORD(MID((SELECT IFNULL(CAST(`value` AS CHAR),0x20) FROM dvwa.flag ORDER BY id LIMIT 0,1),1,1))!=68),SLEEP(1),9329)-- QEcW&Submit=SubmitHTTP/1.1"200 1806"-""sqlmap/1.2.4#stable(http://sqlmap.org)"
flag는 DH{...} 형식이며, 그렇기에 BYTE(1)이 D임을 예측할 수 있다. 따라서 위의 IF 구문 내의 !=은 거짓이 되어야한다.
- 구문에서 참일 경우 1664 크기 응답을 반환하고, 거짓일 경우 1800 초과의 응답을 반환한다는 사실을 알 수 있기 때문에 != 로 문자열을 한정지어서 검색해보면 플래그에 대해 알 수 있을 듯 하다.
dvwa의 flag 테이블에서 id 칼럼을 기준으로 1개의 행씩 가져옴 -> 문자열 하나씩(d{1, 2} , 1) 추출해서 비교(!=) -> 두 자리 or 세 자리인 숫자(ascii 값)와 매칭
즉, sql injection을 통해 추출된 문자의 ascii 값을 출력한다는 의미
dvwa.flag%20ORDER%20BY%20id%20LIMIT%200%2C1%29%2C%5Cd%7B1%2C2%7D%2C1%29%29%21%3D%5Cd%7B2%2C3%7D
이렇게 정규표현식을 구성하고, url encoding으로 인코딩 후 나오는 문자열을 추출해봤다.
??
그냥 원래 문자열로도 찾아보자
dvwa.flag ORDER BY id LIMIT 0,1),\d{1,2},1))!=\d{2,3}
표현식이 잘못 되었다고 나온다.
notepad++ 버전에 따라 오류가 날 수 있으므로, . 앞에 \를 넣어서 다시 검색을 돌려보자.
dvwa\.flag ORDER BY id LIMIT 0,1\),\d{1,2},1\)\)!=\d{2,3}
나중에 notepad++ 플러그인을 다시 깔고 시도해봐야 될 듯 하다.
지금 제대로 정규식이 안먹는 것 같다...... 나중에 다시 시도해봐야될듯
'보안 > Web hacking' 카테고리의 다른 글
[Dreamhack] Fly me to the moon (0) | 2025.01.20 |
---|---|
[Dreamhack] Relative Path Overwrite Advanced (0) | 2025.01.19 |
[h4ckingga.me] Simple Calculator (0) | 2025.01.09 |
[Dreamhack] LiteBoard (0) | 2025.01.04 |
[Dreamhack] Safe Input (0) | 2025.01.02 |