▶ 코드 확인
참 고민하고 풀었지만, 예상외로 허무했던 문제. 핵심은 is_numeric 에 대한 이해인 것 같다.
▶ 풀이
처음에 내가 php 공식 홈페이지에서 읽은 is_numeric에 대한 설명은 다음과 같았다.
'Determines if the given variable is a number or a numeric string.'
주어진 변수가 numeric string인지 판단한단다. 아래 예시를 보면 좀 더 명확해진다.
여기서 생각한건 헥스값으로 no를 입력해서 개행시키고 숫자의 대소를 비교하는 식으로 풀이하는 줄 알았다. 그러나..
select id from prob_red_dragon where id=''||no>%23' and no=0x0a3939 |
와 같이 입력하면, 0x를 numeric으로 인식하지 않는다. 이유는 모르겠다..
유연한 사고가 필요한 시점인 것 같아서, 며칠동안 계속 생각해봤다. 그런데 실마리는 어이없는 곳에서 찾았는데..
아까 보여준 php의 is_numeric 예시1번 바로 아래에 있는 예시2번이다. white space를 앞에 붙이면 is_numeric이 숫자로 인식한다고 한다. 여기서 간단히 %0a(Line Feed)를 앞에 붙이면 bypass할 수 있을 것 같다.
어이가 없게도 URL인코딩된 line feed를 앞에 붙여서 bypass할 수 있는 문제였다.
select id from prob_red_dragon where id=''||no>%23' and no=%0a{injection point} |
{injection point}에 숫자를 넣어가며 숫자를 판단할 수 있다. 사실 숫자같은 경우 자릿수만 알면 금방 구할 수 있기 때문에, 굳이 자동화를 할 필요를 못느꼈고, 수작업으로 클리어했다. 이리저리 숫자를 넣어보다 보면 다음과 같이 답을 구할 수 있다.
딱 정답인 수를 넣으면, Hello admin을 출력하지 않는 것은 당연하게 생각해볼 수 있다. 이제 우리가 할일은 간단히 저 값을 no에 넣기만 하면 된다.
'write-ups > Lord of SQL Injection' 카테고리의 다른 글
LORD OF SQLINJECTION - green_dragon (0) | 2023.01.22 |
---|---|
LORD OF SQLINJECTION - bugbear (0) | 2023.01.18 |
LORD OF SQLINJECTION - darkknight (0) | 2023.01.01 |
LORD OF SQLINJECTION - golem (0) | 2022.12.05 |
LORD OF SQLINJECTION - Skeleton (0) | 2022.11.30 |
댓글