Home SQL Injection Sleep() is Danger..
Post
Cancel

SQL Injection Sleep() is Danger..

Sleep() 함수를 이용하여 SQLi 공격을 수행할 때 조심해야 하는 부분을 알아봅시다.


Time Based SQL Injection SLEEP

모의해킹 업무를 수행할 때 Time Based SQL Injection이 가능한 경우 sleep() 함수를 이용하여 응답 간의 차이를 이용하여 DB를 뽑아올 수 있습니다.

하지만 order by 절에서 sleep() 함수를 사용할 때 조심해야 합니다!!!!

MYSQL의 경우 쿼리에서 SLEEP() 함수를 사용할 때 조회된 데이터의 개수만큼 SLEEP()이 반영이 됩니다. 그렇기 때문에 데이터 조회가 1만개라고 했을 때 select * from user order by id, sleep(1) 되면 약 1만초가 먹히게됩니다


MYSQL order by SLEEP()

실제로 sleep() 함수가 데이터 조회 개수만큼 도는지 확인해봅시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- create
CREATE TABLE EMPLOYEE (
  empId INTEGER PRIMARY KEY,
  id TEXT NOT NULL,
  name TEXT NOT NULL
);

-- insert
INSERT INTO EMPLOYEE VALUES (0001, 'glasses1', 'suwon');
INSERT INTO EMPLOYEE VALUES (0002, 'glasses2', 'samsung');
INSERT INTO EMPLOYEE VALUES (0003, 'glasses3', 'Blue Wings');

-- fetch 
SELECT * FROM EMPLOYEE WHERE id = 'glasses1' order by id, sleep(1)
SELECT * FROM EMPLOYEE WHERE id = 'glasses1' or id = 'glasses2' order by id, sleep(1)
SELECT * FROM EMPLOYEE WHERE id = 'glasses1' or id = 'glasses2' or id = 'glasses3' order by id, sleep(1)

테스트 코드는 데이터 조회가 1개일때, 2개일때, 3개일때 sleep(1)초를 하여 응답 시간을 알아봅시다. SQL online test에서 조회 응답 시간 차이가 얼마나 되는지 알아봅시다.

조회 결과

SELECT * FROM EMPLOYEE WHERE id = 'glasses1' order by id, sleep(1) 데이터가 1개가 조회될 경우 약 1.5초가 걸렸습니다.

1.5초

SELECT * FROM EMPLOYEE WHERE id = 'glasses1' or id = 'glasses2' order by id, sleep(1) 데이터가 2개가 조회될 경우 약 2.6초가 걸렸습니다.

2.6초

SELECT * FROM EMPLOYEE WHERE id = 'glasses1' or id = 'glasses2' or id = 'glasses3' order by id, sleep(1) 데이터가 3개가 조회될 경우 약 3.6초가 걸렸습니다.

2.6초

사진이 잘못올렸네요…

reason

솔직히 이유를 잘 모르겠습니다. mysql에서 레코드를 하나씩 읽어드리면서 정렬 할때 sleep 구문도 같이 들어가서 쿼리는 한개여도 정렬하면서 여러번 도는건가? 이유를 아시는분은 댓글 부탁드립니다ㅠㅠㅠ