지식로그
MKBjudAC') OR 208=(SELECT 208 FROM PG_SLEEP(15))--

[질문] MKBjudAC') OR 208=(SELECT 208 FROM PG_SLEEP(15))--

2024.11.22. 04:38:51 | 문서번호: 20916

전체 답변:
[무물보AI]

입력하신 문자열은 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 인젝션. 조건이 참(또는 지연이 발생)인지 여부로 인해 애플리케이션의 응답 지연을 통해 취약 여부를 판단하려는 목적입니다.

위험성

  • 데이터 노출 외에도 서비스 가용성(응답 지연/성능 저하)을 악화시킬 수 있습니다.
  • 추가적인 악성 페이로드로 확장하면 인증 우회, 데이터 변경, 원격 명령 실행 등의 심각한 피해로 이어질 수 있습니다.

권장 대응 및 완화 방법

  1. 입력 값에 대해 절대 쿼리 문자열을 직접 결합하지 마십시오.
  2. 항상 준비된 쿼리(Prepared Statements) 혹은 매개변수화된 쿼리를 사용하십시오.
  3. ORM을 사용하면 많은 경우 자동으로 매개변수화를 지원하므로 활용을 권장합니다.
  4. 최소 권한 원칙: DB 계정에 불필요한 권한(예: SUPERUSER, CREATE, DROP 등)을 부여하지 마십시오.
  5. DB 레벨 타임아웃 설정: PostgreSQL의 statement_timeout 같은 설정으로 쿼리 실행 시간을 제한하십시오.
  6. 웹 방화벽(WAF) 및 탐지 시스템을 통해 의심스러운 패턴(예: PG_SLEEP, SLEEP, '--')을 모니터링/차단하십시오.
  7. 입력 유효성 검증 및 화이트리스트 적용(특히 ID, 숫자 등 단순 값의 경우).
  8. 로깅과 모니터링으로 비정상적인 지연이나 반복 시도를 탐지하십시오. 예시(안전한 구현)
  • 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에 지연을 유발하는 공격이므로 절대 신뢰할 수 없는 입력을 그대로 쿼리에 넣지 마시고 위 권장 사항들을 적용해 주십시오.
댓글 달기:
이전 질문:
ㄴ [질문] 그런데 무슨일

다음 질문:

비밀번호를 입력하세요.