🕵️ XSS-4 문제 풀이: 필터링 규칙을 찾아 우회하는 기법
XSS 문제를 풀다 보니 한 가지 재미있는 사실을 알게 되었다. 여러 문제가 하나의 게시판 시스템을 공유할 경우, 근본적인 취약점은 같더라도 단계별로 필터링 규칙이나 HTML Entity 처리 방식만 조금씩 달라진다는 점이다. 이번 4번 문제는 '키워드 필터링'을 어떻게 뚫을 것인가가 핵심이었다.
1. 첫 번째 난관: 'script' 키워드 필터링
가장 먼저 기본적인 꺽쇠(< >)와 따옴표 테스트를 해봤다. 다행히 이들은 먹히지만, 문제는 script라는 단어가 통째로 필터링되어 사라진다는 것이었다.


<script>
2. 필터링 우회 가설과 검증
여기서 두 가지 가설을 세워봤다.
- 가설 1 (재귀적 구성): 필터가 'script'라는 단어를 찾아 딱 한 번만 지운다면,
scrscriptipt라고 입력했을 때 가운데가 지워지면서 앞뒤 글자가 붙어 다시script가 되지 않을까? - 가설 2 (대소문자 혼용): 필터가 소문자 'script'만 체크한다면,
SCRIPT나sCrIpT처럼 대소문자를 섞어서 보냈을 때 통과될 것이다.
확인 결과, 가설 1의 재귀적 방식이 먹혔다! 하지만 기쁨도 잠시, alert 함수도 필터링되고 있었다.
3. 두 번째 난관: 'alert' 필터링 우회
alert도 필터링된다면 같은 논리를 적용하면 된다. Alealertrt(1)와 같이 작성하거나, 아예 alert 대신 비슷한 역할을 하는 prompt(1) 또는 confirm(1) 함수를 사용하는 방식이다.
실제로 테스트해 보니 두 방식 모두 성공했다. 대문자를 섞는 SCRIPT 방식도 필터링을 가뿐히 통과했다. 이렇게 필터링의 허점을 찾아내면 플래그를 쉽게 획득할 수 있다.
➕ 추가: 알려진 XSS 필터링 우회 기법들
이번 문제에서 쓴 방법 외에도 실제 현업이나 워게임에서 자주 쓰이는 우회 기법들을 정리해 둔다.
- 다른 태그와 이벤트 핸들러 사용:
script태그가 아예 금지된 경우 이미지나 SVG 태그를 쓴다.<img src=x onerror=alert(1)><svg onload=alert(1)> - 인코딩 활용: 필터가 일반 텍스트만 검사할 때, HTML Entity(Decimal, Hex)나 URL Encoding을 사용한다.
<a href="javascript:alert(1)">click</a>(여기서 javascript 부분을 엔티티화) - 문자열 함수 활용:
alert라는 글자 자체를 필터링할 때 자바스크립트의eval이나String.fromCharCode를 쓴다.eval(atob('YWxlcnQoMSk='))(Base64 인코딩 활용) - 태그 내 불필요한 공백/주석 삽입: 필터링 엔진의 정규표현식을 깨뜨리는 방식이다.
<scr/**/ipt>alert(1)</script>
💡 보안 분석 및 소감
이번 문제는 "블랙리스트 기반 필터링의 한계"를 명확히 보여준다. 특정 단어를 금지하는 방식은 우회 기법이 너무나 많기 때문에 근본적인 해결책이 될 수 없다.
✅ 해결책 정리
1. 화이트리스트 필터링: 허용된 안전한 태그나 속성만 남기고 나머지는 모두 제거하는 방식이 훨씬 안전하다.
2. 라이브러리 활용: 직접 필터링 로직을 짜기보다는 DOMPurify 같은 검증된 XSS 방어 라이브러리를 사용하는 것이 좋다.
3. CSP 도입: 인라인 스크립트 실행을 금지하는 보안 정책을 설정하면 이런 우회 기법들이 무용지물이 된다.
단순히 막는 것보다 어떻게 뚫을지 고민하는 과정에서 필터링의 허점이 더 잘 보이는 것 같다. 이제 다음 단계로 넘어가 보자! 끝~
'해킹스터디' 카테고리의 다른 글
| [Normaltic 웹해킹 입문] 9주차 문제풀이 XSS-6 (0) | 2025.12.31 |
|---|---|
| [Normaltic 웹해킹 입문] 9주차 문제풀이 XSS-5 (0) | 2025.12.31 |
| [Normaltic 웹해킹 입문] 9주차 문제풀이 XSS-3 (0) | 2025.12.30 |
| [Normaltic 웹해킹 입문] 9주차 문제풀이 XSS-2 (0) | 2025.12.30 |
| [Normaltic 웹해킹 입문] 9주차 문제풀이 XSS-1 (1) | 2025.12.30 |