========== 實(shí)驗(yàn)環(huán)境 ==========
Windows Server 2018 R2
DVWA
========== 實(shí)驗(yàn)環(huán)境 ==========
XSS攻擊,指黑客利用網(wǎng)站漏洞把惡意的腳本代碼(通常包括HTML代碼和JS腳本)注入到網(wǎng)頁中,當(dāng)用戶瀏覽網(wǎng)頁時(shí),就會(huì)執(zhí)行其中的惡意代碼(控制用戶瀏覽器),對受害用戶采取Cookie數(shù)據(jù)竊取、會(huì)話劫持、釣魚欺騙等各種攻擊。
它對Web服務(wù)器沒有直接危害,借助網(wǎng)站進(jìn)行傳播,使網(wǎng)站的用戶受到攻擊。
攻擊者一般通過留言、電子郵件或其他途徑向受害用戶發(fā)送一個(gè)惡意的URL,當(dāng)惡意URL被用戶觸發(fā)時(shí),惡意腳本就會(huì)在受害者的計(jì)算機(jī)上執(zhí)行。
造成XSS攻擊的因素?
XSS漏洞的危害
攻擊者通過注入如alert(/xss/)之類的JS代碼來證明XSS漏洞的存在性,但沒有真實(shí)地反映其危害性!
反射型XXS(非持久型XSS,一次性):主要用于將惡意腳本附加到URL地址參數(shù)中。
攻擊者通過特定的手法,比如利用電子郵件,誘使用戶去訪問一個(gè)包含惡意代碼的URL,當(dāng)受害者觸發(fā)時(shí),惡意JS代碼會(huì)直接在受害者主機(jī)上的瀏覽器執(zhí)行。特點(diǎn)是,只在用戶觸發(fā)的時(shí)候,執(zhí)行一次!
流程:
通常出現(xiàn)在網(wǎng)站的搜索欄,用戶登入口,用來竊取客戶端Cookie或進(jìn)行釣魚欺騙。
POC:
<sCr<scrscRiptipt>ipt>OonN'"<>
過濾掉了<sCr<scrscRiptipt>OonN'"<>
DVWA
low:
過濾掉了<sCr<scrscRiptipt>,其他沒有過濾!
源碼:
構(gòu)造:
<input onfocus=alert(/xss/) autofocus>
成功:
medium:
源碼:
也只進(jìn)行了<script>過濾,替換了成空!攻擊手段同low一樣!
<input onfocus=alert(/xss/) autofocus>
high:
impossible:
結(jié)論:
使用php中的htmlspecialchars函數(shù)把預(yù)定義的字符&、”、 ’、<、>轉(zhuǎn)換為 HTML 實(shí)體,
防止瀏覽器將其作為HTML元素!
存儲(chǔ)型XSS:也叫持久型跨站腳本,攻擊者事先將惡意JS代碼上傳或存儲(chǔ)到漏洞服務(wù)器中,只要瀏覽包含惡意JS代碼的頁面就會(huì)被執(zhí)行。
持久型XSS一般出現(xiàn)在網(wǎng)站的留言、評論等交互處,惡意腳本被存儲(chǔ)到客戶端或者服務(wù)器的數(shù)據(jù)庫中,當(dāng)用戶瀏覽該網(wǎng)頁時(shí),服務(wù)器從數(shù)據(jù)庫中讀取惡意用戶存入的非法數(shù)據(jù),然后顯示在頁面中,在受害者電腦上的瀏覽器執(zhí)行惡意代碼。它不需要用戶去單擊URL進(jìn)行觸發(fā),可以利用它滲透網(wǎng)站,掛馬,釣魚......
利用此XSS還能編寫XSS蠕蟲,能夠在網(wǎng)站中實(shí)現(xiàn)病毒的幾何數(shù)級傳播!XSS蠕蟲會(huì)直接影響網(wǎng)站的所有用戶,一個(gè)地方出現(xiàn)XSS漏洞,網(wǎng)站下的所有用戶都有可能被攻擊。
low:
<sCr<scrscRiptipt>ipt>OonN'"<>
<script>alert(/xss/)</script>
medium:
<sc<script>ript>alert(/xss/)</script>
high:
<img src=1 onerror=alert(/xss/)>
impossible:
Message: <sCr<scrscRiptipt>ipt>OonN\'\"<>
通過使用htmlspecialchars函數(shù),解決了XSS,但是要注意的是,如果htmlspecialchars函數(shù)使用不當(dāng),攻擊者就可以通過編碼的方式繞過函數(shù)進(jìn)行XSS注入,尤其是DOM型的XSS。
DOM型XSS:通過修改頁面的DOM節(jié)點(diǎn)形成的XSS,并不會(huì)將payload上傳到服務(wù)器,沒有與服務(wù)器端進(jìn)行交互,如果DOM中的數(shù)據(jù)沒有經(jīng)過嚴(yán)格確認(rèn),就會(huì)產(chǎn)生DOM—based XSS漏洞
可能觸發(fā)DOM型XSS的屬性
document.referer
window.name
location
innerHTML
documen.write
low:
查看頁面源代碼:
document屬于window 的一個(gè)子對象
window.location 包含 href 屬性,直接取值賦值時(shí)相當(dāng)于 window.location.href
window.location.href 當(dāng)前頁面完整 URL
document.location 包含 href 屬性,直接取值賦值時(shí)相當(dāng)于 document.location.href
document.location.href 當(dāng)前頁面完整 URL
decodeURI() 函數(shù)可對 encodeURI() 函數(shù)編碼過的 URI 進(jìn)行解碼
插入的 javascript 代碼可以在 decodeURL(lang) 被執(zhí)行
http://192.168.10.128/DVWA-master/vulnerabilities/xss_d/?default=English<script>alert(/xss/)</script>
meduim:
查看服務(wù)器端源碼:
array_key_exists() 函數(shù)檢查某個(gè)數(shù)組中是否存在指定的鍵名,如果鍵名存在則返回 true,如果鍵名不存在則返回 false。
stripos() 函數(shù)查找字符串在另一字符串中第一次出現(xiàn)的位置(不區(qū)分大小寫)
header() 函數(shù)向客戶端發(fā)送原始的 HTTP 報(bào)頭
結(jié)論:Medium 級別過濾了 <script>
構(gòu)造:
http://192.168.10.128/DVWA-master/vulnerabilities/xss_d/?default=English</option></select><img src=1 onerror=alert(/xss/)>
high:
源碼:
# ok
http://192.168.10.128/DVWA-master/vulnerabilities/xss_d/?default=English #<script>alert(/xss/)</script>
impossible:
輸入的參數(shù)都進(jìn)行了URL編碼!
攻擊:
Cookie劫持和欺騙
注意:詳細(xì)過程,請參考<<Web滲透測試(XSS)>>!
防御:
Set-Cookie時(shí)給關(guān)鍵字Cookie植入HttpOnly標(biāo)識!
Cookie與客戶端的IP地址綁定!
攻擊:模擬GET,POST請求操作用戶的瀏覽器
防御:提交表單的時(shí)候要求用戶輸入驗(yàn)證碼
"修改密碼"的功能中,要求用戶輸入舊密碼!
繞過:
對于驗(yàn)證碼,XSS Payload可以通過讀取頁面內(nèi)容,將驗(yàn)證碼的圖片URL發(fā)送到遠(yuǎn)程服務(wù)器上來實(shí)施(遠(yuǎn)程XSS后臺接收當(dāng)前的驗(yàn)證碼),將驗(yàn)證碼的值返回給當(dāng)前的XSS Payload,從而繞過驗(yàn)證碼。
修改密碼,可以通過釣魚網(wǎng)站來偽造獲取舊密碼!
攻擊:識別用戶瀏覽器(UserAgent對象)
但瀏覽器的UserAgent對象可以偽造,瀏覽器的好多擴(kuò)展都可以自定義瀏覽器的UserAgent,所以獲取到的信息不一定準(zhǔn)確。但由于瀏覽器之間實(shí)現(xiàn)存在差異,通過這些差異可以準(zhǔn)確地判斷出瀏覽器版本。(通過代碼實(shí)現(xiàn))
攻擊:識別用戶安裝的軟件
IE中,通過判斷ActiveX控件的classid是否存在,來推測用戶是否安裝了該軟件。通過判斷用戶安裝的軟件,選擇對應(yīng)的瀏覽器漏洞,來植入木馬的目的。
攻擊:識別瀏覽器的擴(kuò)展和插件
firefox的插件列表存放在一個(gè)DOM對象中,通過查詢DOM對象可以遍歷出所有的插件。查詢navigator.plugins對象!
firefox的擴(kuò)展,通過圖標(biāo)來判斷是否存在。
通過CSS,發(fā)現(xiàn)用戶曾經(jīng)訪問過的網(wǎng)站,style的visited屬性!
獲取用戶的真實(shí)IP地址:
比如客戶端安裝了Java環(huán)境,XSS可以調(diào)用Java Applet接口來獲取客戶端的本地IP地址。
ActiveX
Flash
iTunes
office Word
QuickTime
...等等第三方軟件的功能,來抓取用戶的本地信息。
XSS Cheat Sheet:
在測試XSS的過程中,需要嘗試各種XSS輸入,來繞過服務(wù)器端程序?qū)缯灸_本的過濾,如果有一份待測試的XSS語句列表會(huì)方便很多。
XSS語句列表羅列出各種各樣的XSS代碼,代碼在不同的瀏覽器、不同的應(yīng)用場景、不同的環(huán)境下均有跨站觸發(fā)的可能。通常,此類列表被稱為Cheat Sheet!
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
<a onblur=alert(1) tabindex=1 id=x></a><input autofocus>
......
XSS構(gòu)造:
繞過XSS-filter
XSS-filter一般基于黑白名單的安全過濾策略(攔截、編碼和消毒過濾等處理),實(shí)際上是一段編寫額過濾函數(shù)。
過濾和轉(zhuǎn)義<>和<script>
Javascript:[code]偽協(xié)議的形式,它聲明了URL的主體是任意的JS代碼,由JS的解釋器運(yùn)行
<img src="javascript:alert('xss');">
注:不是所有標(biāo)記的屬性值都能產(chǎn)生XSS,通常只有引用文件的屬性才能觸發(fā)XSS腳本
href/lowsrc/bgsound/background/value/action/dynsrc ......
過濾JavaScript等關(guān)鍵字
<img src="javas cript:alert(/xss/)" width=100 height=100> // tab
JS通常以分號結(jié)尾,如果JS引擎確認(rèn)一個(gè)語句是完整的,而這一行的結(jié)尾有換行符,那么就可以省略分號:
var name = "tony"var age= 18;
var name="tony wenxin";var age=18;
除了在引號中分隔單詞或強(qiáng)制結(jié)束語句之外,額外的空白無論以何種方式添加都無所謂!
var name="tony";// JS引擎沒有把換行符解釋為語句的終止符,因?yàn)榈綋Q行處并不是一個(gè)完整的語句,會(huì)繼續(xù)處理發(fā)現(xiàn)的內(nèi)容// 直到遇到一個(gè)分號或發(fā)現(xiàn)語句完整為止
繞過過濾:
<img src="javascript:alert(/xss/)" width=100 height=100 >
對普通的HTML標(biāo)記的屬性值進(jìn)行過濾,用戶還是可以通過編碼處理來繞過,因?yàn)镠TML中屬性值本身支持ASCII碼形式。
<img src="javascript:alert(/xss/);">
<img src="javascript:alert(/xss/);"> // t:116 t //:58 :
另外,tab符的ASCII碼 、換行符 、回車符 可以被插入到代碼中的任意位置!
onerror
onclick
......
<img src="#" onerror=alert(/xss/)>
<div style="background-image:url(javascript:alert('/xss/'))">
對style屬性進(jìn)行過濾!
CSS的引入:
<link rel="stylesheet" >
<style type="text/css">@import url(http://www.baidu.com/attack.css);</style> // attack.css .executeCSS{event:( onload = function(){alert(/xss/);} ) }
@import 'javascript:alert(/xss/)';
過濾/javascript/import字符
大小寫轉(zhuǎn)換
大小寫混淆
使用單引號
不使用引號
利用編碼工具,把字符編碼為十進(jìn)制或十六進(jìn)制進(jìn)行替換!
j // 十進(jìn)制a // 十六進(jìn)制
JS還支持unicode、escapes、八進(jìn)制等編碼形式!
shellcode調(diào)用方式:
http://www.tong.com?index.php?name=[]
注意:具體實(shí)操在之前文章已有涉及,這里只涉及利用手段!
輸入過濾:(輸入是否合法,長度限制,格式,過濾敏感字符等等)
輸出過濾:(編碼處理,如HTML實(shí)體)
......