+3

Server side request forgery vulnerabilities (SSRF) - Các lỗ hổng giả mạo yêu cầu phía máy chủ (Phần 2)

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

image.png

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 80808080. Để 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.

image.png

Kiểm tra lỗ hổng SSRF bằng kỹ thuật DNS lookup và thành công:

image.png

image.png

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 80808080, 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

image.png

Đặ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ừ 00 đến 255255, đó cùng là danh sách payload chúng ta thực hiện vét cạn:

image.png

Quan sát thấy IP 192.168.0.139 trả về status 200200 và trong response chứa chức năng của trang quản trị viên:

image.png

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

image.png

Bài lab được giải quyết:

image.png

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.

image.png

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

image.png

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.

image.png

Kiểm tra lỗ hổng SSRF, thực hiện DNS lookup thành công:

image.png

image.png

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ư localhost127.0.0.1:

image.png

image.png

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

image.png

image.png

Truy cập tới /admin cũng bị ngăn chặn:

image.png

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 11: Sử dụng ký tự viết hoa, chẳng hạn Admin, payload: stockApi=http://127.0.1/Admin

image.png

  • Cách 22: Encode URL, có thể thực hiện URL encode ký tự bất kỳ. Lưu ý cần encode 22 lần do trong quá trình POST đã có 11 lần decode URL. Payload: stockApi=http://127.0.1/%25%36%31dmin

image.png

Xóa tài khoản người dùng carlos và hoàn thành bài lab:

image.png

image.png

Các tài liệu tham khảo


©️ Tác giả: Lê Ngọc Hoa từ Viblo


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí