在前些章節 (web安全系列(一):XSS 攻擊基礎及原理)以及(Web安全系列(二):XSS 攻擊進階(初探 XSS Payload))中,我詳細介紹了 XSS 造成的原理以及 XSS 攻擊的分類,而且編寫了一個小栗子來展現出 XSS Payload
的危害。php
目前來講,XSS 的漏洞類型主要分爲三類:反射型、存儲型、DOM型,在本篇文章當中會以permeate
生態測試系統爲例,分析網站功能,引導攻擊思路,幫助讀者可以快速找出網站可能存在的漏洞。html
如今筆者須要進行手工XSS漏洞挖掘,在手工挖掘以前筆者須要先逛逛網站有哪些功能點,以下圖是permeate
的界面前端
咱們知道反射型 XSS ,大可能是經過 URL 傳播的,那麼我就須要思考哪些地方會出現讓 URL 地址的參數在頁面中顯示,我相信大部分讀者腦中第一直覺就是搜索欄,尤爲是一些大型網站的站內搜索,搜索的關鍵詞會展現在當前的頁面中。例如某搜索引擎:web
而在咱們測試的首頁也有網站搜索功能,所以咱們能夠從搜索功能着手測試,嘗試是否能夠進行 XSS Payload,咱們先輸入一個簡單的 Payload 進行測試,測試代碼爲<img onerror="alert(1)" src=1 />
後端
當咱們點擊搜索按鈕時,URL 應當自動改變爲 http://localhost:8888/home/search.php?keywords=<img onerror="alert(1)" src=1 />
瀏覽器
咱們進行嘗試:安全
先輸入搜索內容服務器
再進行搜索app
咱們發現,Google Chrome 竟然直接阻止了該事件,Payload 也沒有進行觸發,這裏我就須要跟讀者說一下了,Chrome 瀏覽器的內核自帶 XSS 篩選器,對於反射型 XSS 會自動進行攔截,因此儘可能不要用 Chrome 進行測試,咱們改用火狐繼續進行測試:curl
果真,直接觸發了咱們的 Payload 。
此 Payload 被觸發,說明咱們找到了一個反射型 XSS 的漏洞,固然,這種漏洞很是初級,絕大部分網站都進行了過濾操做,再加上隨着瀏覽器功能愈來愈強大,瀏覽器自帶的 XSS 篩選器變得更加智能,這種漏洞會愈來愈少見,下面我將會測試更爲常見的存儲型 XSS 的挖掘與並介紹如何繞過。
存儲型 XSS 的攻擊代碼是存在服務器端,所以,咱們須要找到該網站將數據存儲到後端的功能,咱們對此網站有了必定了解,會發現 permeate
擁有發帖和回帖功能,這正是 Web 端和後臺進行溝通的渠道,全部帖子信息都會存在服務端,有了這些信息,咱們能夠進入板塊,進行發帖操做:
進入發帖界面:
咱們如今標題和內容裏填上初級的 Payload :123<script>alert('123')</script>
咱們進行發表操做:
頁面直接執行了咱們的 Payload,咱們點完肯定,查看列表:
咱們進入帖子內部,會發現以下場景:
很明顯,文章主體部分的 Payload 並無執行,這究竟是怎麼一回事呢?
爲何標題內容能夠 Payload,主體內容不能 Payload 呢,咱們打開控制檯,切到Network
再來發一篇帖子看看:
咱們能夠看到對應的內容已經通過轉義,轉義分爲兩種,前端轉義和後端轉義,若是是後端轉義一般咱們就不須要測試下去了,由於咱們不知道服務端的內部代碼,若是是前端轉義則能夠繞過這個限制。
那麼該如何操做呢?
咱們拷貝出 URL
curl 'http://localhost:8888/home/_fatie.php?bk=5&zt=0' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' -H 'Origin: http://localhost:8888' -H 'Upgrade-Insecure-Requests: 1' -H 'Content-Type: application/x-www-form-urlencoded' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8' -H 'Referer: http://localhost:8888/home/fatie.php?bk=5' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8' -H 'Cookie: PHPSESSID=7690435026da386df8a80e63f3da2089' --data 'csrf_token=9191&bk=5&title=123%3Cscript%3Econsole.log%28232%29%3C%2Fscript%3E&content=%3Cp%3E123%26lt%3Bscript%26gt%3Bconsole.log%28232%29%26lt%3B%2Fscript%26gt%3B%3C%2Fp%3E' --compressed
找到其中的 title 和 content,將 content 的內容替換爲 title 的內容:
curl 'http://localhost:8888/home/_fatie.php?bk=5&zt=0' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' -H 'Origin: http://localhost:8888' -H 'Upgrade-Insecure-Requests: 1' -H 'Content-Type: application/x-www-form-urlencoded' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8' -H 'Referer: http://localhost:8888/home/fatie.php?bk=5' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8' -H 'Cookie: PHPSESSID=7690435026da386df8a80e63f3da2089' --data 'csrf_token=9191&bk=5&title=123%3Cscript%3Econsole.log%28232%29%3C%2Fscript%3E&content=123%3Cscript%3Econsole.log%28232%29%3C%2Fscript%3E' --compressed
替換完成以後,將此內容複製到終端進行運行:
回到主頁面查看相關內容:
Payload 執行了兩次,內容也被攻擊了。
看到此處說明咱們已經成功繞過前端XSS過濾器,直接對內容進行修改,因此後端的轉義有時候也頗有必要。
挖掘漏洞是一個複雜的過程,手工挖掘不失爲一種可靠的方式,可是手動挖掘效率低下,有時還要看運氣,目前已經出現不少自動檢測 XSS 漏洞的工具以及平臺,大大提升發現漏洞的效率,我將在稍後的章節中介紹一些工具以及如何防護 XSS。