Shang
Blog 👨‍💻
  • 🌸Introduction
  • 💻WEB SECURITY
    • Research Vulnerability
      • 📲Server-side topics
        • 🔏API Testing
        • 🔏Race conditions
        • 🔏XML external entity (XXE) injection
        • 🔏Server-side request forgery (SSRF)
        • 🔏File upload vulnerabilities
        • 🔏Access control vulnerabilities and privilege escalation
        • 🔏Business logic vulnerabilities
        • 🔏OS Command injection
        • 🔏Directory traversal
        • 🔏Authentication vulnerabilities
        • 🔏SQL injection
      • 📱Client-side topics
        • 🔏DOM-based vulnerabilities
        • 🔏Cross-origin resource sharing (CORS)
        • 🔏WebSockets
        • 🔏Clickjacking (UI redressing)
        • 🔏Cross-site request forgery (CSRF)
        • 🔏Cross-site scripting(XSS)
      • 🌀Advanced topics
        • 🔐Web cache poisoning
        • 🔐HTTP request smuggling
        • 🔐Prototype pollution
        • 🔐Server-side template injection(SSTI)
        • 🔐Insucure deserialization
    • Learn Java Vulnerability
      • Intro & Setup
      • Java Reflection Part 1
      • Java Reflection Part 2
    • Research Documents
      • 🎯DNS Rebinding
      • 🍪Remote Code Execution - Insecure Deserialization
      • 🍪Remote Code Execution on Jinja - SSTI Lab
      • 🍪Exploit cross-site request forgery (CSRF) - Lab
      • 🍪Exploit a misconfigured CORS - Lab
      • 🍪Same Origin Policy (SOP) - Lab
  • 📝WRITE-UP CTF
    • CTF Competitions
      • 🔰[WolvCTF 2023] Writeup Web
      • 🔰[M☆CTF Training 2023] Writeup Web
      • 🔰[HackTM CTF 2023] Writeup Web
      • 🔰[Incognito 4.0 2023] Writeup Web
      • 🔰[LA CTF 2023] Re-writeup Web
      • 🔰[Dice CTF 2023] Writeup Web
      • 🔰[ByteBandits CTF 2023] Writeup Web
      • 🔰[Knight CTF 2023] Writeup Web
      • 🔰[Sekai CTF 2022] Writeup Web
      • 🔰[WRECK CTF 2022] Writeup Web
      • 🔰[Maple CTF 2022] Writeup Web
    • CTF WarGame
      • ✏️[Root me] Writeup Sever Side
      • ✏️Websec.fr
      • ✏️[Root me] Writeup XSS Challenge
    • [tsug0d]-MAWC
      • 💉TSULOTT
      • 💉IQTEST
      • 🧬TooManyCrypto
      • 🧬NumberMakeup
    • Pwnable.vn
Powered by GitBook
On this page
  • TL;DR - show me the fun part!
  • Intro
  • CSRF in action - app demo 👀
  • CSRF in action - attack demo 🔥
  • Analysing the attack 🔎
  • Take-away notes 📚
  • 1. How the attacker constructed a CSRF request?
  • 2. When the browser sends a cookie(s) automatically?
  • Think 💡
  • 1. How did I know in the backend that a user was created through CSRF?
  • 2. Why an attacker can NOT modify referer/origin header?
  • 3. Play and modify the attacker page by:-
  1. WEB SECURITY
  2. Research Documents

Exploit cross-site request forgery (CSRF) - Lab

Lab này được nghiên cứu thêm từ Portswigger

PreviousRemote Code Execution on Jinja - SSTI LabNextExploit a misconfigured CORS - Lab

Last updated 2 years ago

TL;DR - show me the fun part!

  1. vào app

  2. app

  3. users, chú ý một cái mới

Intro

Cross-site request foregery(CSRF) là một lỗ hổng web cho phép kẻ tấn công thực hiện một hành động mà họ không có ý định thực hiện.

