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

[5주차]XSS(Cross site script)를 공부해보자 + XVWA에서 실습

by m_.9m 2021. 11. 12.

 

 

1. XSS 크로스 사이트 스크립트(크사)란?

 

=> 다른 취약점에 비해 우선순위가 낮다 
왜냐면 서버를 향한 공격이 아닌 이용자들을 공격하는 것이기 때문.

---> 이용자의 브라우저에서 실행됨

클라이언트 스크립트를 삽입하는 공격!!

 

-서버 측 코드
PHP, JSP, ASP -
-클라이언트 측 코드
HTML, javascript -

 

---> 크사 발생 이유
:공격자의 스크립트가 그대로 서버에서 응답되기 때문이다. (Dom Based XSS 제외)
:이용자의 입력(파라미터)이 서버에서 그대로 응답되기 때문이다.


---> 크사 : 영원한 우리의 친구
피라미터가 너무 수많이 존재하기때문에 찾으면 나옴.


---> 분류 
서버에 저장: Stored XSS
서버에서 반사: Reflected XSS
클라이언트 측에서 조립: DOM based XSS

 

*XSS POC(Proof Of Concept)
어떤 스크립트를 삽입할지
alert. prompt 등을 사용해 확인한다.


<script>alert('xss'); </script>

alert 안에 아무 코드나 넣을 수 있다. 

키로거, 세션아이디훔치기, 암호화페채굴 등 브라우저에서 할수있는 건
다 할 수 있다.
자바는 보통 인터프리터 언어로 내장, 컴파일이 필요없다. 브라우저는 자바가 내장. 
유의사항은 자바나 익스플로 엣지나 내장이 달라 조금씩 모양이 다를 수 있다. 그 중 실행되는 브라우저에서 하면 된다.

 

 

=========================================================================

 

 

*실습환경 세팅

@Burpsuite 설치

@XAMPP 설치

@XVWA 다운로드(깃허브)

https://www.youtube.com/watch?v=lqcaNxF0Ky0 

간단 설명 + 추가로 기본설정 구글링

 

2. Stored XSS


게시판, 댓글 창 등 내가 쓴 정보가 저장되는 곳에서 실행가능하다. 내가 어떤 'abc'를 게시글로 저장했을 시 그 게시글엔 abc라는 글자가 저장되며, 페이지 요청시 그 글자를 서버가 응답해서 보여줄것이다.


즉 원리는 ' 저장되어서 응답되는 것. ' 특징으로는 스크립트를 삽입하는 곳과 응답되는 곳이 다르다.
예시로 게시판 글 작성시는 다음과 같이 다를 수 있다.
write.php <- 스크립트를 삽입하는 곳.
view.php <- 스크립트가 응답되는 곳.

 

보통 Stored는 서버에 저장되는 거니까. 
이곳저곳 다니다가 때리고 때려맞고 하느라
?????? 어디서 공격당했는지도 모른다.

 

<처리 순서>


(1) Check


내가 삽입한 글자가 서버에 응답되는지 확인
게시글 제목이나 본문에 글자 입력 후 Burp suite 로 확인.

My name is myungju kim!

My name is myungju kim! 작성 후 잘 입력된 것을 확인할 수있다.

 


(2) HTML 특수 문자 체크
<, >, ;, ', ",
이렇게 사용해본다. >> myungju('xss');
확인은 버프스윗을 활용한다. 응답값에서 myungju 검색시 일부 특수 문자가 삽입되는 것을 볼 수 있다. 

 

myungju('xss');이 삽입된 것을 확인할 수 있다.

 

 

<script>alert('myungju_xss');</script>을 해서 알림창이 뜨는지 확인한다.

 

&lt;script&gt;alert('myungju_xss');&lt;/script&gt; 입력

 

 

&lt;script&gt;alert('myungju_xss');&lt;/script&gt; 잘 뜬다.

 

 

(3) POC 날림


입력 : myungju_xss<script>alert('xss');</script>

myungju_xss&lt;script&gt;alert('xss');&lt;/script&gt; 삽입 시 화면

 

xss로 알림창이 한번 더 뜬다.

실습 공격 성공!

 


*Stored 크사 시 주의할 점.
1) 테스트 서버를 주고 거기서 모의해킹하는게 정석인데 보통은 실서버에서 한다. 예를 들어 게시판 제목에 <script>alert('Nomartic is best!');</script>이런거 넣으면 실시간으로 들어와있는 모든 사용자에게 이게 실행된다.

보통은 제목에 테스트임을 알려줘 클릭하지 못하도록 알린다.
게시글 제목: 보안점검 테스트
내용:<script>alert('Nomartic is best!');</script>

