## Web: Newchall :::info This is a simple calc program,let's try /exec?q=9*10. Author: dcthinh `http://45.122.249.68:20011` ::: Challenge đơn giản, sẽ trả về giá trị của đoạn code của `q`. Vì `require` và `child_process` bị chặn nên mình dùng cách khác để load thư viện, và đọc file thay vì RCE `process.mainModule.constructor._load("fs").readFileSync("flag.txt")` ![image](https://hackmd.io/_uploads/rk9NfG3rA.png) ## Web: Math Rendering :::info NewChall Author: dcduc `http://45.122.249.68:20013` ::: Web có tính năng render các công thức toán dựa vào các tag của HTML, và có tính năng Send to admin nên mình đoán đây là một challenge XSS để leak flag dựa vào cookie. ![image](https://hackmd.io/_uploads/B1twmabUC.png) Ngó qua source thì có thể thấy input đã được sanitize bởi [DOMPurify](https://github.com/cure53/DOMPurify) ![image](https://hackmd.io/_uploads/HyhGNpZIA.png) Tuy nhiên DOMPurify ở đây lại không được sử dụng phiên bản mới nhất mà sử v3.1.2. Xem Release thì có thể thấy rõ ràng update log ở phiên bản mới đã chỉnh sửa để fix lỗi bug mXSS ![image](https://hackmd.io/_uploads/SkPMSpZ8A.png) Như vậy thì rõ ràng chắc chắn bài này phải tận dụng được lỗi code của DOMPurify và bypass sanitize để có thể XSS thành công. - [mXSS: The Vulnerability Hiding in Your Code](https://www.sonarsource.com/blog/mxss-the-vulnerability-hiding-in-your-code/) Ban đầu mình cố gắng tìm kiếm thông tin về lỗi mXSS của phiên bản 3.1.2 nhưng lại không thu được gì cả, nên đành phải mở Git log ra để xem file `purify.js` đã thay đổi ra sao sau khi cập nhật lên phiên bản mới. Ở đây mình để ý code đã thêm vào một vài dòng với comment rất chi tiết là để bảo vệ khỏi việc comment bên trong attributes ![image](https://hackmd.io/_uploads/HknB8T-UA.png) Cụ thể đó là những chuỗi như sau nếu có mặt ở trong giá trị của attribute thì attribute sẽ bị xóa ra khỏi node ![image](https://hackmd.io/_uploads/ryGgO6bL0.png) Vậy việc comment ở trong attribute như thế để làm gì? Trước tiên cần phải biết về cách tag `<style>` render nội dụng của nó. Mặc định (trong HTML namespace), content của `style` sẽ được lưu ở dạng raw text, vì vậy, một số kí tự đặc biệt của HTML sẽ bị encode để có thể lưu dưới dạng text. Tuy nhiên, khi `style` nằm trong svg namespace hay mathml namespace lại không chỉ lưu dạng raw text, dẫn tới việc sẽ có thể chứa một tag mới ![image](https://hackmd.io/_uploads/B1lHZCZU0.png) ![image](https://hackmd.io/_uploads/rk3w-AWLC.png) Điều này cũng áp dụng với HTML comment. Nếu tag `style` trong namespace của HTML thì comment không hoạt động, và ngược lại. Đoạn code dưới đây sẽ xảy ra hai trường hợp ```html <style> <!-- </style><p dox="a--> <img src=1 onerror=alert()>"> ``` - Comment không hoạt động: có 2 tag style và p được highlight như trên - Comment hoạt động: phần trong comment sẽ bị lược đi chỉ còn 2 tag là style, img Ta chỉ cần áp dụng điều này vào challenge trên. Trước tiên, ta cần để ý lại `equation_block` đã là math tag, có namespace MathML, `<style>` sẽ được render theo kiểu 'Entities decoding', và vì đã có sẵn nên mình cũng sẽ không cần đưa vào input. Payload để trigger alert như sau: `<div></div><style><!--</style><p class="--><img src=1 onerror=alert()>">` Khi DOMPurify sanitize sẽ có dạng ```html <html div></html div> <html style> \x3C!-- </html style> <html p class="--><img src=1 onerror=alert()>"> ``` Có thể thấy đây chỉ là đoạn code HTML bình thường và sẽ được coi là không có gì nguy hiểm, tag img chỉ là một giá trị của class trong `<p>`. Tuy nhiên khi set `innerHTML` nó lại có dạng như sau ```html <math math id="equation_block"> <html div></html div> <math style> <!--</style><p class="--> <html img src=1 onerror=alert()>\x22\x3E ``` Và thế là ta đi qua sự kiểm duyệt của DOMPurify và trigger XSS thành công. (oke hem ne)