[vn] The Amazing PDF-man pt. 1: XSS bypass wet @ss firewall (WAF)

sonwsonw
5 min read

Tháng 10 năm 2024, gió đông bắt đầu tràn về xao động hàng cây, tiếng lá úa rơi lã chã bên bậu cửa sổ, chúng cứ như đang cố gắng len lỏi vào trong phòng ấm, tìm một chút che chở trước khi mùa lạnh ập đến, nhưng mọi nỗ lực đều bị ngăn đằng sau tấm kính vô cảm. Ngắm nhìn cảnh quan trước mắt, lòng không khỏi xúc động mà liên tưởng tới dự án mình đang làm: “Liệu mình có hơn được những chiếc lá kia, vượt qua được firewall đang chắn trước mặt này…”

Và mình đã làm được thật. Thành công của dự án này không chỉ là một lần khai thác lỗ hổng thông thường, mà còn ghi dấu cho lần mình sáng tạo và áp dụng nghiên cứu kỹ thuật nâng cao trong việc RCE và bypass WAF, đồng thời giúp cho khách hàng có thêm kiến thức và cập nhật về các lỗ hổng hiện đại.

Khách hàng lần này khá đầu tư trong vấn đề bảo mật: chủ động bật Cloudflare WAF và bot detection cho cả môi trường test lẫn production, thêm cả DNS redirect, basic authentication đầy đủ. Để đơn vị cyber security chúng mình có thể tiếp cận scope dự án ổn thỏa thì cần phải qua các bước config rất nhiều. Vào nội dung chính thì role user của trang web có một function upload file, được giới hạn cho định dạng pdf, coi như là entry đẹp nhất rồi. Vì mình là người đẹp trai và chuyên nghiệp nên mình sẽ theo quy trình kiểm tra best practices trước, thấy rằng chỉ còn con đường giấu mã độc vào file thôi.

Đầu tiên mình cần quan sát con đường của mỗi file pdf nạp vào. Để đến được điểm cuối thì file pdf này được render bằng Google Docs gview, theo mình biết thì sẽ cho phép thực thi các câu lệnh JavaScript bên trong file nếu như website không có cơ chế lọc nào cho vấn đề này. Ngoài lề một tí thì không chỉ có gview, mà PDF.js - thư viện render PDF của Mozilla cũng từng được báo cáo về lỗ hổng nghiêm trọng vào tháng 4 cùng năm. Bởi vậy nên, dù là plugin nào, một khi không được kiểm soát kỹ đầu vào, chúng ta vẫn đang chơi với lửa mà không mặc đồ bảo hộ.

Lại nhớ về chiêu thức khai thác XSS thông qua pdf, mình nghĩ đến việc tạo một file thông tin bình thường, sau đó mở bằng text editor để thêm một đoạn payload như sau với hi vọng là sẽ PoC được:

Sau khi upload và tìm đến endpoint cuối để xem tài liệu thì kết quả ở môi trường test cho thấy mình đã RCE thành công.

Mặc dù đến đây là khách hàng toát mồ hôi hột rồi. Tuy nhiên mình vẫn muốn thử vận may xem có qua được môi trường production không. Sau khi mình tái hiện lại trên production thì xảy ra trường hợp là file tự động bị xóa, không ngạc nhiên lắm vì có Cloudflare ở đằng sau. Mặc dù chỉ định thử lại xem may mắn thôi rồi đóng report để qua làm bug khác, nhưng rồi mình lại nghe được tiếng gọi tổ tiên, mách bảo mình phải chơi con WAF này tới cùng.

Theo kiến thức của mình biết thì WAF thông thường sẽ xử lý payload độc hại theo 2 hướng phổ biến nhất:

  • 1 là encode các cú pháp để vô hiệu hóa request độc hại.

  • 2 là "nếu anh không thay đổi vì em thì mình chia tay", drop và block user.

Trường hợp này có thể dính vào cách 2, tức là đang không có sanitizer nào xử lý ở đằng sau nên mình sẽ theo hướng lựa chọn payload nào mà đơn vị phát triển WAF chưa để tâm đến hoặc con ML chưa học được, đỡ được khối thời gian nếu mình theo cách 1 là tìm cơ chế mà WAF xử lý thay thế cú pháp để reverse lại.

Cách của mình là sẽ thêm vào xen kẽ các biến thể payload khác nhau một cách có hệ thống, quan sát phản ứng từ phía server ở mỗi lần thử để vừa dự đoán vừa xác định:

  • Xu hướng pattern mà WAF sẽ chặn hoặc cho phép, cho ra manh mối về các rulesets.

  • Tương quan giữa độ dài payload và thời gian xử lý, nhằm phát hiện các đặc điểm như regex-based inspection hoặc deep packet analysis của WAF.

Thử đi thử lại nhiều lần thì mình đã có 1 payload khai thác được ngon lành, lúc này thì chỉ PoC sao cho được alert(1) thôi.

Vậy là xem như mình bypass được WAF rồi cả nhà ạ! Từ đó, mọi hành vi như đánh cắp cookie, kiểm soát hành vi người dùng, hay thậm chí là tiếp cận các API nội bộ đều khả thi.

Sau lần report bổ sung này, mình có phối hợp với khách hàng gửi support ticket lên Cloudflare. Dù phía Cloudflare ghi nhận vấn đề, nhưng do một số giới hạn trong chính sách hỗ trợ, họ không thể can thiệp sâu hơn ở cấp độ kỹ thuật.

Mặc dù không phải câu chuyện mới, nhưng WAF hay các giải pháp phòng thủ bên ngoài không giúp trang web an toàn tuyệt đối. Nó có thể sẽ bước đầu gây khó khăn cho các hacker lúc mới bắt đầu tiếp cận mục tiêu, nhưng đa số các pro đều kiên nhẫn và lì nên nếu bản thân codebase không được đầu tư kĩ lưỡng về các security best practices thì việc tìm ra lỗ hổng chỉ là vấn đề thời gian.

Và hành trình của PDF-man lại tiếp tục, mọi chuyện thế nào, hồi sau sẽ tỏ…

s-0wn

0
Subscribe to my newsletter

Read articles from sonw directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

sonw
sonw