NỘI DUNG
Tiếp theo nội dung Penetration Testing Step 3 – Nhập môn Server-side request forgery – SSRF, kỳ này tôi sẽ tiếp tục công cuộc khoan cắt để chọc thủng đám filter bảo vệ của mục tiêu. Cụ thể, tôi sẽ demo mình họa 2 tình huống:
- Mục tiêu sử dụng giải pháp whitelist filter để bảo vệ nhưng đâu đó vẫn còn lỗ hổng cho phép tôi bypass;
- Mục tiêu triển khai giải pháp filter che chắn tốt hơn nhưng lại quên mất khả năng redirection nên tôi vẫn còn đất diễn.
Lưu ý:
- Như mọi khi, tôi cũng sẽ tận dụng các bài Lab dựng sẵn của ông PortSwigger để tiết kiệm thời gian dàn cảnh;
- Thông tin liên quan đến Burp Suite bạn có thể xem nội dung Penetration Testing Step 3 – 6 điều bạn nên biết trước khi xài tool khủng Burp Suite;
- Chi tiết việc sử dụng Burp Suite Repeater bạn có thể xem trong nội dung Penetration Testing Step 3 – Thủ thuật chọc ngoáy HTTP/WebSockets message với Burp Suite Repeater;
#1. SSRF attack với chiêu ngụy trang để bypass whitelist-based input filter
Như có thể thấy trong kỳ trước, phương án blacklist dễ bị bốc sh*t nên một số hệ thống có thể lựa chọn triển khai whitelist-based input filter. Với tình huống này, chỉ những thằng nào khớp (hoặc có thể thuộc kiểu “bắt đầu với”, “có chứa”) với các chuỗi giá trị được định nghĩa trước trong whitelist mới được phép đi qua.
Tuy nhiên, như mọi khi, có thằng xây được thì cũng sẽ có thằng tìm cách phá được. Tôi vẫn có thể xé rào chui vào hệ thống bằng cách khai thác sự không đồng bộ trong quá trình URL parsing (tạm hiểu là quá trình “đọc hiểu” cái URL để chạy request tương ứng) với một số phương án phổ biến như:
- Sử dụng “@” character để gài hàng đưa credential vào URL ngay phía trước hostname theo kiểu https://expected-host@evil-host;
- Sử dụng “#” character để phân đoạn cái URL theo kiểu https://evil-host#expected-host;
- Tận dụng DNS naming hierarchy để bố trí input yêu cầu của whitelist vào cái fully-qualified DNS name mà tôi có thể kiểm soát theo kiểu https://expected-host.evil-host;
- Sử dụng URL-encode characters để chọc ngoáy chức năng URL-parsing của hệ thống nhằm khai thác sự sai khác trong quá trình parsing của chỗ filter với phần xử lý request của backend;
- Chơi kiểu xà bần, phối trộn các phương án trên lại.
Nếu đọc xong đám trên thấy rối quá thì bạn cũng đừng lo. Tôi sẽ múc bài lab để minh họa cho rõ ngay đây.
Tương tự như kỳ trước, tôi truy cập đại vào một sản phẩm và thử tính năng Check stock.

Sau đó tôi hốt cái request tương ứng quẳng qua Burp Suite Repeater.

Ở đây, nếu thử giở trò mông má cái stockApi thành kiểu localhost như kỳ trước tôi sẽ bị từ chối một cách lạnh lùng.

Như quan sát được trong cái response, hiện mục tiêu đã triển khai whitelist filter và host yêu cầu phải có kiểu stock.weliketoshop.net. Tôi cố chịu đấm ăn chửi thử lại một lần nữa với kiểu giả danh localhost#@stock.weliketoshop.net.
Lưu ý: Lúc này, cái phần @stock.weliketoshop.net là để tôi chui qua cái whitelist filter. Sau khi chui qua filter, cái “#” character có chức năng phân đoạn cái thông tin tôi đưa vào từ đó gọt hết phần đuôi @stock.weliketoshop.net và để lại http://localhost theo ý đồ thâm độc của tôi.