2)HTML 태그 깨질 수 있음에 주의한다.
<div>

<p>
<input type=~~ value = "myungju_xss"><script></script>' 시 <<'가 문제된다.

</p>
</div>

</div>
myungju_xss<p></div></div><script>alert('xss');</script>
이런식으로 앞 뒤로 넣다가 페이지가 깨질 수 있다.


<script></script>"'<< 삽입 시 뒤에를 맞춰야한다.

 

 

2. Reflected XSS

서버에서 반사를 이용하는 XSS 공격이다. 대상은 검색어 jeisdfs 시 'jeisdfs(내가 입력한 문자)에 관한 게시물이 없습니다'로 값이 그대로 내게 반사되어 보여지는 곳이여한다.

 
Stored XSS와 달리 스크립트를 삽입하는 곳과 스트립트가 응답되는 곳이 같다. 그래서 burp suite에 repeater 사용하기 편하다.


<처리 순서>

 

(1),(2),(3) 의 원리는 동일하다.

 

(1) Check
내가 삽입한 글자가 서버에 응답되는지 확인
응답에서 해당 데이터를 찾음. [ myungju ] 같은 나만의 키워드 삽입 => 반사되는 것을 확인

 

 

입력시 출력된 화면
버프스윗을 켜서 myungu를 검색하면 response에 입력한 글자가 있는 것을 확인할 수 있다.


(2) HTML 특수 문자 체크


<, >, ;, ', ", 체크를 위해서 이렇게 >>> myungju('xss'); 사용해본다.
입력 myungju('xss');시 가능한 것을 확인하면

 

myungju('xss');

 


<script>alert('myungju_xss');</script> 삽입 후 burp suite로 해당 부분 우측클릭 Copy URL해서 직접 URL타고 실제로 알림 창이 되는 지 확인(필수)해본다. 실행이 되면 다음 차례로 넘어간다.

 

 

 

&amp;lt;script&amp;gt;alert('myungju_xss');&amp;lt;/script&amp;gt; 삽입하기

 

일단 알림창은 뜸! 이거 아님 아님!!!!

 

 

** URL 확인하기

해당 부분을 찾아 copy URL 해주어야한다.

 

Copy URL 값으로 나온 값을 

http://127.0.0.1/xvwa/vulnerabilities/reflected_xss/?item=%3Cscript%3Ealert%28%27myungju_xss%27%29%3B%3C%2Fscript%3E

사이트로 타고 들어가본다. 실행 = 성공 !!!!!

 

복사한 링크로 접속한 화면, 정상 작동 확인.

 



(3) POC

myungju_xss<script>arter('xss')</script>

 

삽입!

 

실습 공격 성공!

 

4. DOM Based XSS

> 클라이언트 측에서 조립된다.
기존 대응 방안과 다름. 서버에서 핸들링 불가. 

 

*시나리오
공격자가 뿌린 링크를 클릭하면 자동으로 A사이트에 서버 요청을 하게되고 그 A사이트에서 응답된(반사) 코드를 공격자에게 제공해 공격자는 코드 속 정보 탈취하게 된다.

 

실제 공격자들은 기업관리자들을 타겟으로 삼아 이런 키워드가 좋다.
- 연봉 협상('연봉 재조정 공지드립니다.')

- 추석 보너스 , 경품
- 혹은 코인 떡상! 기간만료로 인한 비밀번호 변경 요청

 

=> 악성 메일 훈련
지원나갈때가 있음. 사람들이 링크를 클릭하도록 뿌려서 누가 클릭했는지확인.

 

*주의
<<<<<<링크로 만들 수 있어야함>>>>>>>>
post xss 찾고 오른쪽 change requst method로 get 바꿀 수 있는지 확인
get방식으로 바꾼 다음 URL로 만들어서 보고해야함.

DOM, reflected XSS는 URL로 공격한다.
다른말로 URL이 없으면 공격 안됨.
파라미터에 옮기고 테스트하기.

<처리 순서>


1. check

삽입한 문자가 조립되는지 확인한다. 리피터로 확인이 불가하기 때문에 f12 개발자 도구를 이용해야한다.
element ctrl + f 로 입력한 myungju를 검색해 입력이 되었는지 확인한다.

 

우측 F12로 연 관리자모드 창에 Ctrl + F로 입력값 myungju를 검색해본다.



2. HTML 특수 문자 체크
myungju_"xss" 이런 예제를 넣어보고 정상적인 삽입이 확인되면 공격코드를 삽입해본다.

 

 

