XSS 跨站腳本攻擊總結

漏洞起因

可以輸入的地方沒有做好對應的過濾,引發的xss攻擊

漏洞危害

  1. 盜取cookie
  2. 劫持用戶瀏覽器
  3. 釣魚攻擊
  4. 掛馬
  5. 在一定的條件下可以getshell
  6. 會話劫持

漏洞類型

  1. 反射型XSS(危險級別:低),插入的語句停留在當前頁面。
  2. DOM型XSS (危險級別:中), DOM型xss又分為兩種 (a.可見型、b.不可見型),插入的語句影響js 。
  3. 存儲型XSS(危險級別:高),插入的語句保存在數據庫 。
  4. 其他型XSS(例如:Flash xss)。

漏洞實驗

本次實驗我們以著名的安全脆弱性平臺DVWA為例:

在low級別下的測試,沒有任何防禦。可以插入任意標籤如:

<code>/<code> 
XSS 跨站腳本攻擊總結

如果過濾了alert()如何繞過呢?

直接上後端PHP代碼:

<code>/<code>

前端顯示html代碼如下:

<code>        <title>Demo1/<title>

輸入你的名稱

/<code>

當輸入alert的時候就會被替換成空,當然我們可以使用其他的什麼標籤來代替script,但是如果只用script如何繞過呢?使用js轉義。將alert轉義。

當js解釋器在標識符名稱(例如函數名,屬性名等等)中遇到unicode編碼會進行解碼,並使其標誌符照常生效。而在字符串中遇到unicode編碼時會進行解碼只會被當作字符串。

也就是說unicode編碼只能編碼屬性名

示例payload如下:

<code>/<code>

經過js轉義後,代碼如下:

<code>/<code>
XSS 跨站腳本攻擊總結

payload成功執行alert

注意:使用unicode編碼之前要確定對方有沒有過濾“\\”

html轉義:

<code>當瀏覽器接受到一份HTML代碼後,會對標籤之間(

xxx

等,之間的情況:
<code>

繞過:

<code>]";/*  * */#echo "";?>/<code>

繞過:

<code>1' onclick='alert(1)/<code>
XSS 跨站腳本攻擊總結

假設輸出在img標籤裡:

<code>";echo $c;#echo "";#echo " ";/*  * */#echo "";?>/<code>

繞過:

<code>'1/**/onerror='alert(1)/<code>
XSS 跨站腳本攻擊總結

輸出在標籤裡的繞過總結:

  1. 先想辦法閉合周圍的什麼雙引號之類的東西
  2. 判斷有什麼過濾掉的,如果沒有過濾自然最好
  3. 查詢標籤對應可以執行js的屬性,然後插入代碼即可

DOM型xss分為兩種:

  1. 可見型DOM xss
  2. 不可見型DOM xss

何為DOM?,你插入的代碼會暫存在某些標籤之中,並且影響輸出。

DVWA的DOM xss就是不可見類型。

XSS 跨站腳本攻擊總結

源代碼不可見:

XSS 跨站腳本攻擊總結

但是F12可見:

XSS 跨站腳本攻擊總結

low級無任何防禦直接插入payload:

XSS 跨站腳本攻擊總結

medimu級過濾了script:

<code>
<code>使用: //要閉合select標籤,因為img在select標籤裡面是不可見的/<code> 
XSS 跨站腳本攻擊總結

high級對default進行了判斷:

<code>/<code>

使用#殺掉判斷:

<code>#/<code>
XSS 跨站腳本攻擊總結

存儲型xss:當我們插入的惡意代碼都會保留在數據庫,下次在訪問此頁面的時候就會自動執行js。

XSS 跨站腳本攻擊總結

溫馨提示:用beef來配置存儲型xss是個不錯的選擇哦!

總結:

<code>xss漏洞起因    沒有做好對應的過濾標籤措施,導致攻擊者可以注入惡意代碼對付那種無任何過濾的     
輸出在<script>之間的情況(意思就是你在script裡面,得把前面的閉合了在注入語句,然後因為你在script裡面直接輸入語句即可) 先閉合上一個script然後在注入惡意代碼: 構造的xss語句:http://xxx.com/jj.php?xxx=%0aalert(1) //) #通過%0a換行符,換到了沒有註釋的下一行然後閉合掉後面的括號使用反斜杆構造xss 當輸入的語句處於多行js代碼之中,使用\\分開,例子: 使用\\分割語句然後想辦法閉合 :反彈xss一般出現在url攔DOM型xssDOM型的xss就是通過輸入,改變了js代碼的一部分。dom型xss又分兩種:1.可見型DOM xss,輸入的東西改變了頁面的源碼。但是F12查看源碼可見類似於:<strong>按職業1檢索:aaaaaaa aaaaa為我們輸入的,假設現在被過濾了。但是\\沒被過濾,該如何構造xss呢由於\\沒有被過濾,使用unicode編碼,變為被url解釋器解釋完後為 ,url中出現了javascript:,指明瞭後面的語句要當作js執行,所以再次把解釋後的字符交給js解釋器解釋,可以彈窗。當js解釋器在標識符名稱(例如函數名,屬性名等等)中遇到unicode編碼會進行解碼,並使其標誌符照常生效。而在字符串中遇到unicode編碼時會進行解碼只會被當作字符串。如: unicode編碼在標籤的屬性之中可用,如果在輸出使用不會影響上下文 參考文章:https://www.cnblogs.com/iceli/p/8598709.html2.不可見型DOM xss 類似於DVWA裡的DOM型xss,只能用調試工具定位。審核源代碼是看不見的 記錄一些DOM型xss常用的語句: 在iframe中執行js:<iframe> <iframe> <iframe> IE執行VBScript代碼 <iframe> chrome執行data協議代碼 <iframe> 上面的變體 <iframe> chrome下的srcdoc屬性 總結:在探測一個地方是否有xss的時候,插入好搜索的語句例如:aaaaaa。然後f12源碼搜索,分析出現的地方,看看哪裡能實現xss。如果有被過濾 了,先試試html轉義,注意閉合。當\\符號沒被過濾的時候可以使用unicode編碼來進行代替被過濾的函數或符號 (前提是在script標籤裡) 存儲型xss: 一定要記住本節最開頭的話,存儲型XSS,輸出的位置不一定出現在輸入的位置。 7. 因而我們有時候需要逆向的思維,來尋找存儲型XSS。大概思路如下: 7.1 先找到輸出點,然後猜測此處輸出是否會被過濾。 7.2 如果覺得可能沒過濾,我們再找到這個輸出是在哪裡輸入的。 7.3 接著開始測試輸入,看輸出的效果。 7.4 如果沒過濾,那麼你就成功了,否則你可以放棄掉它。xss 存儲型payload:http://html5sec.org//<iframe>/<code>
"/<code>


分享到:


相關文章: