2013-04-28 1 views
0

:블라인드 SQL 인젝션 - 필드 내가 <code>ORDER BY</code> 절에이 블라인드 SQL 인젝션을 사용했다

(CASE WHEN 1 THEN col1 ELSE col2 END) 

그것은이 같은 쿼리를 생성 할 것이다는 :

SELECT x FROM y ORDER BY (CASE WHEN 1 THEN col1 ELSE col2 END) ASC 

이 주입 성공 및 I 흰색으로 ORDER BY 절에 모든 열 이름을 나열하십시오.

다른 엔드 필드에서 유사한 주입을 사용할 수 없습니다. 그것은 그것이 가능하고 그 들판들에 화이트리스트가 있어야하는지 궁금하게 남겨 뒀다.

나는 주사의이 종류를 시도했지만 성공하지 않은 :

SELECT x FROM y ORDER BY col1 (CASE WHEN 1 THEN DESC ELSE ASC END) 
SELECT x FROM y ORDER BY col1 DESC LIMIT (CASE WHEN 1 THEN 1 ELSE 0 END), 0 
SELECT x FROM y ORDER BY col1 DESC LIMIT 0, CAST((CASE WHEN 1 THEN 1 ELSE 0 END) AS SIGNED) 

아마 나는 화이트리스트 또는 단지 안전을 위해 DESC/ASC 필드와 LIMIT 변수를 열거해야합니까? MySQL을 사용하고 있습니다. 어쩌면 이러한 주입은 다른 DBMS에서도 가능할 것입니까?

답변

1

SELECT syntax definition을 보면 대답 할 수 있습니다. 그것이 expression 때문에

ORDER BY {col_name | expr | position} [ASC | DESC], ... 

첫 번째 예에서 (CASE WHEN 1 THEN col1 ELSE col2 END) 작동 : 같이 ORDER BY 절은 정의된다. 그러나 DESCASC은 고정 토큰이 아닌 표현식의 일부가 아닙니다.

LIMIT {[offset,] row_count | row_count OFFSET offset} 

다시 ROW_COUNT 오프셋이 표현 중 하나이지만 숫자 만하지 :

LIMIT는 하나 또는 두 개의 걸립니다 것과 유사

LIMIT 절 정의 숫자 인수. 음수가 아닌 정수 상수 여야합니다. [...]