XSS基礎學習筆記

XSS基礎

XSS概念:

通常情況下,在Web應用的網頁中,有些部分的顯示內容會根據外屆輸入值而發生變化(會反彈惡意代碼),而如果生成這些HTML的程序中存在問題,就會滋生名爲跨站腳本(Cross-Site Scripting)的安全隱患。由於它和知名的CSS(層疊樣式表)縮寫衝突,所以經常縮寫爲XSS。

XSS的實質其實是HTML代碼與Javscript代碼的注入。但由於XSS的攻擊對象是與客戶對等的Browser端,因此常常不被開發者所重視。

一般意義上的XSS通常可以用簡單的方法檢測出來:當用戶輸入中某個參數的全部或其中一部分,原封不動地在源代碼裏出現時,我們就可以認爲這個參數存在XSS漏洞。

XSS的風險:

Web應用若存在XSS漏洞,就會有如下風險:

  • 用戶的瀏覽器中運行攻擊者的惡意腳本,從而導致Cookie信息被竊取,用戶身份被報名頂替。
  • 攻擊者能獲得用戶的權限來惡意使用Web應用的功能。
  • 向用戶顯示僞造的輸入表單,通過釣魚式攻擊竊取用戶的個人信息。

XSS漏洞總覽:

  • 產生地點:Web應用中南生成HTML和JavaScript的地方。
  • 影響範圍:Web應用全體
  • 影響類型:在網站用戶的瀏覽器中執行JavaScript,顯示僞造的網站內容。
  • 影響程度:中~大。
  • 用戶參與程度:需要—> 瀏覽惡意網站、點擊郵件內的附屬連接、瀏覽已被入侵的網站等。
  • 對策概要:用雙引號括起來屬性對,轉義HTML中的特殊字符。

XSS被惡意使用的三種方法:

  1. 竊取Cookie值
  2. 通過JavaScript攻擊
  3. 篡改網頁

同源策略:

  • 同源策略:來自相同網站的頁面。
  • 不同源策略:來自不同網站的頁面。

跨站腳本類型:

XSS分類:可根據不同分類方式,分爲不同類型。

  • 按形式分:反射型XSS 存儲型XSS
  • 按介質分:JSXSS FlashXSS
  • 按接口分:DOM base XSS , 非DOM XSS

注:因此沒有反射型XSS、存儲型XSS、DOM XSS這種分類,因爲分類依據都不同…

反射型XSS:

如果攻擊用JavaScript代碼位於攻擊目標網站之外的其他網站(惡意網站或者郵件中的URL),就 稱爲反射型的XSS(Reflected XSS)。

竊取Cookie實例中用到的XSS攻擊模式就屬於反射型XSS。

**反射型XSS多發生於網頁將用戶輸入值原封不動地顯示出來的情況。**其中,輸入值確定頁面就是一個典型的例子。

存儲型XSS:

有時攻擊者也會將攻擊用JavaScript代碼保存至攻擊對象的數據庫中。這種模式的XSS就被稱爲存儲型的XSS(Stored XSS)或持久性的XSS(Presistent XSS)。

存儲型的XSS的典型攻擊對象爲Web郵箱客戶端以及社交網站(Social Networking Service,簡稱SNS)。

存儲型XSS無需攻擊者費勁心思將用戶引誘至惡意網站,而且即使是戒心很重的用戶也會有很大的機率中招,因此對攻擊者來說益處多多。

存儲型XSS:

  • 長期存儲與服務器端
  • 每次用戶訪問都會被執行JS腳本

客戶端表單長度限制:

  • 客戶端源碼修改限制
  • 代理截斷

DOM型XSS:

  • DOMXSS漏洞是基於文檔對象模型(Document Object Model)的一種漏洞。
  • DOM是一套JS和其他語言課調用的API(遍歷、獲取、修改)。
  • 根據XSS在DOM中輸出點的不同,DOM XSS機有可能是反射型,也有可能是存儲型。
注意:‘#’,它告訴瀏覽器所有在它後面的東西都是個片段,也就是不作爲查詢的一部分。IE(6.0)和Mozilla不會把這個片段發送到服務器,因此服務器端看到的只是#號前面提交的參數。這樣如果#號後面填充了惡意腳本,就不會被服務器端看到。
如果服務器端直接讀取客戶端提交參數的所有,重寫改寫頁面,就會將惡意腳本寫到頁面。在寫頁面時,需要先使用URL解碼。

兩種典型的DOM過程:

**反射型DOM base XSS: **

  1. 用戶輸入帶有參數的URL
  2. JavaScript處理URL並獲取參數
  3. 通過DOM調用參數對頁面進行排版。
  4. 通過DOM動態輸出到頁面上。

存儲型DOM base XSS:

  1. 用戶輸入帶有參數的URL或者Body域數據
  2. 服務器將參數存入數據庫
  3. 通過JSON格式返回參數到頁面
  4. 通過DOM調用參數進行排版
  5. 通過DOM動態輸出到頁面上。

