白帽子挖洞—跨站腳本攻擊(XSS)篇
0x00介紹
跨站腳本(Cross-site scripting,簡稱XSS),是一種迫使Web站點回顯可執行代碼的攻擊技術,而這些可執行代碼由攻擊者提供、最終為用戶瀏覽器載入。不同於大多數攻擊(一般只涉及攻擊者和受害者),XSS涉及到三方,即攻擊者、客戶端與網站。XSS的攻擊目標是為了盜取客戶端的cookie或者其他網站用於識別客戶端身份的敏感信息。獲取到合法用戶的信息後,攻擊者甚至可以假冒最終用戶與網站進行交互。
XSS漏洞成因是由於動態網頁的Web應用對用戶提交請求參數未做充分的檢查過濾,允許用戶在提交的數據中摻入HTML代碼(最主要的是「>」、「<」),然後未加編碼地輸出到第三方用戶的瀏覽器,這些攻擊者惡意提交代碼會被受害用戶的瀏覽器解釋執行。
對於初學者而言,找漏洞最好是基於白盒審計進行,所謂白盒審計可以簡單地理解為就是看著代碼找漏洞,那麼在正式挖洞前,我們先看看開源的DVWA給出的四種級別的XSS的源代碼。
00x1基於dvwa的代碼審計
DVWA 的代碼分為四種安全級別:Low,Medium,High,Impossible。初學者可以通過比較四種級別的代碼,接觸到入門級別的代碼審計的內容。
XSS主要可以分為兩種,分別為反射型XSS和存儲型XSS,DVWA中也是分開介紹的。兩者的區別在哪兒呢?
反射型XSS:
一般是url參數中的值能夠回顯到HTML中,且url的參數值沒有過濾或過濾不嚴
存儲型XSS:
可以提交內容
提交的內容可被管理員或其他用戶看到
提交的內容沒有被過濾或過濾不嚴
我們這裡在按照DVWA給出的代碼進行介紹,先看看反射型XSS的代碼:
Low級別代碼
分析關鍵代碼:
可以看到: 代碼不經過濾與檢查直接引用name參數,由此形成XSS漏洞
Medium級別代碼:
分析關鍵代碼:
可以看到:
代碼使用str_replace()函數將輸入中的<script>刪除,希望藉此來過濾不合法的輸入
High級別代碼:
分析關鍵代碼:
可以看到:
代碼使用preg_replace() 函數(該函數用於正則表達式的搜索和替換),來杜絕我們使用雙寫繞過、大小寫混淆繞過代碼設置的過濾規則
Impossible級別代碼
分析關鍵代碼:
代碼中引入htmlspecialchars()函數把特殊字元如&、」、 』、<、>轉換為 HTML 實體,防止瀏覽器將其作為HTML元素,在根源上杜絕了XSS的發生
分析完了反射性XSS的源碼,我們接下來看看存儲型XSS的源碼
Low級別代碼:
分析關鍵代碼:
代碼中只是使用了trim()、mysql_real_escape_string()、stripslashes()等來對輸入內容進行常規的處理,但是並沒有對關於XSS的輸入做特定的過濾與檢查,並且直接存儲於資料庫,造成存儲型XSS漏洞
Mdium級別代碼
分析關鍵代碼:
可以看到代碼對兩個參數不同的處理方式。對於message,使用htmlspecialchars()對其進行編碼,無法再由此進行XSS,可是在name參數這邊,只是用str_replace()過濾了<script>,XSS漏洞可由此參數引發
High級別代碼:
關鍵代碼分析:
引入了preg_replace()通過正則匹配的方式過濾了<script>標籤,在<script>出杜絕了XSS,不過其他可以利用的標籤如img等並沒有過濾,因此可以利用來進行XSS
Impossible代碼:
分析關鍵代碼:
使用多個函數進行過濾處理,並且在最後使用htmlspecialchars()函數將其輸入轉換為HTML實體,但是要注意的是,如果htmlspecialchars函數使用不當,攻擊者就可以通過編碼的方式繞過函數進行XSS注入,尤其是DOM型的XSS。
0x02挖掘漏洞
註:下文的提到的漏洞均已獲授權進行測試,並交由廠商修復。
一般來說,反射型XSS比較好找,不過危害也比較小,經常只是彈個窗之類的小伎倆,而存儲型XSS相對而言比較難找,危害比較大,經常會盜取cookie,然後冒充正常用戶登錄。
接下來分別介紹三枚漏洞,兩枚反射型,一枚存儲型。
反射型XSS:
存在漏洞的url
打開頁面後我們在搜索框中構造XSS語句,點擊搜索後,頁面如圖
成功彈框,確認並利用了XSS
我們可以再看一下URL
雖然部分字元被轉義,但任然存在XSS漏洞
總結:直接在搜索框中構造XSS語句引發XSS漏洞,代碼級別屬於DVWA中的low級別。
這種級別的XSS很常見,再來一枚
存在漏洞的url:
先閉合之前的語句,在構造我們自己的
頁面如圖
總結:第二枚漏洞類似於第一枚漏洞,代碼級別相當於DVWA的low級別
這種XSS的危害一般都比較小,接下來展示一枚通過盜取管理員cookie進後台管理的存儲型XSS
某網站「商戶加入」頁面未加過濾,可以插入我們搜集cookie用的短網址
管理員觸發後拿到cookie
直接登陸後台
總結:該漏洞通過存儲型XSS盜取管理員cookie並用於登錄後台,代碼強度相當於DVWA中的Low級別。
0x03資源推薦
AppScan、AWVS、BurpSuite等大體量的工具都能檢測出XSS,不過其實XSS有專門的檢測工具,比如XSSER、XSSF等,大家都可以去嘗試玩玩。
另外,freebuf上有師傅結合fiddler查找xss漏洞,傳送門在這:http://www.freebuf.com/articles/web/30960.html
在《白帽子講WEB安全》和《XSS跨站腳本攻擊剖析與防禦》中都有相當的篇幅詳細介紹XSS,感興趣的小夥伴可以去研究研究
另外在合天網安實驗室也有豐富的資源可供學習:
《WEB防禦中的代碼安全》中的XSS防範實驗http://www.hetianlab.com/cour.do?w=1&c=C172.19.104.182015120317290200001
《WEB攻防基礎》中的XSS進階實驗http://www.hetianlab.com/cour.do?w=1&c=C9d6c0ca797abec2017070617054200001
0x04經驗心得
有了工具、有了理論基礎,在實戰中還需要什麼呢,沒錯,就是經驗。經驗不是一朝一夕得到的,也不是看書就能學會的,不過在這裡表弟還是願意給大家分享些自己挖洞過程中的心得、經驗。
先說漏洞的檢測
檢測XSS一般分兩種方法:一種是手工檢測、一種是軟體自動檢測 手工檢測:檢測結果準確,但對於大型web來說無計可施 軟體自動化檢測:方便,但存在誤報,且隱蔽的XSS無法檢測出 所以我們一般都是手工+自動檢測的,檢測的關鍵點在於輸出的數據在哪兒輸入或者說輸入的數據在哪兒輸出(是不是有些繞?)
再來介紹下XSS繞WAF的姿勢
每次挖漏洞的時候,最不可避免的就是繞過WAF,繞過WAF是小夥伴們挖洞的進階之路。
有三種方法可以繞過WAF:
1、 暴力法
思路:大多數自動化工具就是這樣,使用各種payload進行嘗試。
2、 正則的逆向
思路:因為WAF通常使用正則進行過濾,所以通過逆向分析正則,推算出WAF的正則規則,從而繞過。
3、 瀏覽器漏洞
思路:嘗試老版本瀏覽器或者0Day來繞過。
具體的繞WAF的姿勢就不展開來講了,不然又是長篇大論,相信聰明的小夥伴們一定一點就會呢。
0x05防護措施
不要在頁面中插入任何不可信數據,除非這些數已經據根據下面幾個原則進行了編碼
在將不可信數據插入到HTML標籤之間時,對這些數據進行HTML Entity編碼
在將不可信數據插入到HTML屬性里時,對這些數據進行HTML屬性編碼
不可信數據插入到SCRIPT里時,對這些數據進行SCRIPT編碼
在將不可信數據插入到Style屬性里時,對這些數據進行CSS編碼
在將不可信數據插入到HTML URL里時,對這些數據進行URL編碼
使用富文本時,使用XSS規則引擎進行編碼過濾
上面的話總結一下其實就是三條原則:
設置HTTP-only cookie,該cookie的屬性能夠阻止客戶端腳本訪問Cookie
對輸入進行校驗:對用戶輸入的一些特殊字元校驗,過濾或者是編碼
對輸出進行校驗:除了富文本之外,在變數輸出到HTML頁面,可以使用編碼或者轉義的方式來防禦XSS
0x06聲明
本系列文章旨在普及網路安全知識,提高小夥伴的安全意識的同時介紹常見漏洞的特徵、挖掘技巧等。若讀者因此做出危害網路安全的行為後果自負,與合天智匯及作者無關,特此聲明。
(PS:本文屬合天原創文章,未經允許,禁止以任何形式轉載!)
推薦閱讀:
※淺析圖片XSS中的哪些技術問題
※好書一起讀(147):XSS,CSRF,SQL注入
※「每日一題」XSS 是什麼?
※了解黑客:這是黑客思維
※XSS常見攻擊與防禦