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초가 걸렸습니다.
SELECT * FROM EMPLOYEE WHERE id = 'glasses1' or id = 'glasses2' order by id, sleep(1)
데이터가 2개가 조회될 경우 약 2.6초가 걸렸습니다.
SELECT * FROM EMPLOYEE WHERE id = 'glasses1' or id = 'glasses2' or id = 'glasses3' order by id, sleep(1)
데이터가 3개가 조회될 경우 약 3.6초가 걸렸습니다.
사진이 잘못올렸네요…
reason
솔직히 이유를 잘 모르겠습니다. mysql에서 레코드를 하나씩 읽어드리면서 정렬 할때 sleep 구문도 같이 들어가서 쿼리는 한개여도 정렬하면서 여러번 도는건가? 이유를 아시는분은 댓글 부탁드립니다ㅠㅠㅠ