[Write-Up] PortSwigger - SQL Injection Vulnerability in WHERE Clause Allowing Retrieval of Hidden Data
목차
문제 분석
난이도:
APPRENTICE
Lab: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data
제품 카테고리 필터에 SQL Injection 취약점이 존재하며, 서버에서 사용되는 쿼리는 다음과 같다고 안내한다.
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
SQL Injection을 통해 하나 이상의 미출시 제품이 노출되도록 만들면 문제가 해결된다.
SQL Injection 진단
웹에 접근해 카테고리를 선택하면 filter?category=Lifestyle 과 같은 형식으로 카테고리를 조회하는 것을 확인할 수 있다.
해당 파라미터에 SQL Injection이 발생하는지 확인하기 위해 ' 문자를 삽입해본다.

' 를 삽입하면 500 에러가 발생하며, 삽입한 문자로 인해 SQL 구문이 정상적으로 처리되지 못했음을 추측할 수 있다.
익스플로잇
원본 쿼리가 SELECT * FROM products WHERE category = 'Gifts' AND released = 1 이고 주입 지점이 category 이므로, 다음과 같이 페이로드를 구성한다.
' OR 1=1 --
문제에서 미출시 제품을 노출시키라고 했으므로, OR 1=1 로 모든 행이 조건을 만족하도록 만들고, 주석(--)으로 뒤에 남는 released = 1 조건을 제거한다. 이때 -- 뒤의 공백까지 포함해야 주석이 정상적으로 처리된다.
주입 후 최종적으로 완성되는 쿼리는 다음과 같다.
SELECT * FROM products WHERE category = 'Gifts' OR 1=1 -- ' AND released = 1

미출시 제품을 포함한 모든 제품이 노출되며 문제가 해결된다.
정리
' OR 1=1 -- 는 조건을 항상 참으로 만들고 뒤에 남는 조건을 주석으로 제거하는, 가장 기본적인 형태의 SQL Injection 페이로드다.
다만 OR 1=1 은 테이블 전체를 반환하게 만드는 Aggressive Payload이므로, 실제 진단에서는 반환 범위를 좁히거나 주석에 의존하지 않는 비파괴적 구문을 우선 고려하는 편이 안전하다.