XSS產生的根源:

XSS漏洞產生的原因爲,生成HTML的過程中,HTML語法中含有特殊意義的字符(元字符)沒有被正確處理,結果導致HTML或JavaScript被肆意注入,從而使得原先的HTML結構產生變化。爲了消除元字符的特殊意義,將其轉化爲普通字符,就需要用到轉義(Escape)處理。HTML的轉義處理對消除XSS至關重要。

HTML轉義:

在HTML中顯示< 時,必須按照字符實體引用(Character Entity Reference)將其轉義記載爲 &lt;而如果忽略這一步驟直接生成HTML的話,瀏覽器會將 < 解釋爲標籤的開始。從而就或招致惡意利用此漏洞進行的XSS攻擊。

在HTML中,根據字符所處位置的不同,應當轉義的元字符也會發生變化。

元素內容轉義:

  • 特徵:能解釋Tag和字符實體;結束邊界字符爲<。
  • 轉義:< 和 & 使用字符實體轉義。

PHP轉義函數:

htmlspecialchars($String, $quote_style, $charset)

  • $string :轉換對象字符串

  • $quote_style:轉換方法。

    轉換前 轉換後 ENT_NOQUOTES ENT_COMPAT ENT_QUOTES
    < &lt; 支持 支持 支持
    > &gt; 支持 支持 支持
    & &amp; 支持 支持 支持
    " &quot; 不支持 支持 支持
    &#39; 不支持 不支持 支持

    一般使用最後一種即可:ENT_QUOTES

  • $charset:字符編碼。如UTF-8、GBK。

屬性值(雙引號中南的內容)轉義:

  • 特徵:能解釋字符實體;結束邊界字符爲雙引號。
  • 轉義:屬性值用雙引號括起來,< 和 & 和 " 使用字符實體轉義。

XSS的輔助性對策:

  • 輸入校驗:通過檢驗輸入值的有效性,當輸入值不符和條件是就顯示錯誤消息,並促使用戶重新輸入,有時也能夠防禦XSS攻擊。

  • 給Cookie添加HttpOnly屬性:Cookie中有名爲HttpOnly屬性,該屬性能禁止JavaScript讀取Cookie值。

    通過給Cookie添加HttpOnly屬性,能夠杜絕XSS中竊取會話ID這一典型的攻擊手段。但需要注意的是其他攻擊手段依然有效,所以這樣只能是限制了攻擊者的選擇範圍,並不能杜絕所有的XSS攻擊。

    php.init:session.cookie_httponly=On

XSS對策總結:

根本性對策(個別對策)

  • HTML的元組內容:使用htmlspecialchars函數轉義。
  • 屬性值:使用htmlspecialchars函數轉義並用雙引號括起來。

根本性對策(共通對策)

  • 明確設置HTTL響應的字符編碼。

輔助對策

  • 輸入校驗
  • 給Cookie添加HttpOnly屬性。

XSS進階

HTML組成元素

  • 腳本(事件綁定)
  • 事件綁定函數中的字符串字面量
  • 屬性值/(URL),屬性位置防止雙引號。
  • 元素內容,元素位置防止尖角符號。
  • script元素中南的字符串字面量

JavaScript問題:

之所以會混入安全隱患,是因爲沒有將JavaScript字符串字面量進行轉義。因此,輸入參數中的單引號沒有被識別爲字符,而是被當成了JavaScript中南字符串的結束符。

爲了避免這種情況,理論上應採取如下措施:

  • 首先,將數據作爲JavaScript字符串字面量進行轉義。
  • 將得到的結果再次進行HTML轉義。

JS字符串字面量中南應被轉義的字符:

原字符 JavaScript轉義後 HTML轉義後
<>’ " \ < > \’ \" \\ &lt; &gt;&#39;&quot; \\
<?php
function escape_js($s){
    return mb_ereg_replace('([\\\\\'])', '\\\1', $s);
}
?>

<body onload="init('<?php echo htmlspecialchars(escape_js($_GET('name')), ENT_QUOTES, "UTF-8"); ?>')">
</body>

JS字符串字面量動態生成的對策:

按照JavaScript語法,將引號(單引號及雙引號)和斜槓\及換行符等進行轉義。"\"" 。如果是事件綁定函數,將JS執行結果按照字符實體進行HTML轉義, 並用雙引號括起來。

如果是在script元素中,執行JS後,確保字符串中不存在</ 。

雖然理論上如此,但JavaScript的轉義規則相當複雜,執行起來很容易產生疏漏,因此一直以來都是安全隱患誕生的溫牀。鑑於這種情況,最好的辦法可能是避免動態生成JavaScript。然而,現實中又會經常需要傳給JavaScript的參數是動態的。此時,一般使用Unicode轉義的解決方案。

