[sql injection]sql injection을 위한 union과 order by

2020. 11. 5. 23:13web_hacking

[sql injection] sql injection을 위한 union과 order by

 

sql injection에서 자주 사용하는 UNION과 order by를 알아보겠습니다.

 

UNION

union 연산자를 사용하면 두개 이상의 SELECT 결과를 하나의 결과로 결합할 수 있습니다. 하지만 union을 사용하기 위한 조건이 있는데요 union을 사용하기 위해서는 union을 사용하여 결합된 결과가 모두 같은 구조를 가져야 합니다. 열의 개수가 같아야 하고 결과의 열은 호환되는 데이터의 형식을 가져야 합니다. 더 쉽게 말하자면 그냥 union 은 select에서 검색된 결과를 하나의 결과로 만들어 주는 연산자이고 union과 union all이 있습니다. 이 둘의 차이점은 union은 중복을 제외한 결과만을 나타내지만 union all은 중복을 포함해서 모든 결과의 합을 나타냅니다.

union의 문법은 다음과 같습니다.

[SQL문]
UNION
[SQL문];

union all의 문법은 다음과 같습니다.

[SQL문]
UNION ALL
[SQL문];

 

-Order By

order by는 sql injection중 칼럼의 개수를 확인할 때 활용할 수 있는 구문입니다. order by는 데이터 정렬에 사용되고 지정한 칼럼을 기전으로 해서 오름차순 또는 내림차순으로 정렬해줍니다. order by는 칼럼명, 표현식, 위치 중의 하나를 대상으로 지정해서 오름차순 또는 내림차순으로 정렬합니다. 하지만 정렬 방식을 생략하면 기본으로 오름차순으로 정렬이 됩니다. sql injection에서 칼럼의 개수를 확인할 때는 칼럼의 위치를 지정해서 사용합니다. order by 11이라고 sql을 넣었을 때 취약한 소스코드라면 정상 페이지가 출력됩니다. 그리고 order by 12라고 입력했을 때 DB에러 메시지가 나오는데 DB에러 메시지가 12번째 칼럼은 없다는 내용으로 나온다면 앞의 SELECT구절에 11개의 칼럼이 있다는 의미가 됩니다. 그리고 가끔 예외가 있을 수도 있으니 12에서 오류가 발생해도 13,14까지 확인하는 것이 정확합니다.