문제 링크
https://portswigger.net/web-security/sql-injection/blind/lab-time-delays
목표 & 사용 도구
목표: SQL Injection 취약점을 이용하여 10초 딜레이를 시키는 것입니다.
사용도구: Burp Suite
문제 풀이 - Lab: Blind SQL injection with time delays
- 문제 사이트에 접속하여 문제를 확인합니다. tracking cookie를 사용 중이며 해당 cookie를 통해 SQL query로 질의를 하고 있다는 것을 알 수 있고 SQL query로 질의를 했을 때의 결과 값 리턴이 따로 없다고 합니다. 마지막 부분을 읽어보면 SQL injection 취약점을 이용해 10초 딜레이를 시켰을 때 해당 문제를 해결할 수 있다는 것을 알 수 있습니다. ACCESS THE LAB을 클릭합니다.

- LAB에 접속했을 때의 요청 및 응답을 Burp Suite를 사용해 취득한 뒤 TrackingId 쿠키가 설정되어 있는 것을 확인합니다.

- 문제에서 설명했듯이 TrackingId 쿠키는 SQL query 문을 수행하는데 사용되고 있기 때문에 해당 sql query 문 조건식이 참이 되도록 하는 sql query 문을 구성하여 요청을 보냅니다. (Burp Suite의 Repeater 기능 사용)

- sql query 문 조건식 결과가 거짓이 되는 sql query 문을 구성하여 요청을 보냅니다. 이때 참, 거짓에 대한 응답을 각각 살펴보면 다른 점이 없었고 응답 결과가 다름을 이용하여 DB data를 추출하는 작업을 할 수 없는 상황인 것을 알 수 있습니다.

- 참, 거짓 응답 결과를 통해 data를 추출할 수 없기 때문에 Time-based SQL Injection을 시도해 볼 수 있습니다. Time delay가 발생하도록 sql query 문을 구성하여 요청을 보내보면 약 10초 정도 Time delay가 발생한 것을 볼 수 있습니다.
[페이로드(입력 값)]
| 페이로드: TrackingId=O0USgNjnXDZcKeUZ' || pg_sleep(10)--; [설명] Blind SQL Injection을 시도할 때 참, 거짓에 따른 응답 결과가 동일하거나 응답 결과를 통해 data를 추측할 수 없는 상황이면 Time-based SQL Injection을 시도해 볼 수 있습니다. 각 DB마다 Time delay를 발생시키는 함수 및 문법이 다르기 때문에 문제를 풀 때 각 DB의 SQL query 문법에 맞춰서 Time-based SQL Injection을 시도해야합니다. 해당 LAB 문제의 경우 페이로드를 통해 PostgreSQL을 사용중 인것을 알 수 있었습니다. * 페이로드 분석 PostgreSQL 에서 || 은 문자열을 연결해 주는 연산자 입니다. ~~~' || pg_sleep(10)을 하게되면 문자열을 연결하기 전에 pg_sleep(10)을 보고 Time을 delay 시키게 됩니다.(10이므로 10초) 이때 pg_sleep(10)의 반환 값은 void이며 값이 없는 상태이지만 함수가 실행되기 때문에 Time delay가 발생하는 것입니다. 마지막 주석 -- 은 문법을 파괴하지 않기 위해서 입력한 값입니다. * Time delay 확인 하는 법 Burp Suite의 Repeater 기능을 이용하여 요청을 보내면 우측 하단에 시간이 나오며 이를 통해 Time delay가 발생했는지 알 수 있습니다. Bure Suite 우측하단을 보면 10,350 millis로(약 10초) Time delay가 발생한 것을 알 수 있습니다. |

- 이후에 웹 페이지로 돌아가보면 문제 요구에 맞게 10초 Time delay를 발생시켰기 때문에 문제를 성공적으로 해결하게 됩니다.

+) 주석을 사용하지 않은 페이로드입니다.

[페이로드(입력 값)]
| 페이로드: TrackingId=O0USgNjnXDZcKeUZ' || pg_sleep(10) and '1'='1; [설명] O0USgNjnXDZcKeUZ' 에서 싱글 쿼터는 사용자가 입력한 값이며 사용자가 직접 문자열을 감싼 상태이므로 실제로는 O0USgNjnXDZcKeUZ'' 즉 기존에 있던 싱글 쿼터 하나가 남게 됩니다. 앞선 과정에서는 주석을 이용하여 마지막 싱글 쿼터를 인식하지 못하게 하여 문법 에러가 발생하지 않도록 했지만 만약 주석을 사용하지 못하는 상황이라면 and '1'='1 과같이 조건이 항상 참이 되도록 하여 주석 처리를 하지 않고도 마지막에 남은 싱글 쿼터를 처리할 수 있습니다. ex) select ___ from ___ where ___='O0USgNjnXDZcKeUZ' || pg_sleep(10) and '1'='1' |
'[WEB] CTF & Wargame > PortSwigger Web Security Academy' 카테고리의 다른 글
| Lab: SSRF with blacklist-based input filter (0) | 2026.06.23 |
|---|---|
| Lab: SSRF with filter bypass via open redirection vulnerability (0) | 2026.06.21 |
| Lab: SQL injection UNION attack, retrieving multiple values in a single column (0) | 2026.06.18 |
| Lab: Web cache poisoning with an unkeyed header (0) | 2026.05.02 |
| Lab: Blind SQL injection with time delays and information retrieval (1) | 2026.04.25 |
| Lab: Blind SQL injection with conditional errors (0) | 2026.03.27 |

















































