什么是XSS跨站攻擊
css(Cross Site Script),又叫XSS跨站腳本攻擊。它指的是惡意攻擊者往Web頁面的html代碼中插入惡意的ActiveX、HTML、JAVAScript、Flash或VBScript腳本,當用戶訪問該頁之時,嵌入Web里面的代碼會被執行,竊取過此用戶信息、改變其設置、破壞用戶數據,從而達到惡意攻擊用戶的特殊目的。
XSS在多數情況下對web程序和服務器的運行不會造成影響,但嚴重威脅了客戶端的安全,主要源于服務器對用戶提交的數據過濾不完整。
跨站腳本攻擊屬于被動式的攻擊,因為其被動且不好利用,所以許多人常忽略其危害性?,F在為了規避風險且節約安全檢測成本,一般企業會選擇聯系具備資質的IDC服務器提供商購買或租用云WAF或高防IP服務,能夠從根源上阻攔所有的web攻擊(包括XSS跨站腳本攻擊)。
盡管XSS劫持是一種不容易被web設計者重視的攻擊方式,單XSS代碼甚至不符合圖靈完備的語言,但因為引發攻擊的方式并不困難(不需要依賴JavaScript),攻擊者可以利用XSS作為工具記錄用戶的密碼等信息,因此也會被黑客當作攻擊方式的選擇之一。
傳統的XSS跨站利用方式,一般都是由攻擊者先構造一個跨站網頁,然后在另一空間里放一個收集Cookie的頁面,接著結合其它技術讓用戶打開跨站頁面以盜取用戶的Cookie,以便進一步的攻擊。
對于這種方式而言,即便攻擊者收集到了Cookie,也未必能進一步滲透進去,畢竟隨著網絡安全意識的提高,現在多數的Cookie里面的密碼都是經過加密的。如果想要Cookie欺騙的話,同樣也要受到其它的條件的限約。比較成熟的方法是通過跨站構造一個表單,表單的內容則為利用程序的備份功能或者加管理員等功能得到一個高權限。
作為一種HTML注入攻擊,XSS攻擊的核心思想就是在HTML頁面中注入惡意代碼,而XSS采用的注入方式是非常巧妙的。
XSS攻擊一般包括三個核心組成部分:攻擊者、目標服務器、受害者瀏覽器。
在網絡安全意識還遠遠跟不上互聯網發展的時代,有些服務器并不要求對用戶的輸入進行安全方面的驗證,這時攻擊者就可以很容易地通過正常的輸入手段,夾帶進一些惡意的HTML腳本代碼。當受害者的瀏覽器訪問目標服務器上被注入惡意腳本的頁面后,由于它對目標服務器的信任,這段惡意腳本的執行不會受到什么阻礙。而此時,攻擊者的目的就已經達到了。
2018年,谷歌安全工程師Ruslan Habalov在其博客上透露,他分別在火狐和Chrome等瀏覽器上發現了一個可以泄露跨站源框架視覺內容的旁路攻擊。發現此攻擊的同時還有德國的滲透測試工程師和另一名安全研究員。
該漏洞歸因于2016年CSS3 Web標準中引入的名為“mix-blend-mode”的特性,允許Web開發人員將Web組件疊加在一起,并添加控制其交互方式的效果。為展示此漏洞,研究人員造訪了一個惡意網站,發現可以利用跨域iframe獲取用戶的Facebook資料,包括照片和用戶名等信息,整個過程不需要與用戶有額外的互動。
Habalov 在文中解釋稱,在啟用 “mix-blend-mode” 時,攻擊者可以利用 DIV 元素的層疊來覆蓋目標對象的浮動框架(iframe),瀏覽器渲染此一層疊的時間會根據浮動框架內的像素顏色而有所不同,最后在浮動框架中移動該DIV層疊,強迫重新渲染并測量個別的渲染時間,即有可能算出浮動框架的內容。經過測試,大概20秒左右就能拿到用戶的ID,5分鐘左右就能拿到模糊的個人資料和圖片。
據悉,受影響的瀏覽器主要是火狐和Chrome,IE和Microsoft Edge不受影響是因為它們不支持mix-blend-mode,Safari由于采用的是矢量化的實現方式也不受影響。
XSS攻擊樣例:
很多登陸界面都有記住用戶名、密碼的功能,方便用戶下次登錄,有些網站是直接用明文記錄用戶名、密碼。
攻擊者通過賬戶登陸頁面,使用簡單工具查看cookie結構名稱后,如果網站有xss漏洞,那么簡單的利用j5onp就可以獲取其它用戶的用戶名和密碼了。
利用幾句簡單的JavaScript,在用戶瀏覽器執行第三方黑客工程的js文件,獲取了cookie中的用戶密碼并發起一個黑客工程的Http url請求,這樣黑客工程就獲取了用戶的賬號密碼。
這時,用戶自己登錄了論壇,而黑客提供了一個被偽裝的鏈接,一旦點擊該鏈接就會在論壇上發起一個Http url請求,即將表單信息進行提交。
或者說,有這么一個登錄頁面:
一個用戶的賬號為abc,密碼為123,他覺得每次訪問還需要輸入賬號密碼是件非常麻煩的事,因此選擇了保留。F12可以看到Html頁面是這樣的:
如果直接在賬號欄輸入alert("1"),然后輸入一個錯誤的密碼,并沒有執行script代碼,因為返回的html頁面是這樣的:
上圖中那樣的script代碼是不會執行的,因為在input的value中只有獨立的script代碼才會執行。所以要想實現script代碼的執行,就需要進行拼接,將script代碼排到input標簽外。
怎么實現呢?
說白了就是自己拼接,將input標簽進行閉合,然后將script代碼綴在后邊,通過用戶名的輸入,將input拼接成如下,即可實現script代碼的執行:
因為此時input已經閉合了,所以script代碼會執行,至于拼接后的html文件是有語法錯誤的問題(因為最后剩下一個"/>,這個html是有錯誤的,但是不影響頁面展示和script代碼執行)就可以忽略了
因此,只需要在用戶名那里輸入abc"/>alert("1"),然后輸入一個錯誤的密碼,點擊登錄,就會執行script代碼,彈出彈框。