myungju_"xss"삽입과 출력된 관리자 모드 창

 

 

입력: myungju_xss<script>alert('xss');</script>

 

myungju_xss&lt;script&gt;alert('xss');&lt;/script&gt; 삽입과 출력 관리자 모드 창

 

출력은 되지만 알림창이 뜨지 않는 것을 확인할 수 있다.



3. POC


서버에서 응답받은 스크립트 태그는 또 다른 스크립트 태그를 <><> 만들어낸다. 이엔 각각의 타이밍이 존재한다.
돔베이스는 이 타이밍! 중에 하나에 만들어진다. 실행이 안되는 것은 해당 스크립트 태그가 실행되는 때를 놓치고 나서 코드를 삽입하여 죽은 태그가 된다.

더 쉬운 설명.
example.HTML
(1) HTML 태그들을 인식
(2) script 태그 코드를 실행한다.
(3) HTML 태그를 화면에 그린다.
(4) img 소스를 가져온다.
..

 <script>alert('xss')</script>
여기에 위의 코드를 삽입하면 (2)번때 실행되야하는데 시기를 놓침!

* 이때 Event Handler에 다른 태그 사용 가능
            l--> 이벤트가 발생했을때 처리하는 코드

 

<script></script>는 절대적. <img>, <form>, <button>같은 곳에서 사용할 수 있는 태그가 있다.

 

예) <img src=x (이벤트 발생시켜서) onerror="alert('xss')"(요고 띄움)>

넣어서 실행시켜 본다. myungju_xss<img src=x onerror="alert('xss')"> 시 안된다.

 

 

myungju_xss&lt;img src=x onerror="alert('xss')"&gt; 삽입화면

 

 


URL을 보면 +가 있는 거 확인. URL에서 이를 %20으로 바꾸면 실행이된다.

+를 %20으로 수정해준다.

 

 

정상적으로 알림창이 뜨는 것을 확인할 수 있다.

Copy URL : http://127.0.0.1/xvwa/vulnerabilities/dom_xss/?search=myungju_xss%3Cimg%20src%3Dx%20onerror%3D%22alert%28%27xss%27%29%22%29%3E


=> DOM이랑 Reflected XSS는 URL로 공격한다. GET방식이 되어야한다.

 


5. XSS 찾는법

 

보통 루틴이 있다.  
WackoPickocom에서 실습을 해본다. 로그인해보면 과정이 나옴. 그걸로 페이지가 어떻게 돌아가는 지 파악하게 된다.


1. Check 

안에 글자넣으면 글자가 그대로 나오네?

파라미터 파일 가서 123123 넣어보고 auto 스크롤 하고 응답 확인해서 안되면 다른 곳으로 넘어가고,

어디서 또 123123 넣었을때 응답에서 내 코드가 삽입된 것을 발견하면 테스트해볼만한 곳인것이다. 

2. HTML 특수문자


(1) ""'볼때는 이렇게 보임. 근데 코드로 보면 다른 글자인 경우가 있다.
이는 HTML entities로 마크업언어(태그 등 구조에 관련된 언어)와의 충돌을 막기위해 특정 캐릭터들을 예약해 사용하는 것이다.

 


&1t; -> "<"
이렇게 만들어주면 악성 - 못씀.
그럼 우회 다른거 시도해보고 안되면 손뗌.

(2) 응답 위치 확인
내가 입력한 스크립트가 input value 큰따옴표 안에 들어가있을 시
"를 반드시 사용해야 밖으로 나올 수 있다. 그래야 "/><script>이렇게 코드입력할 수 있다.

그렇지만 혹시나 다른 곳에선 될 수있기 때문에 포기하지 않고 더 찾아본다. 
만약 내가 입력한 스크립트가 본문에 삽입될 시 <>,"' 사용가능. 그대로 alert(1)해서 넣는다.
copy URL하고 알림창 뜨면, 되는 곳을 발견! 거기다 크사 넣을 수 있음.
 
* 수없이 존재하는 피라미터들 중에 '내가 입력되는 값이 응답에 나타나는 파라미터'에만 테스트
* 생각보다 흔함. 보고서 데코용으로 쓰기도 함.

* 정리: XSS는 클라이언트 서버에서 발생!!!! 분류, 특징, 위험도, 찾는 법 복습. <repeater 시험대에 올려놓고 돌려보장>

 

 

 

================================

다음시간엔 


*XSS 필터링 우회 기법
*XSS 공격 시나리오
>> 시나리오는 품격을 높여준당!!!!! HTML 삽입 

 

틈틈히 하기


보고서  + 파이썬 자동화 도구 분석.
LordSQL풀기