본문 바로가기
write-ups/Lord of SQL Injection

LORD OF SQLINJECTION - red_dragon

by 끊임없는정진 2023. 1. 25.

▶ 코드 확인

Lv. red dragon

 

참 고민하고 풀었지만, 예상외로 허무했던 문제. 핵심은 is_numeric 에 대한 이해인 것 같다.

 

▶ 풀이

처음에 내가 php 공식 홈페이지에서 읽은 is_numeric에 대한 설명은 다음과 같았다.

 'Determines if the given variable is a number or a numeric string.'

주어진 변수가 numeric string인지 판단한단다. 아래 예시를 보면 좀 더 명확해진다.

hex 형식도 numeric으로 인식하는 is_numeric

 

여기서 생각한건 헥스값으로 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할 수 있을 것 같다.

개행처리가 되어 admin의 정보를 출력하는 모습

 

어이가 없게도 URL인코딩된 line feed를 앞에 붙여서 bypass할 수 있는 문제였다.

select id from prob_red_dragon where id=''||no>%23' and no=%0a{injection point}

{injection point}에 숫자를 넣어가며 숫자를 판단할 수 있다. 사실 숫자같은 경우 자릿수만 알면 금방 구할 수 있기 때문에, 굳이 자동화를 할 필요를 못느꼈고, 수작업으로 클리어했다. 이리저리 숫자를 넣어보다 보면 다음과 같이 답을 구할 수 있다. 

 

 

딱 정답인 수를 넣으면, Hello admin을 출력하지 않는 것은 당연하게 생각해볼 수 있다. 이제 우리가 할일은 간단히 저 값을 no에 넣기만 하면 된다.

 

Lv. red_dragon clear

'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

댓글