[Dreamhack] access-log
2025. 1. 11.

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보다 큰지 확인
  • 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