Bypass XSS Blank filtering with Forward Slash

XSS 테스팅 시 가끔씩 발목을 잡는 친구가 있습니다. 바로 Blank 필터링인데요. 태그 사용이 제한된 상황에선 굉장히 짜증나는 존재죠. (다된 것 같은데..output이 안나오는 상황)

오늘은 이 Blank 필터링을 우회하는 간단한 트릭을 이야기할까 합니다.

Blank Filtering?

먼저 간략하게 Blank Filtering에 대해 이야기하겠습니다. 많은 곳들이 적용한 필터링 방식 중 하나이며 단순히 공백에 대해 처리하는 필터링입니다. 예를들면 이런 케이스죠.

Attack

asd” onload=”alert(45)” a=”

Output

<img src="test.jpg" name="asd"onload="alert(45)"a="">

이렇게 공백에 대해서 날리게 되면 공백이 필요없는 <script> 태그 이외에는 많은 XSS Payload 들이 효력을 잃습니다. 또한 필터링 규칙을 파악했다해도 대부분 공격 코드에서 공백은 사용할 수 밖에 없기 때문에 공격자 입장에서 아주 불편하게 되죠.

일반적인 우회 기법

대체로 많이 사용하는 기법들은 URL 인코딩과 같은 인코딩 포맷들 그리고 + 기호 등을 활용한 방법이 있습니다.

Attack

asd”%20onload=”alert(45)

Output

<img src="test.jpg" name="asd" onload="alert(45)">

Bypass with Forward Slash(/)

오늘 소개해드릴 방법은 Slash를 이용한 기법입니다. HTML에서 각 속성 사이를 구별하기 위해선 공백을 넣어 속성들을 구별하게 됩니다.

<img src="url" onclick="viewImage(this)">

분해해서 보면 <img> 태그에 src라는 속성과 onclick 이란 속성 2가지로 나눌 수 있습니다. 자 그럼 속성으로 분리하는 방법은 공백만 가능할까요? 아닙니다. 바로 /(Slash) 문자를 이용해서도 문리가 가능합니다.

<img src="url"/onclick="viewImage(this)">

이런 형태의 구문이 성립할 수 있는거죠. 실제로 실행되는지 알아보기 위해서 간단하게 작성해보았습니다.

<html>
    <body>
        <img src="url"/onclick="console.log('run onclick!')">
    </body>
</html>

자 그럼 실제 XSS에선 어떻게 활용될까요? 뭐 이미 위에서 다 했네요..ㅋㅋ

아래 필터링 규칙은 각종 인코딩을 하여도 강제로 푼다고 가정합시다.

Attack

asd”%20onerror=”alert(45)

Output

<img src="test.jpg" name="asd"onerror="alert(45)">

공격자는 아래와 같은 Payload를 전달하여 필터링을 우회하죠.

Attack

asd”/onerror=”alert(45)

Output

<img src="test.jpg" name="asd"/onerror="alert(45)">

이런식으로 들어간 구문은 아래와 같이 src가 없기 때문에 onerror 이벤트가 발생하고, 슬래시로 정상 구문으로 받아 alert() 함수가 실행되게 됩니다.

유사한 형태로 아래와 같은 공격코드를 만들수도 있겠네요.

<svg/onload=alert(45)>
<iframe/src=javascript:alert(45)> 

등등 활용 가치는 많습니다 : )