共计 1836 个字符,预计需要花费 5 分钟才能阅读完成。
XSS:跨站脚本(Cross-site scripting)
攻击手段和目的: 攻击者使被攻击者在浏览器中执行脚本后,如果需要收集来自被攻击者的数据(如 cookie 或其他敏感信息),可以自行架设一个网站,让被攻击者通过 JavaScript 等方式把收集好的数据作为参数提交,随后以数据库等形式记录在攻击者自己的服务器上。
为了加深自己对 XSS 攻击的理解,特意尝试了一下,并把整个过程记录下来。
攻击过程:①、客户端收集用户数据(如留言、发布文章功能)②、攻击者将留言内容写入了可执行的 JavaScript 代码③、将上面的数据未经处理直接存入数据库④、其他用户查看该网站,看了上面包含了可执行的 JavaScript 代码的文章和评论⑤、其他用户就会在浏览器客户端执行攻击者注入的 JavaScript 代码
本次试验用到如下技术:①、(客户端)原生 Ajax 请求②、(服务端)thinkphp,为了试验方便,不使用数据库,直接返回数据③、Cors 跨域
原生 Ajax 请求
<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8″>
<title>XSS 测试 </title>
</head>
<body>
<div id=”Text”></div>
<input type=”button” value=”XSS 测试 ” onclick=”ajax();”/>
<script type=”text/javascript”>
function ajax() {
// 先声明一个异步请求对象
let xmlHttpReg = null;
if (window.ActiveXObject) {// 如果是 IE
xmlHttpReg = new ActiveXObject(“Microsoft.XMLHTTP”);
} else if (window.XMLHttpRequest) {
xmlHttpReg = new XMLHttpRequest(); // 实例化一个 xmlHttpReg
}
// 如果实例化成功, 就调用 open() 方法, 就开始准备向服务器发送请求
if (xmlHttpReg !== null) {
xmlHttpReg.open(“get”, “http://vueapp.com”, true);
xmlHttpReg.send(null);
xmlHttpReg.onreadystatechange = doResult; // 设置回调函数
}
// 设定函数 doResult()
function doResult() {
if (xmlHttpReg.readyState == 4) {// 4 代表执行完成
if (xmlHttpReg.status == 200) {//200 代表执行成功
document.getElementById(“Text”).innerHTML = xmlHttpReg.responseText;
}
}
}
}
</script>
</body>
</html>
在这里我使用的是 get 请求其中请求地址 http://vueapp.com 是我自定义的地址,使用 Apache 配置
由于这里涉及到跨域问题(出于浏览器安全的同源策略,协议、域名、端口号任一不同都属于跨域)
Failed to load http://vueapp.com/: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘null’ is therefore not allowed access.
我的解决方法是 CORS 在后端的接口中添加这么一行代码
header(‘Access-Control-Allow-Origin:*’); // 允许所有访问源
返回的数据是:
$this->ajaxReturn(array(‘status’ => 0,’info’ => “<img src=’11.png’ onerror=’alert(11)’/>”));
这里我们利用 img 标签的 onerrer 属性来执行 JS 代码,所以 src 属性填一个访问不了就可以触发 onerrer 了
开始测试
点击 XSS 测试 按钮, 结果如图(谷歌浏览器):
这就是一个最最最简单的 XSS 攻击案例
这次我们去一个网站盗用 cookie
可以看到所有的 cookie 信息都在这里了
* 发现的问题
为什么我不直接用 script 标签,而用 img 的 onerror 属性。因为 script 标签有问题,在后台返回来的 script 标签在 dom 是存在的,但是并没有执行 还请各位大佬多多指正