前言:最近由於阮老師blog 被攻擊,對前端安全起了興趣,還有迫於小組分享,就認(大)真(概)的研究了下 Xss
XSS
- xss表示Cross Site Scripting(跨站指令碼攻擊),它與SQL隱碼攻擊類似, SQL隱碼攻擊中以SQL語句作為使用者輸入,從而達到查詢/修改/刪除資料 的目的,而在xss攻擊中,通過插入惡意指令碼,實現對使用者遊覽器的控制。
1、分類
-
反射型(非持久型)
- Url 形成一個攻擊的連結。
-
儲存型(持久型)
- 儲存為伺服器端,論壇留言(等等)
2、看一個栗子?
2.1 demo1
- http://www.insecurelabs.org/
- 進入上面的網站,這是一個有缺陷的沒有進行 xss 篩選的頁面。
- 進入網頁,選中 Agenda 看到有 serach
- 然後我們在搜尋框中輸入具有攻擊的資訊
測試一下網站的安全
- https://translate.google.cn/#zh-CN/en/
- google 翻譯是我們常用的一個網站,我們來試試
<script>alert(123)</script>
複製程式碼
看看網頁的反應。彈出了 123
這就是一個簡單的 XSS 攻擊。
2.2 demo2(Google 翻譯)
- 進入我們常用的 google 翻譯
- 進入網站
輸入兩個
哈哈
進行翻譯
2.我們可以看到 url 上面顯示了我們輸入的 哈哈,說明這裡可以注入
內容。
那我們來注入
一些友(壞)善(壞)的指令碼吧。
https://translate.google.cn/#zh-CN/en/哈哈
//替代為
https://translate.google.cn/#zh-CN/en/<script>alert(123)</script>
複製程式碼
3.回車確定後,會發現瀏覽器幫我做了處理,
- 看看情況
- 可以看到引數 q 沒錯,但是瀏覽器做了 xss 的篩選
我們看到這個,X-XSS-Protection
這個就是我們今天的主題了。
4.我們用 firefox 重新試試上面的 demo(當然你可以在 MDN 直接輸入x-xss-protection)
- 如圖點選這個 ? 號,進入 MDN 看看情況
- MDN 這麼解釋
HTTP X-XSS-Protection響應頭是Internet Explorer,Chrome和Safari的一個功能,當檢測到跨站指令碼攻擊 (XSS)時,瀏覽器將停止載入頁面。雖然這些保護在現代瀏覽器中基本上是不必要的,當網站實施一個強大的Content-Security-Policy來禁用內聯的JavaScript ('unsafe-inline')時, 他們仍然可以為尚不支援 CSP 的舊版瀏覽器的使用者提供保護。
- 其中 xss 語法可以看到
- 語法
X-XSS-Protection: 0
// 這一條代表關閉 XSS 保護
X-XSS-Protection: 1
X-XSS-Protection: 1; mode=block
// 這一條是我們看到的,代表啟用了 xss 保護
X-XSS-Protection: 1; report=<reporting-uri>
複製程式碼
- 其中涉及一個重要的概念就是
CSP
- MDN 是這麼解釋的
HTTP 響應頭 Content-Security-Policy 允許站點管理者在指定的頁面控制使用者代理的資源。除了少數例外,這條政策將極大地指定服務源 以及指令碼端點。這將幫助防止跨站指令碼攻擊(Cross-Site Script) (XSS).
-
當然上面都是九牛一毛,需要大家自己詳細的看看 MDN 的解釋
-
怎麼啟用 CSP ?
-
1、http 頭資訊 的 Content Security Policy
-
2、用 另外一種是通過網頁的 標籤
-
// header
Content-Security-Policy: default-src https:
// meta tag
<meta
http-equiv="Content-Security-Policy"
content="default-src https:">
複製程式碼
3、搭建一個簡單的 node-express 環境
3.1 搭建環境
- 1/搭建環境:(當然我們預設你安裝了 node express npm )
mkdir demo
// 新建一個 demo 資料夾
cd demo
express -e ./
// 搭建 express 腳手架,ejs 和模板引擎
npm install
// 安裝依賴包
複製程式碼
3.2 修改程式碼
- 2/設定路由 routes/index.js
router.get("/", function(req, res, next) {
res.set("X-XSS-Protection", 0);
//關掉瀏覽器對XSS的檢測
res.render("index", {title: "Express", xss: req.query.xss});
}); //query是express獲取search的欄位
複製程式碼
- 3/在 view/index.ejs 中新增
<div class="">
<%- xss %><!--'-'表示允許輸入html,不需要轉義-->
</div>
複製程式碼
- 4/看下路由設定一些埠 在 bin/www
//找到這一行
var port = normalizePort(process.env.PORT || "3000");
app.set("port", port);
// 我們改成
var port = normalizePort(process.env.PORT || "6060");
console.log("listen on port:6060");
app.set("port", port);
複製程式碼
當然這個埠號無所謂,未來不衝突,所以選個吉利的數字,console 是為了在控制檯看到自己成功 start 了
- 5/ 開啟服務
npm start
複製程式碼
- 6/ 在
http://localhost:6060/
後輸入
?xss=<iframe src="//baidu.com/h.html"></iframe>
或者?xss=<img src="null" onerror="alert("1")">
或者?xss=<p onclick="alert("1")">點我點我</p>
- 進行模仿 XSS 的放射型攻擊。第一個效果如下圖:
- 7/開啟你的瀏覽器的控制檯,我們來看看情況,看到 ELments 中,檢視在 url 中輸入的連結是否成功的入侵到我們的 div 中了。
其實 XSS 雖然我們平時在開發的時候沒有特別注意,
下一篇文章
- 我會搭建一個儲存型的 node-express-xss 環境
- 這次我們建立一個複雜的 demo
- 通過構建 Node 服務和建立一個評論功能,使用 ajax 例項演示 XSS 的攻擊和預防
主要由伺服器端轉義,客戶端反轉義,再
DomParse
,再過濾,使用encode.js
和 domparse.js
第三方庫對文字進行解碼
和DOM parse
操作
參考
- imooc (https://www.imooc.com/)
- MDN (https://developer.mozilla.org)
- CSP 圖解(google 圖片)