본문 바로가기
정보보안(웹해킹)/XSS(Cross-Site Scripting)

XSS(Cross-Site Scripting) 개요

by 끊임없는정진 2022. 11. 11.

 

▶XSS(Cross-Site Scripting,크사, 크스스)란?

클라이언트 측 스크립트를 삽입하는 공격(주로 JS, 가끔 HTML도). 웹 브라우저에서 일어남.

 

▶취약점 발생이유?

공격자의 스크립트가 그대로 서버에서 응답되기 때문에 발생!

 

▶발생 가능한 위치?

사용자의 입력이 응답에 포함되는 모든 곳! (input뿐만 아니라 모든 parameter에서 발생!)

 

▶ 스크립트 삽입 전략에 따른 XSS종류

[1] 서버에 저장 : Stored XSS

[2] 서버에서 반사 : Reflected XSS

[3] 클라이언트 조립 : DOM Based XSS

 

▶ Reflected XSS

클라이언트가 입력한 파라미터를 활용해서 서버가 내용을 반환할 때 응용함. 단, 그 정보는 서버에 저장하지 않음. 대표적으로 검색기능을 지원하는 것을 예로 들 수 있다.

Reflected XSS는 주로 링크를 줘서(URL) 활용한다.

 

▶ Stored XSS vs Reflected XSS

[1] Stored XSS : 위험도가 높다. 불특정 다수에게 공격이 가능하기 때문.

[2] Reflected XSS : 쉽게 찾을 수 있다. 타겟팅 공격이 가능하다. 클릭하게 만들어야되기 때문에 '사회공학기법'을 활용해야 한다. 

 

▶ Reflected XSS 찾는 과정?

"Burp Suite" 활용 -> history에 params "v" 된 부분을 중점으로 보되, 내가 날린 데이터가 응답에 들어가 있는지 확인해볼것. -> 'Repeater'로 옮기기 -> 나만아는 keyword 넣어보기 (이때 Auto Scroll 기능을 활용하면 유용하게 찾을 수 있다.)  -> parameter에 <" '>를 넣고 그대로 응답돼서 나오면 전부 활용가능(만약, "만 응답되면 "만 활용가능) -> <script>되는가? -> <script></script>되는가? -> <script>alert('1')</script>가 되면 Reflected URL을 보고서에 넣기!

-정리하면 Reflected XSS를 찾는과정은 다음과 같다.

[0] 이것저것 다해본뒤, history 데이터를 뒤져본다.

[1] 파라미터가 있어야 할 수 있다.

[2] 응답에 파라미터가 그대로 찍혀야 한다.

[3] <" '> 넣어서 확인해본다.

[4] 해당태그에서 실행이 안되면 그 태그를 벗어나게 열고 닫아준뒤 그 사이에 Script를 넣는다.

※ 막무가내로 코드 집어넣지 말기!

 

▶ DOM Based XSS

클라이언트 측에서 조립하는 Cross-Site Scripting 기법

 

▶ DOM Based XSS 찾는 과정

Reflected XSS와 같이 keyword를 넣어본다. -> 응답에 없음. -> Script부분을 보면 다음과 같이 직접 조립하는 경우가 존재.(Document.write가 사용자의 파라미터를 받는 경우이다.)

1
2
3
4
5
6
7
8
9
10
....
<form name="XSS" method="GET>
    <select name="default">
        <script>
            if (document.location.href.indexOf("default=") >=0) {
            var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
            document.write("<option value='" + lang + "'>" + decodeURL(lang) + "</option>");
            document.write("<option value='' disabled='disabled'>----</option>");
            }
....
cs

-> 이런 경우 개발자도구 'elements'를 통해 확인이 가능하다. -> GET방식으로 <" '>를 주고 꺾쇄가 살아있는 것을 확인 후, "공격가능하겠구나!"

※ 진짜 꼼꼼하게 JS를 봐야 분석가능하다. JS를 공부할 것!

 

▶ WEB server - access log 활용 (추후 보강 설명)

 

▶ 유념해야할 사항들

[1] 게시판의 경우 : 제목에 바로 Script 태그를 넣지 않음. 내용에 test<" '> 를 넣고 수정해가면서 상태를 봄(수정&읽기 페이지 둘다 "repeater'에 넣어서 확인해준다.).

[2] <textarea> 태그 안에 있어서 실행이 안되는 경우, </textarea>로 닫아주고 <textarea>로 열어주고 그 사이에 Script코드를 삽입해서 실행해본다.

 

댓글