Tính hay là thế, nhưng kết quả vẫn ê chề như trước đó. Khả năng cái ký tự “#” quá lộ liễu nên tôi đã bị mục tiêu bắt bài. Tôi sực nhớ lại trò double encoding trước đó và thử chuyển “#” thành “%2523” thử.


Ô hô, mọi chuyện đã trôi chảy trở lại với status code 200. Và thậm chí, khi soi kỹ cái response, tôi còn gặp lại cái Admin panel đầy cám dỗ.

Công việc sau đó chỉ còn mang tính thủ tục. Tôi cập nhật lại stockApi để soi cái /admin.

Lưu ý: Tương tự như trước đó, cái phần @stock.weliketoshop.net là để tôi chui qua cái whitelist filter. Và sau đó, cái “#” character sẽ lại phân đoạn cái thông tin tôi đưa vào rồi gọt hết phần đuôi @stock.weliketoshop.net (nhưng để lại /admin) từ đó để lại cho tôi cái http://localhost/admin.
Tôi tiếp tục giở trò sục sạo cái response để tìm cái href xóa accound của nạn nhân Carlos.

Sau đó tung đòn kết liễu nhẹ nhàng tình cảm.

#2. SSRF attack với chiêu open redirection
Giờ tôi chuyển qua kịch bản khi mà các âm mưu đê hèn nhằm bypass filter (kiểu blacklist và whitelist trước đó) đều thất bại. Lúc này, tôi có thể thử vận may với trò open redirection.
Với trò này, điều kiện tiên quyết tôi cần là phần xử lý backend HTTP request phải hỗ trợ redirection. Một khi điều kiện này được đáp ứng, tôi sẽ có thể thử mông má lại cái URL để hợp vệ sinh theo yêu cầu của đám filter đồng thời dẫn kết quả redirected request đến vị trí mong muốn kiểu như /product/nextProduct?currentProductId=6&path=http://evil-user.net.
Nếu êm đẹp, cái đám lằng nhằng trên sẽ dẫn đến redirection về vị trí tôi yêu thích http://evil-user.net. Lúc này, tôi có thể tận dụng cái open redirection để bypass cái URL filter và khai thác lỗ hổng SSRF theo kiểu:
stockApi=http://weliketoshop.net/product/nextProduct?currentProductId=6&path=http://192.168.0.68/admin
Như có thể thấy ở trên,phần đầu của cái stockAPI thuộc cái domain chính chủ, không có gì sai trái nên được phép chui qua filter. Vấn đề là cái phần sau sẽ kích hoạt open redirection kéo theo request đến internal URL chứa giao diện admin đầy uy quyền.
Rồi, để tôi vào phần demo minh họa cho rõ. Tương tự như trên, tôi cũng mò vào một sản phẩm cụ thể và chạy tính năng Check stock.

Sau đó tôi đẩy cái request tương ứng sang Burp Suite Repeater.

Ở đây, khi thử các giải pháp mông má cái stockApi để bypass filter tôi đều nhận được cùng một câu trả lời (tất nhiên là từ chối).

Không tuyệt vọng, tôi chuyển qua thử soi kèo cái Next product.

Lúc này, quan sát response tôi thấy sự xuất hiện cái Location header chứa path parameter làm cơ sở cho quá trình redirection sang trang của sản phẩm có productId = 2.

Với thông tin này, tôi có thể thử vận may bằng cách cập nhật lại stockApi nhằm phục vụ mưu đồ redirect về vị trí admin:
/product/nextProduct?path=http://192.168.0.12:8080/admin

Lưu ý: Ở đây tôi đang demo giản lược. Thực tế, bạn sẽ cần dò tìm cái IP 192.168.0.12 tương tự như kỳ trước.
Rất triển vọng, status code 200 đã được trả về. Và khi kéo xuống bên dưới của response, ý đồ của tôi đã thành công mỹ mãn với sự xuất hiện của cái href cho phép xóa account của Carlos.

Công việc trảm account của nạn nhân ở bước kế tiếp chỉ còn mang tính thủ tục.

1 thought on “Penetration Testing Step 3 – SSRF attack với whitelist filter bypass và open redirection”