Mark24
浏览器之跨站脚本攻击XSS
什么是XSS攻击
XSS全称是 Cross Site Scripting 为了与CSS区分开故意简称 XSS,翻译过来是 跨站脚本。
XSS攻击是指黑客往HTML中或者DOM中注入恶意脚本,从而在用户浏览页面时利用注入恶意脚本对用户实施攻击的一种手段。
最开始这种攻击时通过跨域来实现的,所以叫做 “跨域脚本”。但是发展到现在,往HTML文件中注入恶意代码的方式越来越多,所以是否跨域诸如脚本已经不是唯一的注入手段,但是XSS这个名字却一直保留至今。
当页面被注入了恶意JS脚本时,浏览器无法区分脚本时被恶意注入的还是正常的页面内容。所以注入的恶意JS脚本也拥有脚本权限。
恶意脚本都能做那些事情?
- 窃取cookie
JS通过 document.cookie
获取cookie信息,然后通过 XMLHttpRequest 或者 Fetch 加上CORS功能将数据发送给而已服务器。恶意服务器拿到用户Cookie信息之后,就可以在其他电脑上模拟用户登录,进行转账操作。
- 监听用户行为
恶意JS可以通过 addEventListener 来界定键盘事件,比如活得用户输入的信用卡等信息,发送给恶意服务器。
- 修改DOM
可以伪造登录窗口,用来欺骗获得用户的用户名、密码
再页面生成浮窗广告影响用户体验
恶意脚本时怎么注入的?
1.储存型XSS攻击
通过上图,我们可以看出存储型XSS攻击⼤致需要经过如下步骤:
- ⾸先⿊客利⽤站点漏洞将⼀段恶意JavaScript代码提交到⽹站的数据库中;
- 然后⽤户向⽹站请求包含了恶意JavaScript脚本的⻚⾯;
- 当⽤户浏览该⻚⾯的时候,恶意脚本就会将⽤户的Cookie信息等数据上传到服务器。
比如用户提交的表单字段中嵌入的时JS脚本代码。
2.反射型XSS攻击
在一个反射型XSS攻击过程中,恶意JS脚本属于用户发给网络请求的一部分,随后网站有吧恶意JS脚本返回给用户。
恶意JS脚本在用户的页面中被执行,黑客就可以利用脚本做一些事情。
举个例子:
⾸先我 们使⽤Node来搭建⼀个简单的⻚⾯环境,搭建好的服务代码如下所示
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;
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
<div>
<%- xss %>
</div>
</body>
</html>
上⾯这两段代码,第⼀段是路由,第⼆段是视图,作⽤是将URL中xss参数的内容显示在⻚ ⾯。我们可以在本地演示下,⽐如打开 http://localhost:3000/?xss=123
这个链接, 这样在⻚⾯中展示就是“123”了(如下图),是正常的,没有问题的。
但当打开 http://localhost:3000/?xss=<script>alert('你被xss攻击了')</script>
这段URL时,其结果恶意脚本被植入页面中。
通过这个操作,我们会发现⽤户将⼀段含有恶意代码的请求提交给Web服务器,Web服务器 接收到请求时,⼜将恶意代码反射给了浏览器端,这就是反射型XSS攻击。在现实⽣活中,⿊ 客经常会通过QQ群或者邮件等渠道诱导⽤户去点击这些恶意链接,所以对于⼀些链接我们⼀ 定要慎之⼜慎。 另外需要注意的是,Web服务器不会存储反射型XSS攻击的恶意脚本,这是和存储型XSS攻 击不同的地⽅。
3. 基于DOM的XSS攻击
通过网络劫持,修改HTML内容。
这种劫持的类型很多,有的通过wifi路由器劫持,有的通过本地软件。他们的共同特点是在web资源传输的过程中或者用户使用过程中修改web的数据。
如何阻止XSS攻击
不论何种类型XSS攻击,他们都有一个共同点,那就是首先往浏览器注入恶意脚本,然后再通过恶意脚本将用户信息发送到黑客服务器上。
所以要阻止XSS攻击,可以阻止恶意注入和恶意消息的发送。
常见组织XSS攻击策略
1.服务器对输入脚本进行过滤或者转化。
2.充分利用CSP
限制加载其他域下的资源文件,禁止向第三方提交数据。提供上报机制,提前发现。
3.使用HttpOnly
很多XSS攻击是来盗用Cookie,还可以通过使用 HttpOnly属性来保护我们的Cookie安全。
服务器可以将某些Cookie设置为 HttpOnly, 他是服务器通过HTTP响应头来设置的。
设置之后无法通过JS读取。