概念:
1、跨站腳本(Cross-Site Scripting),簡稱XSS或CSS或跨站腳本攻擊,是一種針對網站應用程序的安全漏洞攻擊技術,代碼注入的一種。
2、XSS漏洞一直被認為是web安全中危害較大的漏洞,在owasp一直處於top3,而在對sql注入防范越來越嚴密的今天,xss也成了絕大部分黑客更喜歡的漏洞利用方式。
3、XSS可分為三種:反射性、存儲型、DOM型
原理:
攻擊者再有漏洞的前段頁面嵌入惡意代碼,導致受害者訪問頁面時不知情的情況下觸發惡意代碼,獲取受害者關鍵信息。
反射性XSS
反射性XSS又稱非持久型XSS,這種攻擊方式往往具有一次型。
攻擊方式:攻擊者通過電子郵件等方式將包含XSS代碼的惡意連接發給目標用戶。當目標用戶訪問改鏈接時,服務器接收該目標用戶的請求並進行處理,然后服務器把帶有XSS代碼的數據發送給目標用戶的瀏覽器,瀏覽器解析這段帶有XSS代碼的惡意腳本后,瀏覽器解析這段代碼后就會觸發XSS攻擊,完成攻擊者想要的功能(獲取cookie、url、瀏覽器信息、IP等)
例:
1、“輸入”表單中輸入內容,單擊“提交”按鈕后,將輸入的內容放到“輸出”表單中,例如當輸入“12”,單擊“提交按鈕”,“12”將被輸出到“輸出”表單中。
2、當訪問http://127.0.0.1/web/XSS/xss1.php?xss_input_value="><img src=1+onerror=alert('xss')>
輸出到頁面的HTML代碼變成了如下所示。可以看到,輸入的雙引號閉合了value屬性的雙引號,輸入的>閉合了input的標簽<,導致輸入的<img src=1 onerror=alert(‘xss’)>變成了HTML標簽。
瀏覽器渲染時,執行了<img src=1 onerror=alert(‘xss’)>,JS函數alert()導致瀏覽器彈窗。
(注::彈框實際上並不能造成什么危害,但這是我們用來測試xss漏洞點的一個方法。
<script>標簽中可以執行javascript代碼,所以理論上可以做任何事)
存儲型XSS:
存儲型XSS又稱持久型XSS,攻擊腳本將被永久地存放在目標服務器的數據庫或文件中,具有很高的隱蔽性。
攻擊方式:這種攻擊多見於論壇、博客和留言板,攻擊者在發帖的過程中,將惡意腳本連同正常信息一起注入帖子的內容中。隨着帖子被服務器存儲下來,惡意腳本也永久地被存放在服務器的后端存儲器中。當其他用戶瀏覽這個被注入了惡意叫你本的帖子時,惡意腳本會在他們的瀏覽器中得到執行。
例:
1、儲存型XSS頁面實現的功能是:獲取用戶輸入的留言信息,標題和內容,然后將標題和內容插入到數據庫中,並將數據庫的留言信息輸出到頁面上。
2、當輸入標題為<img src=X onerror=alert(‘xss’)>,然后將標題輸出到頁面時,頁面執行了<img src=1 onerror=alert(‘xss’)>,導致彈窗。此時,這里的XSS就是持久性的,也就是說,任何人訪問該URL時都會導致一個顯示XSS的框
DOM型XSS:
DOM全稱Document Object Model,使用DOM可以使程序和腳本能夠動態訪問和更新文檔的內容、結構及樣式。
DOM型XSS其實是一種特殊類型的反射型XSS,它是基於DOM文檔對象模型的一種漏洞。
HTML的標簽都是節點,而這些節點組成了DOM的整體結構——節點樹。通過HTML DOM,樹中的所有結點均可通過JavaScript進行訪問。所有HTML元素(節點)均可被修改,也可以創建或刪除節點。
攻擊方式
用戶請求一個經過專門設計的URL,它由攻擊者提交,而且其中包含XSS代碼。服務器的響應不會以任何形式包含攻擊者的腳本。當用戶的瀏覽器處理這個響應時,DOM對象就會處理XSS代碼,導致存在XSS漏洞。
1、XSS常用的測試語句:
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<a href=javascript:alert(1)>
2、常見的繞過
JS編碼、HTML實體編碼、URL編碼
JS提供了四種字符編碼的策略:
三個八進制數字,如果個數不夠,在前面補0,例如“e”的編碼為“\145”。
兩個十六進制數字,如果個數不夠,在前面補0,例如“e”的編碼為“\x65”。
四個十六進制數字,如果個數不夠,在前面補0,例如“e”的編碼為“\u0065”。
對於一些控制字符,使用特殊的C類型的轉義風格(例如\n和\r)。
HTML實體編碼:
命名實體:以&開頭,以分號結尾如 “<”的編碼是“<”。
字符編碼:十進制、十六進制ASCII碼或Unicode字符編碼,樣式為“&#數值”。例如”<”可以編碼為“<”和“<”。
URL編碼:
在使用XSS編碼測試時,需要考慮HTML渲染的順序,特別是針對多種編碼組合時,要選擇合適的編碼方式進行測試。