W-02
SQL Injection (데이터 추출)
위험도: 상⚠️ 위험도 근거: UNION 구문으로 DB 전체 데이터 추출 가능
📌 아래 내용이 표준 보고서에 포함되어야 합니다. 자신이 작성한 보고서와 대조하세요.
취약점 개요
📄 표준 내용
검색 기능의 GET 파라미터(q)에 대한 입력값 검증이 미흡하여, UNION SELECT 구문을 이용한 데이터베이스 내 임의 테이블 조회가 가능한 SQL Injection 취약점이 존재함.
발견 내용
📄 표준 내용
[점검 절차] 1단계: 취약 여부 확인 GET /search.php?q=' → SQL 에러 메시지 출력 확인 2단계: 컬럼 수 파악 GET /search.php?q=' ORDER BY 6-- → 정상 GET /search.php?q=' ORDER BY 7-- → 에러 (컬럼 수=6) 3단계: UNION SELECT로 데이터 추출 GET /search.php?q=' UNION SELECT 1,username,password,email,role,created_at FROM users-- [결과] users 테이블의 계정 정보(username, password 평문) 전체 조회 성공
조치 방안
📄 표준 내용
[즉시 조치]
Prepared Statement 적용:
취약: $sql = "SELECT * FROM products WHERE name LIKE '%$keyword%'";
조치: $stmt = $db->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(['%' . $keyword . '%']);
[추가 조치]
- 에러 메시지 사용자 노출 차단
- 실행 쿼리 화면 노출 제거
- WAF 적용