摘要:javascript
公司要给近期项目检测安全性,主要针对的是Stored XSS攻击方式,借此次就在这里好好总结一下,什么是XSS攻击,为何会出现XSS攻击,XSS攻击有哪些种类,XSS攻击有什么危害,除了XSS攻击还有哪些web安全隐患。html
什么是XSS攻击:java
XSS攻击全称Cross Site Scripting即跨站脚本攻击,这里侧重在脚本上,主要是发生在浏览器层面上的攻击方式。jquery
XSS攻击由来:web
有一些标签是能够在浏览器渲染页面的时候能够执行脚本的,好比,script、img、iframe等等。若是在这些标签里加入一些能够获取用户信息或者其余不能被暴露出来信息的脚本,这就是XSS攻击。数据库
XSS攻击的种类:express
XSS攻击方式有三种:(1)Reflected XSS(2)Stored XSS (3)Dom-based XSSjson
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;
输入脚本:
点击click后的效果:
能够看到事先设置的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);
效果:
因此在 js代码里面,尽量避免使用eval这样的函数。
场景:
1. 提供一个免费的wifi。
1. 开启一个特殊的DNS服务,将全部域名都解析到咱们的电脑上,并把Wifi的DHCP-DNS设置为咱们的电脑IP。
2. 以后连上wifi的用户打开任何网站,请求都将被咱们截取到。咱们根据http头中的host字段来转发到真正服务器上。
3. 收到服务器返回的数据以后,咱们就能够实现网页脚本的注入,并返回给用户。
4. 当注入的脚本被执行,用户的浏览器将依次预加载各大网站的经常使用脚本库。
(图片在网上找的https://www.cnblogs.com/index-html/p/wifi_hijack_3.html)
解决方式:使用https
其余方式的攻击:
CFRS攻击方式,以及SQL注入,之后总结。