如何进行 XSS 攻击?
XSS 主要分为三种类型:存储型 XSS 攻击;反射型 XSS 攻击和基于 DOM 的 XSS 攻击。
1.存储型 XSS 攻击
通过上图,我们可以看出存储型 XSS 攻击大致需要经过如下步骤:
一个例子:
以 2015 年喜马拉雅就被曝出的存储型 XSS 漏洞为例,看看整个 XSS 攻击流程。
在用户设置专辑名称时,服务器对关键字过滤不严格,使得在编辑专辑名称的时候可以设置为一段 JavaScript,如下图所示:
当 hacker 将专辑名称设置为一段 JavaScript 代码并提交时,喜马拉雅的服务器会保存该段 JavaScript 代码到数据库中。然后当用户打开 hacker 设置的专辑时,这段代码就会在用户的页面里执行(如下图)
恶意脚本可以通过 XMLHttpRequest 或者 Fetch 将用户的 Cookie 数据上传到黑客的服务器。
再通过手动设置 Cookie 就可以绕过,直接登陆喜马拉雅。
以上就是存储型 XSS 攻击的一个典型案例。这是乌云网在 2015 年曝出来的,虽然乌云网由于某些原因被关停了。默哀。
2.反射型 XSS 攻击
在一个反射型 XSS 攻击过程中,hacker 需要找到一个接口漏洞,用户给服务器发送的一些参数后,服务器没有经过处理,直接原封返回了部分参数,就给了黑客可乘之机,把恶意 JavaScript 脚本当参数发给服务器,服务器直接返回了这个脚本字符串,在浏览器 DOM 解析器中就顺利引入恶意脚本达成 hack。
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>
访问:http://localhost:3000/?xss=123
hacker 找到了这个漏洞,拼凑了一个这样的 url:http://localhost:3000/?xss=< script src="xxx">< /script>,然后诱骗你点击后,在页面上就会运行恶意脚本。
值得注意的是,储存型 XSS 和反射性 XSS 有一个特别明显的区别就是反射型 XSS 是不会在服务器中存储脚本的,所有诱骗用户的方式也不同,hack 储存型 XSS的工作量主要在如果上传恶意脚本,剩下的就要等用户点击正常网页,反射型则需要诱骗用户主动点击包含漏洞 url。
3.基于 DOM 的 XSS 攻击
一般来说,hacker 是劫持不了正常的传输网络,但如果有内鬼能通过中间人代理劫持 html 传输,就可以修改 html 文件在其中任意穿插恶意脚本,再发送给用户。一般来说,这种情况出现于运营商中间,所以基于 DOM 的 XSS 我觉得应该称为基于内鬼的 XSS 攻击(狗头)。
如何阻止 XSS 攻击
总结
XSS 攻击就是黑客往页面中注入恶意脚本,然后将页面的一些重要数据上传到恶意服务器。
常见的三种 XSS 攻击模式是存储型 XSS 攻击、反射型 XSS 攻击和基于 DOM 的 XSS 攻击。
这三种攻击方式的共同点是都需要往用户的页面中注入恶意脚本,然后再通过恶意脚本将用户数据上传到黑客的恶意服务器上。而三者的不同点在于注入的方式不一样,有通过服务器漏洞来进行注入的,还有在客户端直接注入的。
针对这些 XSS 攻击,主要有三种防范策略,第一种是通过服务器对输入的内容进行过滤或者转码,第二种是充分利用好 CSP,第三种是使用 HttpOnly 来保护重要的 Cookie 信息。
当然除了以上策略之外,我们还可以通过添加验证码防止脚本冒充用户提交危险操作。而对于一些不受信任的输入,还可以限制其输入长度,这样可以增大 XSS 攻击的难度。
本文分享自微信公众号 - 江南一点雨(a_javaboy)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。