← 전체 학습 경로
CASE 05 · 중급

UNION으로 숨은 행 꺼내기

비회원 방문자 상태로 Helios Supply Catalog의 검색 기능을 블랙박스 점검하세요. 브라우저 개발자 도구나 로컬 프록시를 사용해 검색 요청과 오류 응답을 관찰할 수 있습니다. 공개 상품 정보가 아닌 지정된 내부 승인 메모 한 건을 검색 결과에서 재현하고, 그 이상 데이터는 열람하지 마세요.

CLIENT헬리오스 카탈로그
TARGET SERVICEHelios Supply Catalog
TARGET ADDRESShttps://wargame.hanplanet.com/helios/products
ESTIMATED TIME45 MIN
CLIENT DOSSIER

의뢰 배경

헬리오스 산업유통은 B2B 고객에게 소모품 카탈로그를 공개합니다. 신규 상품 공개 점검 중 검색 결과 영역에 상품이 아닌 구매 승인 메모 일부가 나타났다는 신고가 접수됐습니다. 신고자는 로그인하지 않은 방문자였고, 메모에는 공급가 협상 정보가 포함될 수 있어 내일 카탈로그 공개 전에 비상품 데이터 노출 여부를 확인해야 합니다.

MISSION OBJECTIVE

이번 목표

비회원 상품 검색 결과에 지정된 내부 승인 메모가 노출될 수 있음을 재현하고 응답 증거를 확보하세요.

  • UNION으로 합치는 SELECT가 같은 열 개수와 호환 자료형을 가져야 함을 확인한다.
  • NULL과 ORDER BY를 이용해 원래 결과의 형태를 추론한다.
  • 인젝션이 인증 우회를 넘어 데이터 유출로 이어지는 경로를 설명한다.
TECHNICAL BRIEFING

학습 노트 · UNION 기반 SQLi는 원래 화면이 표시하는 열을 다른 테이블의 데이터를 운반하는 통로로 바꿉니다.

UNION은 두 SELECT의 결과 집합을 위아래로 합칩니다. 따라서 양쪽 SELECT의 열 개수가 같고 각 위치의 자료형이 호환되어야 합니다. 먼저 원래 쿼리의 모양을 알아내는 이유입니다.

ORDER BY 번호를 늘려 오류가 나는 지점을 찾거나 UNION SELECT에 NULL을 하나씩 추가해 열 개수를 추론할 수 있습니다. NULL은 여러 자료형과 호환되어 구조를 시험하기에 편리합니다.

실제 서비스에서는 DB 계정에 최소 권한을 주고, 상세 오류를 노출하지 않으며, 무엇보다 모든 사용자 입력을 prepared statement로 바인딩해야 합니다. 오류 비공개는 정보 노출을 줄이지만 안전한 쿼리 바인딩을 대신하지 않습니다.

단계목적성공 신호
열 개수 확인원래 SELECT의 폭 파악특정 ORDER BY 번호부터 오류
NULL 배치UNION 결과 모양 맞춤검색 결과가 정상 렌더링
문자열 위치 확인화면에 표시되는 열 선택테스트 문자열 출력
내부 자료 1건 확인오류에서 확인한 승인 메모 조회운영 메모가 상품 행으로 표시
-- 원래 검색의 두 출력 열
SELECT name, price
FROM products
WHERE name LIKE '%<입력값>%';

-- 구조를 학습하기 위한 일반 예시
UNION SELECT NULL, NULL
UNION SELECT title, body FROM <내부_메모_테이블>
FIELD REFERENCES

더 깊이 읽기

실습 전후에 공식 문서와 보안 아카데미 자료로 개념을 교차 확인하세요.

PROGRESSIVE HINTS

막혔을 때만 열기

다음 단서가 필요할 때만 한 단계씩 확인하세요.

힌트 1 · 결과의 폭

ORDER BY 뒤 숫자를 늘려 보며 몇 번째 열에서 오류가 나는지 확인하세요.

힌트 2 · NULL로 모양 맞추기

원래 SELECT는 두 열을 반환합니다. UNION SELECT에 같은 수의 NULL을 배치하세요.

힌트 3 · 지정 메모 한 건

검색 오류와 응답에서 확인한 구매 승인 메모의 테이블·열 이름을 사용해, 의뢰가 지정한 한 건만 두 출력 위치에 맞추세요.

선행 의뢰가 잠겨 있습니다

이전 단계를 완료하면 자동으로 의뢰 메일과 실습 환경이 열립니다.

로그인 후 실습