CTF/포렌식

[2020CCE] Web Log - 포렌식 / Blind SQL Injection

SecurityMan 2022. 10. 28. 11:00

 

2020년에 진행되었던 국정원 주최 사이버공격방어대회

 

묵혀놨던 Write Up을 이제야 포스팅 해 본다.

 

반응형

 

이번에 풀이할 문제는 Web Log 이다.

 

문제 제목처럼 정직하게 Web Access Log를 분석하는 문제이다.

 

 

문제파일로 access.log 파일이 주어진다.

 

 

파일 크기가 63.1MB로 꽤 크다..

 

 

실제로 Subline Text를 이용해 파일을 열어보면

 

305,077개의 로그가 있는것을 볼 수 있다.

 

 

여기저기 스크롤 옮겨가며 둘러보다가

 

265,847번째 줄에서 특이한 로그를 발견했다.

 

/image_view.php?idx=1 and if(ascii(substr((select flag from flag),1,1))=32, (select 1 union select 2), 0)

 

URL로 이렇게 요청을 하는데,

 

누가봐도 Blind SQL Injection 공격이다.

 

flag 테이블에서 flag 컬럼을 가져와 substr 로 맨 앞글자를 잘라내고,

 

잘라낸 글자를 ascii 코드로 바꿔서 그 값이 32와 같은지 비교하고있다.

 

Blind SQL Injection 은 이렇게 쿼리의 참/거짓 결과만을 이용해 데이터를 추출하는 공격이다.

 

 

조금만 내려보면 어떤 페이로드가 참이고 거짓인지 금방 알 수 있다.

 

select flag from flag의 첫번째 글자가 아스키 코드로 99일때,

 

다른 패킷의 응답코드가 200인 것과 다르게 응답코드가 500 으로 나오는 것일 볼 수 있다.

 

그리고나서 첫번째 글자에 대한 비교를 더이상 수행하지 않고,

 

substr((select flag from flag),2,1) 로 두번째 글자로 넘어가는 모습이 보인다.

 

그럼 간단하게 500 응답코드가 난 패킷의 아스키 코드값을 다 모아주면

 

플래그를 완성할 수 있을 것이다.

 

f = open('access.log', 'r')

flag = ''

while True:
    line = f.readline()
    if 'flag' in line:
        if 'HTTP/1.1" 500' in line:
            tmp = line.split('=')[2]
            flag += chr(int(tmp[:3].replace(',','')))
            print(flag)

 

플래그가 34글자 밖에 안돼서 그냥 일일이 세도 되지만

 

파이썬 연습할 겸 코드로 한번 작성해봤다.

 

access.log 파일을 한줄씩 읽어들여서

 

해당 line에 flag 와 HTTP/1.1" 500 이라든 단어가 포함되어 있으면

 

URL에서 ASCII 코드 부분을 추출해오는 코드이다.

 

 

코드를 실행시키면 이렇게 플래그를 찾을 수 있다.

반응형