什么是xss
創(chuàng)新互聯(lián)建站是一家企業(yè)級云計(jì)算解決方案提供商,超15年IDC數(shù)據(jù)中心運(yùn)營經(jīng)驗(yàn)。主營GPU顯卡服務(wù)器,站群服務(wù)器,托管服務(wù)器,海外高防服務(wù)器,機(jī)柜大帶寬、租用·托管,動(dòng)態(tài)撥號VPS,海外云手機(jī),海外云服務(wù)器,海外服務(wù)器租用托管等。
XSS又叫CSS (Cross Site Script) ,跨站腳本***。它指的是惡意***者往Web頁面里插入惡意html代碼,當(dāng)用戶瀏覽該頁之時(shí),嵌入其中Web里面的html代碼會(huì)被執(zhí)行,從而達(dá)到惡意的特殊目的。XSS屬于被動(dòng)式的***,因?yàn)槠浔粍?dòng)且不好利用,所以許多人常呼略其危害性。
XSS有哪些類型?
反射型:簡單的描述就是把用戶輸入的數(shù)據(jù)反射給瀏覽器,這個(gè)數(shù)據(jù)可能是Html代碼或者js代碼,反射后讓瀏覽器去執(zhí)行。
存儲(chǔ)型:把用戶輸入的數(shù)據(jù)(比如惡意的js代碼)存儲(chǔ)在服務(wù)器端,具有很強(qiáng)的穩(wěn)定性,危害時(shí)間長。
DOM Based XSS:這種不是按照存儲(chǔ)在哪里來劃分的,可以說是反射型,由于歷史原因,歸為一類,通過改變DOM結(jié)構(gòu)形成的XSS稱之為DOM Based。
實(shí)際上,我認(rèn)為xss主要可以分為:持久型xss和非持久型xss。
持久型xss就是將對客戶端***的腳本植入到服務(wù)器上,從而導(dǎo)致每個(gè)正常訪問頁面的用戶都會(huì)遭到這段xss腳本的***。
非持久型xss是對一個(gè)頁面的url中的某個(gè)參數(shù)做文章,把精心構(gòu)造的惡意腳本包裝到url參數(shù)中,再將這個(gè)url散布到網(wǎng)上, 騙取用戶訪問這個(gè)url,從而對其進(jìn)行***。
XSS的危害
1、劫持Cookie
2、構(gòu)建Get和Post請求操作用戶的瀏覽器,使用JavaScript模擬瀏覽器發(fā)包
3、XSS釣魚
4、獲取用戶系統(tǒng),瀏覽器信息
5、識別用戶安裝的軟件
6、劫持瀏覽器回話,從而執(zhí)行任意操作。
7、強(qiáng)制彈出廣告頁面,刷流量
8、獲取用戶真實(shí)ip
等等。。。。。。。。。。。。
XSS的觸發(fā)條件
了解XSS的觸發(fā)條件就先得從HTML(超文本標(biāo)記語言)開始,我們?yōu)g覽的網(wǎng)頁全部都是基于超文本標(biāo)記語言創(chuàng)建的。
而XSS的原理也就是往HTML中注入腳本,HTML指定了腳本標(biāo)記.在沒有過濾字符的情況下,只需要保持完整無錯(cuò)的腳本標(biāo)記即可觸發(fā)XSS,假如我們在某個(gè)資料表單提交內(nèi)容,表單提交內(nèi)容就是某個(gè)標(biāo)記屬性所賦的值,我們可以構(gòu)造如下值來閉和標(biāo)記來構(gòu)造完整無錯(cuò)的腳本標(biāo)記,
"><"
"><"
結(jié)果形成了 <"">Hahaha
(假如做了一些過濾,還可以這樣)
測試閉和表單賦值所在的標(biāo)記,形成完整無錯(cuò)的腳本標(biāo)記可觸發(fā)XSS,但是沒有腳本標(biāo)記怎么觸發(fā)XSS呢?呵呵,我們只好利用其他標(biāo)記了,假如要在網(wǎng)頁里顯示一張圖片,那么就要使用一個(gè)標(biāo)記,示例如下:
img標(biāo)記并不是真正地把圖片給加入到Html文檔把兩者合二為一,而是通過src屬性賦值。那么瀏覽器的任務(wù)就是解釋這個(gè)img標(biāo)記,訪問src屬性所賦的值中的URL地址并輸出圖片。問題來了!瀏覽器會(huì)不會(huì)檢測src屬性所賦的值呢?答案是否!那么我們就可以在這里大做文章了,接觸過javascript的同志應(yīng)該知道,javascript有一個(gè)URL偽協(xié)議,可以使用“javascript:”這種協(xié)議說明符加上任意的javascript代碼,當(dāng)瀏覽器裝載這樣的URL時(shí),便會(huì)執(zhí)行其中的代碼.于是我們就得出了一個(gè)經(jīng)典的XSS示例:
當(dāng)然并不是所有標(biāo)記的屬性都能用,細(xì)心的你應(yīng)該發(fā)現(xiàn)標(biāo)記的屬性在訪問文件才觸發(fā)的XSS,這里我就不再深入,因?yàn)殡x開標(biāo)記的屬性還有事件能幫助我們觸發(fā)XSS.那什么是事件呢?只有達(dá)到某個(gè)條件才會(huì)引發(fā)事件,正巧img標(biāo)記有一個(gè)可以利用的onerror()事件,當(dāng)img標(biāo)記內(nèi)含有一個(gè)onerror()事件而正好圖片沒有正常輸出便會(huì)觸發(fā)這個(gè)事件,而事件中可以加入任意的腳本代碼,其中的代碼也會(huì)執(zhí)行.現(xiàn)在我們又得到了另外一個(gè)經(jīng)典的XSS示例:
過濾了alert來執(zhí)行彈窗
綜合這一部分,我們知道XSS的觸發(fā)條件包括:完整無錯(cuò)的腳本標(biāo)記,訪問文件的標(biāo)記屬性和觸發(fā)事件。
預(yù)防措施
1、輸入檢測
對用戶的所有輸入數(shù)據(jù)進(jìn)行檢測,比如過濾其中的“<”、“>”、“/”等可能導(dǎo)致腳本注入的特殊字符,或者過濾 "script"、"javascript" 等腳本關(guān)鍵字,或者對輸入數(shù)據(jù)的長度進(jìn)行限制等等。同時(shí),我們也要考慮用戶可能繞開ASCII碼,使用十六進(jìn)行編碼如“<”(“<”)、“>”(“>”)等來輸入腳本。因此,對用戶輸入的十六進(jìn)制編碼,我們也要進(jìn)行相 應(yīng)的過濾。只要開發(fā)人員能夠嚴(yán)格檢測每一處交互點(diǎn),保證對所有用戶可能的輸入都進(jìn)行檢測和XSS過濾,就能夠有效地阻止XSS***。
2. 輸出編碼
通過前面對XSS***的分析,我們可以看到,之所以會(huì)產(chǎn)生XSS***,就是因?yàn)閃eb應(yīng)用程序?qū)⒂脩舻妮斎胫苯忧度氲侥硞€(gè)頁面當(dāng)中,作為該頁面的HTML代 碼的一部分。因此,當(dāng)Web應(yīng)用程序?qū)⒂脩舻妮斎霐?shù)據(jù)輸出到目標(biāo)頁面中時(shí),只要用HtmlEncoder等工具先對這些數(shù)據(jù)進(jìn)行編碼,然后再輸出到目標(biāo)頁面中。這樣,如果用戶輸入一些HTML的腳本,也會(huì)被當(dāng)成普通的文字,而不會(huì)成為目標(biāo)頁面HTML代碼的一部分得到執(zhí)行。
3. Cookie防盜
利用XSS***,***者可以很方便地竊取到合法用戶的Cookie信息。因此,對于網(wǎng)站來說,不能在Cookie信息中存放太多敏感信息,也不能將 Cookie作為身份認(rèn)證的唯一標(biāo)識,等等。因此,對于Cookie,我們可以采取以下的措施。首先,我們要盡可能地避免在Cookie中泄露隱私,如用 戶名、密碼等;其次,我們可以將Cookie信息用MD5等Hash算法進(jìn)行多次散列后存放;再次,為了防止重放***,我們也可以將Cookie和IP進(jìn)行綁定,這樣也可以阻止***者冒充正常用戶的身份。
4. 嚴(yán)格限制URL訪問
攻 擊者使用XSS***,通常都要借助于自己指定的網(wǎng)站頁面,比如用它來記錄敏感信息等等。因此,在頁面的腳本代碼執(zhí)行過程中,只要我們 嚴(yán)格限制其訪問的URL,比如只允許腳本代碼訪問本網(wǎng)站的URL等方式,就可以避免腳本的執(zhí)行鏈接到其它可能是***者指定的頁面上。
5 網(wǎng)站程序端
防范XSS***的一種方法是在服務(wù)器端采取防范措施。在大部分的跨站漏洞里,就是因?yàn)槌绦虻倪^濾不嚴(yán)格,導(dǎo)致了***者可以在網(wǎng)站中加入“<”、“>”等字符,從而導(dǎo)致XSS***的產(chǎn)生.所以我們在程序的編寫中就要強(qiáng)制過濾關(guān)鍵字,過濾“<”、“>”,把用戶的輸入放入引號內(nèi),以達(dá)到數(shù)據(jù)與代碼隔離、過濾雙引號,防止用戶跨越許可的標(biāo)記,添加自定義標(biāo)記、過濾TAB和空格,防止關(guān)鍵字被拆分、過濾script關(guān)鍵字、過濾&#,防止HTML屬性繞過檢查.下面是一些實(shí)例
5.1 過濾“<”、“>”實(shí)例
***語句:<script>alert(/XSS/)</script>
防范方法:replace(str,“<”,“&#x3C;”)&#ascii
replace(str,“>”,“&#x3E;”)
注:script為服務(wù)器端語句,不進(jìn)行ascii解釋,用戶輸入的語句中含有“<”,“>”,都用&#x代替.所以過濾“<”、“>”基本可以防范跨站.&#(unicode編碼的十進(jìn)制數(shù))是unicode的HTML表示方式
5.2 HTML屬性過濾
上面的代碼可以過濾掉“<”和“>”標(biāo)記,讓***者無法構(gòu)造HTML標(biāo)記.但是,有經(jīng)驗(yàn)的***者就有可能會(huì)利用已存在的腳本屬性來進(jìn)行針對性***,假如***者利用插入圖片功能,把圖片的路徑屬性修改為一段script代碼,也是可以達(dá)到跨站的目的的.
下面我們來用實(shí)例來演示如何防范運(yùn)用插圖片方式進(jìn)行***的手法:
***語句:<imgsrc=“javascript:alert(/XSS/)”width=100>
很多的HTML標(biāo)記里屬性都支持“javascript:跨站代碼”的形式,因此就需要對***者輸入的數(shù)據(jù)進(jìn)行如下轉(zhuǎn)換
防范方法:replace(str,“javascript:”,“”)
replace(str,“jscript:”,“”)
replace(str,“vbscript:”,“”)
從而達(dá)到的效果是:用戶輸入的語句中含有“javascript”,“jscript”,“vbscript”,都用空白代替.從而讓***者利用插入圖片功能修改路徑屬性進(jìn)行跨站***的企圖失敗
5.3 過濾特殊字符
因?yàn)镠TML屬性的值,是用可支持“&#ASCii”的形式進(jìn)行表示的,所以***語句代碼可變型為:
***語句:<imgsrc=“javascript:alert(/XSS/)”width=100> 這樣就可以突破過濾程序進(jìn)行跨站***.
其防范代碼為: replace(str,“&”,“&”) 這個(gè)代碼中把“&”替換為了“&”,后面的語句就變得沒有意義了.
5.4 其他的方式繞過
過濾例如下面這段代碼:
***語句:<imgsrc=“javascript:alert(/XSS/)”width=100>
注意中間的空格,此空格分隔了關(guān)鍵字,也就是說,對Tab鍵進(jìn)行了拆分.這樣就需要考慮把Tab空格過濾.
5.5 HTML屬性跨站的徹底防范
就算是程序員考慮到了大多數(shù)的***方法,并做出了相應(yīng)的過濾.***者也是有可能利用程序的缺陷進(jìn)行***的.例如下面這兩條語句實(shí)例:
<imgsrc=“#”style=“XSS:expression(alert(/XSS/));”>
<imgsrc=“#”/**/onerror=alert(/XSS/)width=100>
***者仍然可以繞過過濾進(jìn)行XSS***,所以也要考慮到這種情況的防范.
XSS為什么真正的***過程中個(gè)很少用呢?
1、耗時(shí)間
2、有一定幾率不成功
3、沒有相應(yīng)的軟件來完成自動(dòng)化***
4、前期需要基本的html、js功底,后期需要扎實(shí)的html、js、actionscript2/3.0等語言的功底
5、是一種被動(dòng)的***手法
6、對website有http-only、crossdomian.xml沒有用
沒事可以都收據(jù)一些xss***腳本沒準(zhǔn)就用上了呢
這一篇文章很不錯(cuò)適合新手看 https://zhuanlan.zhihu.com/p/26177815