입력하신 문자열은 SQL 인젝션 공격 패턴으로 보입니다. 구성과 의도, 위험성 및 대응 방안을 아래와 같이 정리해 드립니다.
무엇을 하는 문자열인가
- 원문: MKBjudAC') OR 208=(SELECT 208 FROM PG_SLEEP(15))--
(HTML 엔티티 ' 는 작은따옴표 ' 로 해석됩니다.)
- 해석 예: "MKBjudAC') OR 208=(SELECT 208 FROM PG_SLEEP(15))--"
- 동작:
- 작은따옴표로 기존 쿼리의 문자열 리터럴을 닫고 OR 절을 삽입합니다.
- 208=(SELECT 208 FROM PG_SLEEP(15)) 부분은 PostgreSQL의 PG_SLEEP(15)을 호출하여 해당 쿼리를 15초 동안 지연시킵니다.
- "--" 는 나머지 쿼리를 주석 처리합니다.
- 의도: 타임 기반 블라인드 SQL 인젝션. 조건이 참(또는 지연이 발생)인지 여부로 인해 애플리케이션의 응답 지연을 통해 취약 여부를 판단하려는 목적입니다.
위험성
- 데이터 노출 외에도 서비스 가용성(응답 지연/성능 저하)을 악화시킬 수 있습니다.
- 추가적인 악성 페이로드로 확장하면 인증 우회, 데이터 변경, 원격 명령 실행 등의 심각한 피해로 이어질 수 있습니다.
권장 대응 및 완화 방법
- 입력 값에 대해 절대 쿼리 문자열을 직접 결합하지 마십시오.
- 항상 준비된 쿼리(Prepared Statements) 혹은 매개변수화된 쿼리를 사용하십시오.
- ORM을 사용하면 많은 경우 자동으로 매개변수화를 지원하므로 활용을 권장합니다.
- 최소 권한 원칙: DB 계정에 불필요한 권한(예: SUPERUSER, CREATE, DROP 등)을 부여하지 마십시오.
- DB 레벨 타임아웃 설정: PostgreSQL의 statement_timeout 같은 설정으로 쿼리 실행 시간을 제한하십시오.
- 웹 방화벽(WAF) 및 탐지 시스템을 통해 의심스러운 패턴(예: PG_SLEEP, SLEEP, '--')을 모니터링/차단하십시오.
- 입력 유효성 검증 및 화이트리스트 적용(특히 ID, 숫자 등 단순 값의 경우).
- 로깅과 모니터링으로 비정상적인 지연이나 반복 시도를 탐지하십시오.
예시(안전한 구현)
Python (psycopg2) 예:
conn.cursor().execute("SELECT * FROM users WHERE id = %s", (user_id,))
Node.js (pg) 예:
client.query('SELECT * FROM users WHERE id = $1', [userId])
PHP (PDO) 예:
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $id]);
PostgreSQL 설정 권장 예
- statement_timeout 설정 (예: 5초):
SET statement_timeout = '5s';
또는 postgresql.conf에서 기본값 설정
마무리
- 제시하신 문자열은 실행하면 DB에 지연을 유발하는 공격이므로 절대 신뢰할 수 없는 입력을 그대로 쿼리에 넣지 마시고 위 권장 사항들을 적용해 주십시오.