XSS 指的是:黑客经过 “HTML 注入 ” 篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击 。javascript
举个例子,咱们把 URL 中的参数,直接写入页面:html
window.onload=function () {
var args = getQueryStringArgs();
var param = args["param"];
document.write(param)
}
复制代码
正常 URL 请求:http://localhost:63342/xss.html?param=123
java
效果: 浏览器
带 XSS 攻击的 URL 请求:http://localhost:63342/xss.html?param=<script>alert(/xssAttack/)</script>
bash
XSS 攻击效果:服务器
源代码: xss
参数中的脚本,被写入页面,并执行。这就是 XSS 攻击。函数
反射型 XSS 只是将用户输入的数据发送给浏览器。即黑客须要诱使用户点击一个恶意连接或按钮,才能攻击成功。这种反射型 XSS 也叫作非持久型 XSS(No-persistent XSS) 。ui
上述的示例,就是典型的反射型 XSS。spa
存储型 XSS 会把用户输入的数据保存在服务器端,因此具备很高的稳定性。存储型 XSS 也叫作 持久型 XSS(Persistent XSS)。
DOM Based XSS 指的是:经过修改页面 DOM 节点造成的 XSS。从效果上来讲,DOM Based XSS 也是一种反射型的 XSS。由于造成缘由特别,因此单独分类。
<body>
<script type="text/javascript">
function save() {
var input_content = document.getElementById("user_input").value;
document.getElementById("content").innerHTML = "<a href='" + input_content + "'>点击</a>";
}
</script>
<input type="text" id="user_input" value="">
<input type="button" onclick="save()" value="肯定">
<div id="content"></div>
</body>
复制代码
点击“肯定”按钮以后,会在页面写入一个 <a>
标签,标签的 URL 是用户输入的内容。
咱们在输入框中键入攻击表达式:
'onclick=alert(/xssAttack/)//
XSS 攻击效果:
攻击表达式中的第一个单引号,闭合掉 href 的第一个单引号,而后插入 onclick 事件,最后再用注释符 //
注释掉代码中的第二个单引号。
修改攻击表达式,还能够直接开始攻击:
'><img src=# onerror=alert(/xssAttack2/) /><'
XSS 攻击效果:
这里首先闭合掉 <a>
标签,而后插入一个 <img>
标签。这里利用了 <img>
标签的 onerror 事件。由于若是在图像加载的过程当中发生了错误,就会触发 onerror 事件 。