XSS : 크로스 사이트 스크립팅(cross-site scripting)
웹페이지에 스크립트 언어를 삽입해 공격하는 클라이언트 대상의 공격 기법이다. 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되고, 의도치 않은 행동을 수행시키거나 민감한 정보(쿠키, 세션 토큰)를 탈취한다. 웹페이지나 게시판, 메일 등에서 발생한다. 기초적이고 단순하지만 강력하다. 많은 웹사이트들이 XSS에 대한 방어 조치를 해두지 않아 공격을 받는 경우가 많다. ( ) ! @ { } \n \t \0 ' " > < % $ 등의 문자를 이용해 공격한다. (특수 문자나 예약어, 스크립트를 나타내는 문자)
※ XSS를 통해 다음과 같은 피해가 발생할 수 있다.
- 쿠키 정보 및 세션 ID 획득
- 시스템 관리자 권한 획득
- 악성코드 다운로드
- 거짓 페이지 노출
공격 방법
Stored XSS
사이트 게시판이나 댓글, 닉네임 등 스크립트가 서버에 저장되어 실행되는 방식
Persistent XSS는 데이터베이스에 저장이 되어 지속적으로 공격을 하는 XSS이다. 사용자가 읽을 수 있고, HTML 형식의 메시지를 게시할 수 있는 온라인 게시판에서 주로 발생한다. 공격자가 피해자를 제3자 웹사이트로 유인할 필요없이 자동으로 렌더링되기 때문에 다른 XSS 취약점보다 치명적이다. 공격자는 XSS 공격에 취약한 웹 사이트를 파악해 악성스크립트를 삽입한다. 삽입된 스크립트는 데이터베이스에 저장이 되고 이를 열람한 사용자들은 악성 스크립트가 작동되면서 공격을 받는다. 민감한 정보를 탈취당하거나 다른 사이트로 리다이렉션 되는 등의 공격이다.
Reflected XSS
URL 파라미터(특히 GET 방식)에 스크립트를 넣어 서버에 저장하지 않고 그 즉시 스크립트를 만드는 방식
*브라우저 자체에서 차단하는 경우가 많아 공격 성공이 어려움
웹 클라이언트가 제공하는 HTTP 쿼리 매개 변수에서 적절하지 않고 구문 분석 및 해당 사용자에 대한 결과의 페이지를 표시하는 공격 기법. 검증 되지 않은 사용자가 URL 파라미터나 HTTP 요청 헤더 정보를 수정하여 공격할 수 있다. 사용자에게 입력 받은 검색어를 그대로 보여주는 곳(검색 엔진 → 취약점)이나 사용자가 입력한 값을 에러 메시지에 포함하여 보여주는 곳에 악성 스크립트가 삽입되면 서버가 사용자의 입력 값을 포함해 응답해 줄 때 스크립트가 실행된다.
DOM Based XSS
악의적인 스크립트가 포함 된 URL을 사용자가 요청하게 되어 브라우저를 해석하는 단계에 발생하는 공격
DOM : HTML 및 XML 문서에 접근하는 방법을 표준으로 정의하는 문서 객체 모델
피해자의 브라우저에서 DOM 환경을 수정하여 클라이언트 측 코드가 예상치 못한 방식으로 공격 구문이 실행된다. 페이지 자체는 변경되지 않지만, 페이지에 포함된 클라이언트 측 코드는 DOM환경에서 발생한 악의적인 변조로 인해 공격 구문이 실행된다. 서버와 관계없이 브라우저에서 발생함. 서버에서 전송된 HTTP 응답 값에는 공격자의 공격 구문이 포함되어 있지 않고, DOM 객체 생성 시 클라이언트 측 스크립트에 포함된다.
기법
1. 스크립트 태그
스크립트 태그로 자바스크립트를 실행시킨다. 대부분의 사이트에서 막는 경우가 많고 브라우저단에서 필터링 해주는 경우도 있다.
<script>alert('XSS');</script>
2. 자바스크립트 링크
링크 태그로 자바스크립트를 실행한다. 브라우저에서 about: 링크와 같이, javascript: 로 시작하는 링크는 스크립트를 실행시킨다. 스크립트 태그와 같이, javascript: 를 필터링하는 경우가 많아 많은 사이트에서 막는다.
<a href="javascript:alert('XSS')">XSS</a>
3. 이벤트 속성
이벤트 속성으로 스크립트를 실행할 수 있다. 주로 on 으로 시작하는 속성이 이벤트 속성이다. 자주 사용되는 이벤트 속성으로는 onload onerror onclick 등이 있다. 이 방법 역시 '자바스크립트 링크' 방법만큼 많이 막혔다.
<img src="#" onerror="alert('XSS')">
4. 블랙리스트 우회
블랙 리스트 방식으로 막는 사이트에 사용할 수 있다. 이벤트 속성 목록을 참고. 최근 웹사이트들에선 화이트리스트 방식 차단이 대부분이라, 막혔을 가능성이 높다.
<ruby oncopy="alert('XSS')">XSS</ruby>
5. 내용 난독화
일부 브라우저에서 javascript: 링크 사이에 공백 문자가 들어갈 수 있고, HTML 인코드를 해도 디코드된 내용이 출력된다는 점을 이용한다.
<a href="javas
cript
:
alert
('XSS')">XSS</a>
6. 스크립트 난독화
aaencode에서 자바스크립트 난독화. 스크립트 실행은 가능하지만 document.cookie와 같은 단어를 막을 경우 사용하면 된다.
alert("Hello, JavaScript")
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) ['c']+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) .゚Θ゚ノ+ ((゚ー゚) + (o^_^o))+ (゚Д゚) [゚Θ゚]+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) ['c']+ ((o^_^o) - (゚Θ゚))+ (゚Д゚) .゚ー゚ノ+ (゚Д゚) .゚ー゚ノ+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) ['c']+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚) ['c']+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) .゚Θ゚ノ+ ((゚ー゚) + (゚ー゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚) ['c']+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) ['c']+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) .゚Θ゚ノ+ (o^_^o)+ (゚Д゚) .゚ー゚ノ+ ((゚ー゚) + (゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) .゚Θ゚ノ+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚) ['c']+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) .゚Θ゚ノ+ ((o^_^o) - (゚Θ゚))+ (゚Д゚) .゚Д゚ノ+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
대응방안
script 문자 필터링
사용자의 모든 입력값에 대해 서버측에서 필터링 해주는 것. php의 eregi 함수 등을 이용하면 되는데 <, >, ", ' 등의 문자가 있다.
필터 제작
단순히 텍스트만 입력시키거나 출력하는 데 필터를 제작할 때, 주로 필터되는 것이 <와 >이다. 각각 < 와 > 처럼 HTML 문자로 바꾸어서 HTML 코드가 아닌 단순 문자로 인식하게 하는 것이다. 하지만, 이 경우는 모든 HTML 태그를 막아버리기 때문에, 각종 스타일을 적용시켜야하는 사이트에서는 맞지 않을 수도 있다.
BBCode 사용
글을 꾸며야 하지만, 따로 필터를 만들긴 어려운 경우, BBCode를 사용할 수도 있다. <나 >같은 HTML 코드를 단순 문자로 바꿀 수 있기 때문에 XSS가 실행될 염려가 적다. 하지만 이 때, 정규식과 같이 단순히 문자열 치환으로 수정할 경우, XSS가 발생할 수도 있다.
시큐어 코딩
시큐어코딩은 설계때부터 추후에 등장할 지 모를 버그 등 위험성을 모두 고려하여 설계하는 것이다. 예를 들어 스크립트가 입력이 안되게 하는 방법, 스크립트가 입력이 되어도 실행이 안되게 하는 방법이 있다.
XSS 방어 라이브러리, 브라우저 확장앱 사용
XSS를 막아주는 Anti XSS 라이브러리를 사용하면 손쉽게 XSS를 방어할 수 있다.
OWASP에서 발표한 XSS 공격을 방지하는 7계명
0. 허용된 위치가 아닌 곳에 신뢰할 수 없는 데이터가 들어가는것을 허용하지 않는다.
1. 신뢰할 수 없는 데이터는 검증을 하여라.
2. HTML 속성에 신뢰할 수 없는 데이터가 들어갈 수 없도록 하여라.
3. 자바스크립트에 신뢰할 수 없는 값이 들어갈 수 없도록 하여라.
4. CSS의 모든 신뢰할 수 없는 값에 대해서 검증하여라.
5. URL 파라미터에 신뢰할 수 없는 값이 있는지 검증하여라.
6. HTML 코드를 전체적으로 한번 더 검증하여라.
+) 다양한 XSS 공격 방법을 확인할 수 있는 XSS Cheat Sheet 링크 모음
https://no-more-assignment.tistory.com/402
XSS Cheat Sheet
XSS 치트 시트 https://portswigger.net/web-security/cross-site-scripting/cheat-sheet Cross-Site Scripting (XSS) Cheat Sheet - 2023 Edition | Web Security Academy Interactive cross-site scripting (XSS) cheat sheet for 2023, brought to you by PortSwigger.
no-more-assignment.tistory.com
<참고 사이트>
[XSS에 대한 설명과 공격 예시]
www.habonyphp.com/2019/02/xss.html
ko.wikipedia.org/wiki/%EC%82%AC%EC%9D%B4%ED%8A%B8_%EA%B0%84_%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8C%85
간단한 공격예제
www.habonyphp.com/2019/02/xss.html
XSS 예제, 제로보드 취약점
[DOM Based XSS에 대한 설명과 예시]
'정보보안' 카테고리의 다른 글
CTF 사이트 모음 (0) | 2021.07.24 |
---|---|
인코딩/디코딩, 해시 복호화, 코드정리, 컴파일러 사이트 모음 (0) | 2021.07.16 |
[2021 CodeEngn Conference] 문서형 악성코드를 분석해보자 (0) | 2021.07.07 |
[2021 CodeEngn Conference17] 딥러닝으로 취약점을 찾아보자 (0) | 2021.07.07 |
[HackerSchool] SQL Injection for beginner, expert by rubiya (0) | 2021.03.28 |