Chúng ta hay xem app cho phép người dùng sau khi đã xác thực, để update email tại endpoint như này:

https://example.com/profile/updateEmail

Ở CSRS, kẻ tấn công có thể làm cho người dùng thay đổi email login với bất kỳ email nào mà kẻ tấn công muốn.

CSRF yêu cầu sự tương tác người dùng, như người dùng đã được xác thực tới trang web giả mạo

CSRF in action - app demo 👀

Trong lab này chúng ta sẽ exploit một trang web thiếu sót để hiểu và phân tích cách CSRF tấn công.

Hãy xem trang web này hoạt động:

  1. Mở tab ở dev tool trên trình duyệt

  2. Mở web app

  3. Clicck vào login - không cần xác thực 🙈

  4. Sau khi login thành công , app gửi trở lại một session-cookie 🍪

Session cookie có các attributes sau:

  • domain - valid for secure-cookie.io and all subdomains

  • expires - life time is 1 hour

  • httpOnly - cookie can’t be read by JS

  • path - valid for all paths, like /admin /verify /add /whatever

  • samesite - None means the browser will send this cookie for same-site + cross-site requests 😉

  • secure - cookie should be submitted over HTTPs only

  1. App sẽ offers bạn như là một admin để tạo một người dùng mới. Giữ tab network đang chạy. Điền vào form để tạo một người dùng mới và nhấn add.

  2. Xem xét HTTP request mà vừa được gửi.

POST /addUser HTTP/2 (1)
Host: csrf.secure-cookie.io (2)
Referer: https://csrf.secure-cookie.io/admin (3)
Content-Type: text/plain (4)
Origin: https://csrf.secure-cookie.io (5)
Cookie: SessionId=eyJ0eXAiOiJKV1 ...etc (6)
  1. HTTP method là POST và endpoint là /addUser
  2. Add host, url hoàn chỉnh là: https://csrf.secure-cookie.io/addUser
  3. Request được tạo từ path trang:https://csrf.secure-cookie.io/admin
  4. Data được gửi ở dạng text/plain
  5. Request được tạo từ Orgin https://csrf.secure-cookie.io
  6. SessionId cookie được bao gồm trong request header - chỉ người được xác thực mới có thể add người mới 

Bây giờ click vào list users để verify rằng UserID mới vừa được tạo. Trước đó chúng ta tiếp tục, bạn nghĩa /addUser api là đảm bảo.

Bạn có thể chuyển request từ trình duyệt tới Burp Repeater để thao tác request. Bạn có thể cố gắng bỏ qua giá trị cookie hoặc inject stuff ở form field 😉

Giả sử endpoint là xác thực cookie trước khi tạo người dùng. Sau đó, làm thế nào một kẻ tấn công có thể khai thác API này?

CSRF in action - attack demo 🔥

Cuộc tấn công CSRF có thể được giải thích trong hình sau:

  1. Trang web của kẻ tấn công chứa code JS yêu cầu trình duyệt tạo API call tới endpoint có lỗ hổng

  2. Trình duyệt gửi request cùng với cookie tới endpoint được request.

Những gì bạn vừa thấy giải thích việc đặt tên cho cross site request forgery

  • Request được tạo cross-site từ site của kẻ tấn công

  • Request đã được giả mạo mà không cần sự nhận biết của nạn nhân

Analysing the attack 🔎

  1. Xem source code của page và lưu ý rằng hàm JS execute_all_attacks() sẽ được thực thi bất cứ khi nào HTML body được load trên trình duyệt. Nó cũng gọi một hàm khác attack_addUser_endpoint().

<body onload="execute_all_attacks();">
<script>
function execute_all_attacks(){
attack_addUser_endpoint();
}
</script>
  1. Trong tab network bạn thấy POST request được send tới endpoint /addUser. Để theo dõi function JS đã thực hiện, nhấp vào trường initiator và sau đó nhấp vào attack_adduser_endpoint(). Dưới đây là đoạn trích liên quan.

