XSS攻击

摘要:

公司要给近期项目检测安全性,主要针对的是Stored XSS攻击方式,借这次就在这里好好总结一下,什么是XSS攻击,为什么会出现XSS攻击,XSS攻击有哪些种类,XSS攻击有什么危害,除了XSS攻击还有哪些web安全隐患。

什么是XSS攻击:

XSS攻击全称Cross Site Scripting即跨站脚本攻击,这里侧重在脚本上,主要是发生在浏览器层面上的攻击方式。

XSS攻击由来:

有一些标签是可以在浏览器渲染页面的时候可以执行脚本的,比如,script、img、iframe等等。如果在这些标签里加入一些可以获取用户信息或者其他不能被暴露出来信息的脚本,这就是XSS攻击。

XSS攻击的种类:

XSS攻击方式有三种:(1)Reflected XSS(2)Stored XSS (3)Dom-based XSS

Reflected XSS:

反射性XSS攻击的攻击方式是依赖于客户端发起请求(该请求url中带有可执行的脚本元素),服务端返回脚本被浏览器执行的方式进行攻击。

栗子:

 1 <!doctype html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="utf-8">
 5     <script type="text/javascript" src="jquery-3.3.1.min.js"></script>
 6 </head>
 7 <body>
 8     <textarea style="width:300px;height:200px;" id='input'></textarea>
 9     <button id='button'>Click</button>
10     <div style="width:300px;height:200px;" id='show'></div>
11     <!-- <script src='test.js'></script> -->
12     <script type="text/javascript">
13         var btn = document.getElementById('button');
14         btn.addEventListener('click', function (e) {
15             var value = document.getElementById('input').value;
16             var xhr = new XMLHttpRequest();
17             var url = './get?param=' + value;
18             xhr.onreadystatechange = function () {
19                 if (xhr.readyState === 4) {
20                     var res = JSON.parse(xhr.responseText).param;
21                     document.getElementById('show').innerHTML = res;
22                 }
23             }
24             xhr.open('GET', url, true)
25             xhr.send(null)
26         })
27     </script>
28 </body>
29 </html>

server端代码:

 1 var express = require('express');
 2 var path = require('path');
 3 var router = express.Router();
 4 
 5 
 6 var app = express();
 7 
 8 app.use('/', express.static(__dirname));
 9 
10 app.get('/get', function (req, res) {
11     res.json(req.query);
12 })
13 
14 app.post('post', function (req, res) {
15     res.json(res);
16 })
17 
18 app.listen(2222, () => console.log('listening on port 2222.'))
19 module.exports = app;

输入脚本:

XSS攻击

点击click后的效果:

XSS攻击

可以看到事先设置的cookie被打出来了,这就是reflected XSS攻击。

Restored XSS:

持久性的XSS攻击,常见情况就是提交表单元素时带有script、img等标签保存到数据库中,然后在浏览这些信息的页面加载得时候渲染这些dom执行脚本,不过也不是所有的页面都需要我们将标签进行处理,如果当存入的这些带有执行标签的内容以文本形式在浏览器中进行渲染时,是不会执行的,只有一些特别情况,比如innerHTML或者React中的dangerouslySetInnerHTML,可以将字符串当成dom进行加载,这样的就必须处理,不然就会出现Restored XSS攻击漏洞,React定义dangerouslySetInnerHTML还是有一定道理滴。

Based-dom XSS:

基于dom的XSS攻击方式完全由客户端完成,不涉及服务器端的配合,加载页面执行脚本的时候就可以发生Based-dom XSS攻击。

栗子:

var value = document.getElementById('input').value;
eval(value);

效果:

XSS攻击

 

所以在 js代码里面,尽可能避免使用eval这样的函数。

场景:

1. 提供一个免费的wifi。

1. 开启一个特殊的DNS服务,将所有域名都解析到我们的电脑上,并把Wifi的DHCP-DNS设置为我们的电脑IP。

2. 之后连上wifi的用户打开任何网站,请求都将被我们截取到。我们根据http头中的host字段来转发到真正服务器上。

3. 收到服务器返回的数据之后,我们就可以实现网页脚本的注入,并返回给用户。

4. 当注入的脚本被执行,用户的浏览器将依次预加载各大网站的常用脚本库。

XSS攻击

(图片在网上找的https://www.cnblogs.com/index-html/p/wifi_hijack_3.html)

解决方式:使用https

其他方式的攻击:

CFRS攻击方式,以及SQL注入,以后总结。