Unicode轉義:

爲了避免動態生成JavaScript帶來的風險,可以採取將字母和數字以外的其他所有字符都進行轉義的方法。這種方法利用了JavaScript能將Unicode代碼點U+XXXX字符轉義爲\uXXXX的功能。


輔助方案:錯誤消息導致的信息泄露。

  • 錯誤消息中包含對攻擊者有幫助應用程序內部信息。
  • 通過蓄意攻擊使錯誤信息中顯示隱私信息(如用戶個人信息等。)

應用程序內部信息是指,發生錯誤的函數名、數據庫的表名、列名等,這些信息都可能成爲攻擊的突破口。

爲了解決以上問題,當應用程序發生錯誤時,應該僅在頁面上顯示“此時訪問量太大,請稍後再試”等提示用戶的消息。

PHP的情況下,禁止顯示詳細錯誤信息,只需要在php.ini中做如下設置:

display_errors = Off

HTML轉義概要:

位置 說明 轉義概要
元素內容(普通文本) 能解釋Tag和字符實體。結束邊界符爲 <。 < 和 & 使用字符實體轉義。
屬性值 能及時字符實體。結束邊界字符爲雙引號 屬性值用雙引號括起來,< 和 & 和 ”使用字符實體轉義
屬性值(URL) 同上 檢驗URL格式正確後按照屬性值的規則轉義。
時間綁定函數 同上 轉義JavaScript後按照屬性值的規則轉義
script元素中字符串字面量 不能解釋Tag和字符實體。結束邊界字符爲</ 轉義JavaScript並避免出現"</"

XSSer簡介-確認XSS存在的工具

XSSer概述:

跨站點“Scripter”(又名XSSer)是一個自動化框架,用於檢測、利用以及報告基於Web應用程序
中的XSS漏洞。

XSS是Web應用常見的漏洞。利用該漏洞,安全人員在網站注入惡意腳本,控制用戶瀏覽器,併發起其他滲透操作。XSSer是Kali Linux提供的一款自動化XSS攻擊框架。該工具可以同時探測多個網址。如果發現XSS漏洞,可以生成報告,並直接進行利用,如建立反向連接。爲了提供攻擊效率,該工具支持各種規避措施,如判斷XSS過濾器、規避特定的防火牆、編碼規避。同時,該工具提供豐富的選項,供用戶自定義攻擊,如指定攻擊載荷、設置漏洞利用代碼等。

一個自動框架、檢測,利用和報告基於Web應用的XSS漏洞。

支持命令行、圖形化界面。

提供繞過服務器過濾的選項,以及一些特殊的代碼注入技術。

XSSer經典命令:

-u URL, --url=URL  添加URL
-g Getdata	使用GET提交數據
-p POSTdata 使用post提交數據
--cookie=COOKIE 提供cookie信息
-s, --statistics 顯示統計信息
-v, --verbose 展示詳細結果
--reverse-check 反向連接檢查

BeEF攻擊簡介

BeEF概述:

通過XSS漏洞,將hook.js腳本注入,可將中招的客戶端掛起。

如果客戶端瀏覽器關掉,則連接會斷開。

可以做持久化連接。不讓用戶關閉瀏覽器,或者後臺開一個小窗。

BeEF(Brower exploitation framerwork):

  • 生成,交付Payload
  • Ruby語言編寫
  • 服務器端:管理Hooked客戶端
  • 客戶端:運行與客戶端瀏覽器的JS腳本(hook)

降低白帽子對JS代碼的要求。

BeEF主要針對瀏覽器(客戶)進行攻擊。

  • 應用普遍轉移到B/S架構,瀏覽器稱爲唯一客戶端程序。
  • 結合社會工程學方法對瀏覽器進行攻擊。
  • 攻擊瀏覽器用戶
  • 通過注入的JS腳本,劉勇瀏覽器工具其他網站

BeEF攻擊手段:

  • 利用網站XSS漏洞實現攻擊
  • 誘使客戶端訪問包含hook的僞造網站
  • 結合中間人攻擊注入hook腳本
軟件攻擊模塊顏色介紹:
- 綠色模塊:表示模塊適合目標瀏覽器,並且執行結果客戶端不可見
- 紅色模塊:表示模塊不適合目標瀏覽器,有些紅色模塊也可正常運行
- 橙色模塊:模塊可用,但是結果對用戶可見(例如:彈窗申請全新等)
- 灰色模塊:模塊未在目標瀏覽器測試過

BeEF常見用途:

  • 鍵盤記錄器
  • 網絡掃描
  • 瀏覽器信息收集
  • 綁定shell
  • 與Metasploit集成

學習筆記記錄。與相關資料整理。

參考資料:

https://blog.csdn.net/daxueba/article/details/77703872

http://blog.nsfocus.net/xss-advance/#_XSS


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章