딱히 필터링 없음
id값이 7자 이내여야함
주어진 쿼리문이다.
$query = "select id from prob_red_dragon where id='{$_GET['id']}' and no={$no}";
이것만 보면 상당히 간단해보이는 문제다.
no를 맞춰주는 것이 목표이기 때문에, id값을 닫아주고 뒷부분을 주석으로 날려준 후 $no는 개행해주면 된다.
이전에 마주친 적이 있었던 것 같은 문제다.
이 경우의 페이로드 예시는 다음과 같다.
[1] id 페이로드
'||no=%23
[2] pw 페이로드
%0a[비교할숫자]
페이로드에 의해 변조된 쿼리문은 다음과 같아진다.
$query = "select id from prob_red_dragon where id=''||no=#' and no=
[비교할숫자]";
따라서, no=[비교할숫자] 일 시 Hello admin이 출력된다.
기다리다보면 나타나겠지의 심산으로
자동화 도구를 이용해 0부터 하나하나 올라가봤지만... 시간이 아무리 지나도 답을 뱉지 않았다.
이유를 고민해보니... 아무래도 엄청 큰 수인 것 같았다.
때문에 no의 대략적인 범위를 찾아내는 것으로 접근 방법을 바꿨다.
새로운 접근의 페이로드 예시는 다음과 같다.
[1] id 페이로드
'||no>%23
[2] pw 페이로드
%0a[비교할숫자]
먼저, url에 직접 페이로드를 전달하여 대략적인 자릿수를 알아내고자 했다.
그 결과...
찾고 있는 숫자가 무려 500000000대라는 이보다 대략적일 수 없는 정보를 얻었다.
이진탐색을 적용한다고 해도 터무니 없이 큰 숫자다.
별 수 없이 위에서부터 한자리씩 숫자를 바꿔가며 범위를 찾고 있자니...
상당히 찝찝했지만 이틀 밤을 샌 관계로 더 이상은 한계였다...
그냥 내려놓고 찾기로 했다.
한참을 찾은 끝에...
586482013에서는 뜨는 admin이
586482014에서는 뜨지 않는 것을 발견했다!
이로써 답은 586482014
임을 확신할 수 있었다...