XSS跨站脚本攻击,是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。


XSS的攻击方法

XSS主要分为反射型和存储型两种,它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。

1、反射型

发出请求时,xss代码出现在url中,作为输入提交到服务器端,服务器端解析后响应,xss代码随响应内容一起传回给浏览器,最后浏览器解析执行xss代码。这个过程像一次反射。
(1)xss代码出现在url中,反射型代码特征=明文
(2)服务器端解析后响应,例如在serch中,参数serch传入,同value部分被一起传回。

演示

用express做了一个轻量级服务架构实例模拟xss的反射型攻击,装上依赖之后就可以跑起来。

express艺术
express艺术

路由下的接口通过query获取用户在浏览器中输入的serch的内容

路由router/index.js

1
2
3
4
5
6
7
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express',xss:req.query.xss});
});
module.exports = router;

视图views/index.js

1
2
3
<div class="">
<%- xss %> //将那个接口获取的字段解析显示
</div>
用xss拼接上12之后
用xss拼接上12之后
xss
xss

拼接上了恶意代码,被浏览器拦截,这里关掉浏览器的拦截,再重启服务器

1
2
3
4
router.get('/', function(req, res, next) {
res.set('X-XSS-Protection',0);
res.render('index', { title: 'Express',xss:req.query.xss});
});

拼接上的html和js成功被执行

xss
xss

假如拼接上Iframe,植入广告,这里举例植入百度(我的百度皮肤是自己设置过的,所以可能不一样)
百度成功被嵌入到了页面上
百度成功被嵌入到了页面上

2、存储型

存储型xss和反射型xss的差别仅在于,提交的代码会存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交xss代码,和反射型的差别仅在于提交的代码的存储位置。
存储型的代码不是query数据了,而是sql语句,两者的视图渲染流程一样

1
2
3
4
router.get('/', function(req, res, next) {
res.set('X-XSS-Protection',0);
res.render('index', { title: 'Express',xss:sql()});
});

反射型与存储型的区别

代码不同:
1、反射型,通过req.query.xss获取用户输入进行的脚本攻击
2、存储型,xss:sql(),通过读缓存或者数据库进行的

XSS防御

1、编码

对用户输入的数据进行Html Entity编码
Html Entity

2、过滤

(1)移除用户上传的dom属性,如onerror等
(2)移除用户上传的Style节点、Script节点、Iframe节点等

1
2
3
假如style{body:display:none !important}
假如Script引入一个破坏的js,js对页面有100%操作权限,非同意的
假如iframe植入广告,假如植入之后诱导用户鼠标滑过某个地方就会触发某些事件处理函数

3、校正

(1)避免直接对HTML Entity解码(如果直接进行解码,过滤就没意义了)
(2)使用DOM Parse转换,转正不配对的DOM标签
DOM Parse=把整个字符串或者文本转成dom结构,执行过滤,然后匹配不合适标签

页面中反转译输入内容,前端过滤不安全的标签以及不安全的属性,
不安全的标签有:script,style,link,iframe,frame,img等,只要是自动加载的,改变页面样式,能够执行js的标签
不安全的属性:onerror,onclick等,只要是能够执行js的属性

express框架实现的demo地址

SQL注入

定义

攻击者通过在应用程序中预先定义好的查询语句中加上额外的SQL语句元素,欺骗数据库服务器执行非授权的任意查询。

原理

通过畸形输入巧妙构造符合攻击要求的特殊SQL语句让数据库执行。
比如 你的检测语句是

1
select  * from  user where name='变量1' and password='变量2'

如果能找到记录则判定登陆成功。
那么对方如果在填写用户名和密码的时候写密码’1’ or ‘1’=’1’,把这个替换到最后形成的sql语句就变成了

1
select  * from  user where name='1' or '1'='1' and password='1' or '1'='1'

由于1=1是恒等的。也就会把所有记录给查出来。这样就可以达到不知道密码或者是用户名的情况下完成登陆。

产生原因

对输入缺乏检查过滤。

危害性

通过合法途径执行非法语句,使安全措施失效,隐蔽性强。

防御

做好应用系统输入的检查、尽量不要用系统管理员用户连接数据库、尽量不要使用扩展存储过程

So?

1、SQL注入将恶意代码放置在SQL中执行
2、跨站脚本将恶意代码嵌入到html中执行
3、Cookie注入将将恶意代码放置到Cookie中欺骗服务器,或实现SQL和跨站脚本注入。

对输入内容进行检查是防御注入攻击的有效方法,以尽可能低的权限运行服务可有效降低服务出现安全问题可能带来的风害。