이 문제는 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로 인식하는 듯하다.


그런데 그게 아니다. 곰곰이 동작원리를 생각해보면 이유를 알 수 있다.