입력하신 문자열은 SQL 인젝션 공격 벡터로 보입니다. 분석과 방어 권고를 아래에 정리해 드립니다.
무엇을 시도하는지
- 페이로드: Cvg0Aii4')) OR 740=(SELECT 740 FROM PG_SLEEP(15))--
- 의미: 닫히지 않은 문자열/괄호를 통해 쿼리 논리를 조작하고, OR 조건으로 항상 참이 되거나(또는 타임 지연 조건을 삽입하여) 데이터베이스 서버를 지연시켜 응답 시간을 통해 참/거짓을 추측하는 타임 기반 블라인드 SQL 인젝션 공격입니다.
- PG_SLEEP(15)는 PostgreSQL 함수로 15초간 쿼리 실행을 지연시킵니다. 서버가 지연되면 공격자는 쿼리 결과를 추론할 수 있습니다. 공격 시도는 서비스 거부(성능 저하) 또는 민감정보 추출의 전초가 됩니다.
보안 권고(우선 순위)
- 파라미터화된 쿼리(Prepared statements) 사용
- 쿼리에 사용자 입력을 직접 연결하지 말고 바인딩 매개변수로 전달하세요. 대부분의 DB 드라이버와 ORM이 지원합니다.
- 예 (Python/psycopg2):
cursor.execute("SELECT * FROM users WHERE email = %s", (email,))
- 입력 검증 및 화이트리스트
- 허용되는 형식(예: 이메일, 숫자, 특정 길이/문자셋)만 통과시키고 나머지는 차단하세요.
- 최소 권한 원칙
- 애플리케이션이 연결하는 DB 계정은 필요한 권한(SELECT/INSERT 등)만 가지게 하세요. DDL/DCL 권한은 제거합니다.
- DB 타임아웃 및 리소스 제한 설정
- PostgreSQL의 statement_timeout 등을 설정해 긴 지연을 초래하는 쿼리를 자동으로 중단하도록 하세요.
- 웹 애플리케이션 방화벽(WAF) 및 탐지
- 의심스러운 패턴(예: PG_SLEEP, sleep, SELECT ... FROM) 또는 비정상 지연을 탐지/차단하도록 설정하세요.
- 로그 및 모니터링
- 비정상 요청(특히 동일 IP에서의 반복 시도)과 DB 쿼리 지연을 로깅하고 경고를 설정하세요.
- ORM/라이브러리 사용
- 직접 문자열 결합으로 쿼리를 만들지 않도록 ORM 또는 검증된 DB 라이브러리를 사용하세요.
- 정기적 보안 점검
- 자동화된 취약점 스캐닝 및 펜테스트로 SQL 인젝션 취약점을 주기적으로 점검하세요.
추가 방어 팁(빠른 적용 가능)
- 입력에서 특정 키워드(PG_SLEEP, sleep, benchmark 등)를 차단하거나 이스케이프 처리(단, 완전한 해결책 아님).
- 쿼리 로그를 확인해 해당 페이로드로 인한 시도 및 영향을 조사하고, 의심 IP를 차단하세요.
요약
- 해당 문자열은 타임 기반 SQL 인젝션 시도로 DB 지연을 유발하여 정보를 추출하려는 공격입니다. 즉시 파라미터화된 쿼리와 입력 검증, 최소 권한, DB 타임아웃, WAF 및 모니터링을 적용해 방어해야 합니다.