이 문제는 order by
이하에서 sql injection을 묻는 문제이다.
일반적으로 order by
이하에서는 아래와 같은 기법을 주로 이용한다.
# 1. 컬럼 개수 파악
select * from table order by 1,2,3,4 -- g
select * from table order by 5( or 6) -- g
# 2. 멀티 행으로 인한 에러
select * from table order by (select 1 union select 2)
select * from table order by if(1=1, (select 1), (select 1 union select 2))
이 문제에서는 union
을 사용하지 못하기 때문에 조금은 다른 기법을 사용해야 했다.
문제를 푸는 과정에서 order by
의 예상과는 동작을 발견했다.
(select 0)
을 1
처럼 인식하는 현상이 나타난다.
if 구문에서도 마찬가지이다. 모든 서브쿼리(?)를 1로 인식하는 듯하다.
그런데 그게 아니다. 곰곰이 동작원리를 생각해보면 이유를 알 수 있다.