XSS攻击(Cross site Scripting),跨站脚本攻击,通过插入恶意脚本并在用户浏览页面时主动或者被动触发的一种攻击方式;
XSS一般分为反射型和存储型;
反射型
反射型XSS攻击是为形象描述它的路径而产生的名称,指的是恶意脚本以查询字符串的形式在用户发出请求时的URL中,提交给服务器后服务器会进行相应的解析,然后将带有XSS代码的响应返回给浏览器,浏览器会解析响应中的XSS并执行;这个过程中XSS代码从浏览器到服务器端,然后又被“反射”回来;
反射型中又包括主动触发(请求后自动触发)和被动触发(需要用户的特定操作)
正常情况下浏览器会拦截XSS攻击,并给出相应的错误信息:
我们可以使用express -e搭建一个服务器,使用ejs模板;然后进行xss攻防演练;
// express服务器搭建
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.set('X-XSS-Protection', 0);
res.render('index', { title: 'Express', xss: req.query.xss});
});
// ejs模板
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
<%- xss %> // '-'表示允许输出HTML
</body>
</html>
当设置URL为http://localhost:3300/?xss=<img src="" onerror="alert(1)"/>
或者http://localhost:3300/?xss=<script>alert(1)</script>
会自动进行
当设置URL为http://localhost:3300/?xss="<p onmouseover="alert(1)">hello world</p>"/>
或http://localhost:3300/?xss=<button onclick="alert('XSS')">点我</button>
需要通过用户操作触发;
另外,可以借助XSS通过iframe标签进行广告植入等;如设置URL为http://localhost:3300/?xss=<iframe src="http://baidu.com"></iframe>
,效果如下:
存储型
存储型XSS是一种持久化的攻击手段,代码一般存储在服务器端的数据库,内存等地方,XSS代码往往是由于服务器对于用户输入没有进行充分的过滤而导致了可以造成存储型XSS攻击的脚本被存入到服务器端;一旦脚本被保存在服务端,下次请求就不用携带xss脚本而可以直接从数据库或者缓存中读取;
由于脚本保存在服务端,这种类型的XSS攻击对象广泛,而且可以盗取用于cookie并利用;
比如,在一个未对用户博文进行充分过滤的博客网站存在存储型XSS攻击时,当其他用户访问时均会受到攻击;
XSS防御
主要有三种方式:编码、过滤和校正;
1、编码:对用户输入的数据进行HTML entity编码;比如常见的“<”">"等,具体可以参见http://www.freeformatter.com/html-entities.html
2、过滤:移除用户上传的DOM属性,如onmousemove等;移除用户上传的style节点、script节点、iframe节点;
3、校正:避免直接对HTML entity解码;使用DOM Parse转换,校正不配对的DOM标签(标签闭合);
用户提交信息时,在客户端或者服务端进行反转义后再进行存储;用户请求信息时,进行反转义和DOM Parse进行解析(可以检测标签配对、过滤特定标签或者属性然后再将DOM对象显示),进行XSS攻击的防御;
参考文献
1、慕课网教程“Web安全-XSS”
2、DOM Parser: https://developer.mozilla.org/en-US/docs/Web/API/DOMParser