摘要: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注入,之後總結。