function get_post_http_headers(data, content_type){
return {
method:"POST",
body: data,
headers: {'Content-Type':content_type},
credentials: 'include'
}}

function attack_addUser_endpoint(){
backdoor_user = "user=backdoor,pass=backdoor"
var options = get_post_http_headers(data=backdoor_user,content_type='text/plain')
var request = fetch(url="https://csrf.secure-cookie.io/addUser",options);
request.catch(err => update_user_added_html())
}
  1. Hàm trên exploit lỗ hổng endpoint /addUser:

  • set một backdoor_user username và password như request body.

  • gọi get_post_http_headers() để set HTTP headers như POST method, content-type.

  1. Trình duyệt sẽ tạo request và gửi cookies cùng request.

🔈 Tấn công CSRF không vi phạm same-origin policy rules. SOP sẽ cho phép kẻ tấn công Write tới endpoint nhưng không READ response. Request sẽ tới endpoint nhưng JS không cho phép đọc response

  1. Để chứng minh điều ☝️,, hãy đến Tab Console và chú ý những gì thông báo cảnh báo nói.

The Same Origin Policy disallows reading the remote resource.

Trong cuộc tấn công này, kẻ tấn công không thực sự quan tâm đến response từ /adduser. Bởi vì "backdoor user" đã được gửi bởi trình duyệt của nạn nhân. Và đó là một request được xác thực vì trình duyệt bao gồm session-id cookie trong request.

Take-away notes 📚

1. How the attacker constructed a CSRF request?

Kẻ tấn công sẽ cần biết URL API có lỗ hổng và tất cả các parameter yêu cầu cần thiết (header, body).

2. When the browser sends a cookie(s) automatically?

Trình duyệt sẽ gửi cookie theo mặc định nếu tất cả các điều kiện này được đáp ứng:

  • cookie is not expired

  • requested path matches set-cookie path

  • requested domain matches set-cookie domain

Think 💡

1. How did I know in the backend that a user was created through CSRF?

2. Why an attacker can NOT modify referer/origin header?

3. Play and modify the attacker page by:-

  1. Save the attacker page locally (include CSS and JS files).

  2. Edit function: get_post_http_headers()

    • Change content type from to - Does the attack still work?text/plainapplication/json

    • Remove - Does the attack still work?credentials:include

-----------------------------------------------------------------------------

value - random token in format

Người dùng đã được xác thực vào .

Sau khi vào trang web của kẻ tấn công, quay lại cổng và click lại List Users.....Một người dùng mới đã được tạo.

Reaload lại trong khi tab network đang mở.

☝️Điều này có nghĩa là, cuộc tấn công xảy ra ngay khi người dùng (nạn nhân) truy cập trang kẻ tấn công. Không có tương tác người dùng khác được yêu cầu (như nhấp vào nút như trong ).

Tạo cross-site rquest sử dụng đối với .

Nếu bạn đã đọc các . Bây giờ bạn có thể tự hỏi, đây không phải là sự vi phạm same-origin policy (SOP) vì request được thực hiện cross-origin?

Nếu bất kỳ request parameter ynào là ngẫu nhiên và không thể dự đoán (như ). Hoặc nếu nó yêu cầu tương tác người dùng (như CAPTCHA). Sau đó, cuộc tấn công sẽ thất bại.

browser specific requirement such as

Tôi đã sử dụng trong header request. Nếu request không đến từ https://csrf.secure-cookie.io/admin thì tôi cho rằng đó là cuộc tấn công CSRF.

Bởi vì nó bị sửa đổi chúng theo chương trình.

💻
🍪
Login
Exploit
List
network monitor
login page
JWT
trang của kẻ tấn công
admin
trang web tấn công
ClickJacking
fetch()
https://csrf.secure-cookie.io/addUser
same-origin policy rules
CSRF Token
SameSite attribute existence in chrome
referer
forbidden
cookie attributes
csrf attack
browser can’t read response due to missing CORS policy