面幾篇文章我們講到了跨站腳本(XSS)漏洞的幾種類型和驗證方法以及防御措施,有興趣的朋友可以到我的主頁翻看文章《十大常見web漏洞——跨站腳本漏洞》和《實操web漏洞驗證——跨站腳本漏洞》,今天我們繼續由易到難實戰演示一下跨站腳本漏洞的形成,以便更好地了解漏洞的產生原理,進一步做好防御。
上一篇文章我們已經闖過了5關,今天我們繼續。
html事件是在滿足一定條件的用戶行為發生時,所觸發的的事件,例如當單擊鼠標時的“onclick”以及當瀏覽器加載圖像時的“onload”,我們可以將這些特定的html事件發生時,將JavaScript語句作為屬性傳遞給特定的標簽,從而構成一個或多個JavaScript命令或函數。
下圖我們從網上搜索了一些html事件屬性,有興趣的可以自己搜索學習。
html事件屬性
在這一關中,我們可以構造語句:
111" onmouseover="alert(document.domain);"
前邊的“111"”是為了閉合標簽,后邊的“onmouseover”屬性表示當鼠標移動到輸入框時執行后邊的語句,點擊“search”按鈕,將鼠標移動到輸入框時,頁面在彈出內容為當前頁面域名的彈窗后,提示“恭喜!”,就可以順利進入下一關了,如下圖所示:
恭喜通關
這一關我們先來探測一下注入點的情況,我們和之前一樣先閉合標簽,輸入“123456"”來閉合標簽,找到對應的代碼,發現我們輸入的內容被另一對引號括住了,如下圖所示:
頁面代碼
這表明我們輸入的內容直接被實體化了,那我們不使用引號閉合,直接輸入“123456 onmouseover=“alert(document.domain)””,發現只要是等號后邊的參數都被引號括了起來,如下圖所示:
頁面代碼
因此我們都不加引號,構造:
123456 onmouseover=alert(document.domain)
注意中間有個空格,點擊“search”按鈕時,頁面在彈出內容為當前頁面域名的彈窗后,提示“恭喜!”,就可以順利進入下一關了,如下圖所示:
恭喜通關
有時候我們需要將JavaScript代碼添加到客戶端中,這時就需要JavaScript偽協議來幫助,它的格式為JavaScript:url,例如:JavaScript:alert("hello word!"),就是一個簡單的通過JavaScript偽協議來執行alert("hello word!")語句,它表示在頁面顯示“hello word!”。
因此我們可以構造語句
JavaScript:alert(document.domain);
點擊“Make a Link”按鈕時,可見輸入框下邊出現一個URL超鏈接,我們點擊這個鏈接,如下圖所示:
URL超鏈接
頁面在彈出內容為當前頁面域名的彈窗后,提示“恭喜!”,就可以順利進入下一關了,如下圖所示:
恭喜通關
這個比較簡單,因為UTF-7絕大多數瀏覽器都已經不用了,我們很少會遇到,因此我們直接構造語句:
onclick=alert(document.domain);
我們按F12鍵,根據下圖提示找到第三步位置,將以上語句寫入到對應位置,再點擊第二步的位置,如下圖所示:
修改頁面代碼
頁面在彈出內容為當前頁面域名的彈窗后,提示“恭喜!”,就可以順利進入下一關了,如下圖所示:
恭喜通關
首先我們還是老辦法構造閉合語句,如下所示:
"><script>alert(document.domain);</script>
點擊“search”,按F12,找到如下圖紅框中的位置,發現我們上邊構造的語句中“domain”被刪除了,如下圖所示:
頁面代碼
既然被刪除了,這時我們可以通過雙寫來繞過domain被刪除這種情況,我們可以構造:
"><script>alert(document.dodomainmain);</script>
注意我們在單詞domain中間又加了一個單詞domain,這時系統在刪除一個單詞domain后,還會留下一個domain,這樣我們就成功執行了語句了。
點擊“search”按鈕時,頁面在彈出內容為當前頁面域名的彈窗后,提示“恭喜!”,就可以順利進入下一關了,如下圖所示:
恭喜通關
當然我們也可以通過編碼的方法來繞過,我們可以構造:
"><script>eval(atob('YWxlcnQoZG9jdW1lbnQuZG9kb21haW5tYWluKTs='));</script>
其中“eval”是用來執行字符串,其后邊的內容會當成JavaScript語句執行,“atob”表示將加密的base64密文,轉換成原文,而里邊的一串亂碼就是通過base64加密過的的“alert(document.domain)”語句,關于加密,有興趣的可以閱讀我的文章《Web滲透測試——密碼學基礎》,其實和上邊的語句一樣,這樣就可以避免domain被刪除了。
以上就是跨站腳本(XSS)漏洞實戰演示——由易到難第二部分的全部內容,希望對你了解XSS漏洞有所幫助,歡迎關注@科技興了解更多科技尤其是網絡安全方面的資訊和知識。
對于xss這一個漏洞十分感興趣,或者出于各種各樣的目的需要深入學習,其實絕大多數網絡上博客、包括一些開源的工具,時效性較差,給初學者帶來很多困擾和不必要的坑。 我僅以xss這個漏洞的名稱來舉例:本身這個漏洞的名字叫 corss site scripting 簡寫為css,但是之所以叫xss是因為css與web瀏覽器中解析的層疊樣式表(css)重名,故取名xss。然而,cross site scripting 直譯過來叫做跨站腳本攻擊,其實這個名字本身也存在誤導性。如今的web前端開發者應該都清楚,在現代瀏覽器的同源策略保護下,瀏覽器中的跨域行為受到了限制,并且其實從xss這個漏洞的攻擊原理上講,“跨站”這兩個字其實真的沒有什么必要。
請點擊此處輸入圖片描述
跨站腳本攻擊(XSS)
原理:
服務器沒有對用戶的輸入做到充足的過濾,導致頁面被嵌入惡意腳本
分類:
反射型:只能通過用戶點擊惡意構造的鏈接才能觸發攻擊
存儲型:惡意代碼保存在服務器,只要有人訪問該頁面就會觸發攻擊
效果:
通過獲取用戶的 cookie,實現會話劫持
通過在頁面偽造表單,獲取用戶的賬號密碼
XSS 蠕蟲
實現方式:
在可提交的輸入框中構造輸入,有時需要閉合引號,中括號等,有時需要對輸入進行編碼以繞過 WAF。
一般情況下,手動查找 XSS 注入點通常需要結合查看網頁的源代碼,找到自己的輸入出現在了頁面的哪個地方,然后根據該點附近的上下文構造惡意代碼,比如,一個用 php 編寫的頁面為:
<? php $input=$_GET["param"]; echo "<div>".$input."</div>"; ?>
在正常情況下,用戶的請求會在頁面中顯示出來。但是如果提供給 param 的參數是一段 HTML 代碼,那么瀏覽器就會將它當做代碼解析執行
值得注意的地方:
有時 web 程序會用轉義字符的方式轉義特殊字符,然而,如果數據庫使用的編碼方式與 web 程序不同時,特別是數據庫使用的是雙字節字符編碼,而負責過濾的 web 程序使用的是單字節字符編碼,可能會導致過濾失敗。例如,數據庫使用了 GBK 編碼,而 web 應用使用的是 ASCII 編碼,當用戶輸入 0xbf27 時,由于 27 是單引號 ',web 程序會將其轉義,變成 0xbf5c27,但是在數據庫中,由于使用的是 GBK 編碼,會將 bf5c 認為是一個字符,從而再次暴露了單引號 '
HTTP 參數污染有時可以繞過 WAF 的過濾
跨站請求偽造(CSRF)
原理:
由于
簡單的身份驗證只能保證請求發自某個用戶的瀏覽器,卻不能保證請求本身是用戶自愿發出的
——維基百科
用戶訪問完某個網站之后,瀏覽器會在一定時間內保存這個網站產生的 cookie,如果在這個 cookie 的有效期內,攻擊者可以利用瀏覽器再次訪問網站時會自動帶上 cookie 的特性偽造請求,實現了 CSRF
效果:
可以執行任意在用戶的權限內的操作
實現方式:
在可跨域的標簽如img、iframe中構造惡意 url,或構造使用 post 方法的表單并誘導用戶訪問該頁面,即可實現攻擊
總結針對 web 程序的攻擊方式,這些方式造成的后果不一,小到會話劫持,大到直接拿到服務器的管理員權限,這完全取決于 web 程序的安全設置,但從根本上來說,這些安全問題都是可以徹底避免的。
經測試,發現 User ID 的輸入框中存在反射型的 XSS 漏洞,在該輸入框中構造輸入:test" onmouseover=prompt(100) bad=',點擊 Go 提交該輸入后,在返回的頁面中已被嵌入了惡意代碼,當鼠標移動到 User ID 上后,會彈出一個提示框
請點擊此處輸入圖片描述
XSS 后的頁面
查看網頁的源代碼,可以發現 User ID 這個輸入框確實被我們的輸入控制了
XSS 后的頁面和正常頁面的源碼比較
請點擊此處輸入圖片描述
值得注意的地方
如果在前端過濾用戶輸入的話,可以使用 Burp Suite 等工具繞過過濾
設置 HttpOnly 可以禁止客戶端的腳本訪問 cookie,但是依然可以通過抓包的方式獲取到 cookie
SQL 注入
原理:
服務器沒有對用戶的輸入做到充分的過濾,導致可執行任意 SQL 語句
效果:
如果當前用戶具有對數據庫的讀權限,導致數據庫信息泄露
如果當前用戶具有對數據庫的讀寫權限,可對數據庫進行任意修改
如果當前用戶具有對數據庫的管理員權限,可對數據庫的用戶及數據庫進行任意操作
對于XSS的漏洞挖掘過程,其實就是一個使用Payload不斷測試和調整再測試的過程,這個過程我們把它叫做Fuzzing;同樣是Fuzzing,有些人挖洞比較高效,有些人卻不那么容易挖出漏洞,除了掌握的技術之外,比如編碼的繞過處理等,還包含一些技巧性的東西,掌握一些技巧和規律,可以使得挖洞會更加從容。
Fuzzing(模糊測試)是挖掘漏洞最常用的手段之一,不止是XSS,應該可以說Fuzzing可以用于大部分類型的漏洞挖掘。通俗可以把這種方式理解為不斷嘗試的過程。黑客入門書籍《網絡黑白》t寶有
網站指令碼(英語:Cross-site scripting,通常簡稱為:XSS)是一種網站應用程式的安全漏洞攻擊,是代碼注入的一種。它允許惡意使用者將程式碼注入到網頁上,其他使用者在觀看網頁時就會受到影響。這類攻擊通常包含了HTML以及使用者端腳本語言。
XSS攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶加載并執行攻擊者惡意制造的網頁程序。這些惡意網頁程序通常是JavaScript,但實際上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻擊成功后,攻擊者可能得到更高的權限(如執行一些操作)、私密網頁內容、會話和cookie等各種內容。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。