对未标记为可安全执行的脚本_三、??XSS跨站脚本攻击
跨站腳本攻擊(Cross Site Scripting),縮寫為XSS。惡意攻擊者往Web頁(yè)面里插入惡意Script代碼,當(dāng)用戶瀏覽該頁(yè)之時(shí),嵌入其中Web里面的Script代碼會(huì)被執(zhí)行,從而達(dá)到惡意攻擊用戶的目的。理論上,所有可輸入的地方?jīng)]有對(duì)輸入數(shù)據(jù)進(jìn)行處理的話,都會(huì)存在XSS漏洞,漏洞的危害取決于攻擊代碼的威力。
1??xss的危害:
攻擊者可以使用戶在瀏覽器中執(zhí)行其預(yù)定義的惡意腳本,其導(dǎo)致的危害可想而知,如劫持用戶會(huì)話,插入惡意內(nèi)容、重定向用戶、使用惡意軟件劫持用戶瀏覽器、繁殖XSS蠕蟲,甚至破壞網(wǎng)站、修改路由器配置信息等。XSS漏洞可以追溯到上世紀(jì)90年代。大量的網(wǎng)站曾遭受XSS漏洞攻擊或被發(fā)現(xiàn)此類漏洞,如Twitter、Facebook、MySpace、Orkut、新浪微博和百度貼吧。研究表明,最近幾年XSS已經(jīng)超過(guò)緩沖區(qū)溢出成為最流行的攻擊方式,有68%的網(wǎng)站可能遭受此類攻擊。根據(jù)開放網(wǎng)頁(yè)應(yīng)用安全計(jì)劃OWASP TOP10公布的2010年統(tǒng)計(jì)數(shù)據(jù),XSS排名第2名僅次于代碼注入,2017年的OWASP TOP10排行中位列第七名。
XSS 存在的根本原因是,對(duì)URL中的參數(shù),對(duì)用戶輸入提交給 webserve r的內(nèi)容,沒(méi)有進(jìn)行充分的過(guò)濾。如果我們能夠在 web 程序中,對(duì)用戶提交的URL中的參數(shù),和提交的所有內(nèi)容,進(jìn)行充分的過(guò)濾,將所有的不合法的參數(shù)和輸入內(nèi)容過(guò)濾掉,那么就不會(huì)導(dǎo)致“在用戶的瀏覽器中執(zhí)行攻擊者自己定制的腳本”。
但是,其實(shí)充分而完全的過(guò)濾,實(shí)際上是無(wú)法實(shí)現(xiàn)的。因?yàn)楣粽哂懈鞣N各樣的神奇的,你完全想象不到的方式來(lái)繞過(guò)服務(wù)器端的過(guò)濾,最典型的就是對(duì)URL和參數(shù)進(jìn)行各種的編碼,比如escape,encodeURI, encodeURIComponent, 16進(jìn)制,10進(jìn)制,8進(jìn)制,來(lái)繞過(guò)XSS過(guò)濾。
2??xss的原理:
HTML是一種超文本標(biāo)記語(yǔ)言,通過(guò)將一些字符特殊地對(duì)待來(lái)區(qū)別文本和標(biāo)記,例如,小于符號(hào)(<)被看作是HTML標(biāo)簽的開始,<title>與</title>之間的字符是頁(yè)面的標(biāo)題等等。當(dāng)動(dòng)態(tài)頁(yè)面中插入的內(nèi)容含有這些特殊字符(如<)時(shí),用戶瀏覽器會(huì)將其誤認(rèn)為是插入了HTML標(biāo)簽,當(dāng)這些HTML標(biāo)簽引入了一段JavaScript腳本時(shí),這些腳本程序就將會(huì)在用戶瀏覽器中執(zhí)行。所以,當(dāng)這些特殊字符不能被動(dòng)態(tài)頁(yè)面檢查或檢查出現(xiàn)失誤時(shí),就將會(huì)產(chǎn)生XSS漏洞。總結(jié)后為三點(diǎn)。
①攻擊者對(duì)含有漏洞的服務(wù)器發(fā)起XSS攻擊(注入JS代碼)。
②誘使受害者打開受到攻擊的服務(wù)器URL。
③受害者在Web瀏覽器中打開URL,惡意腳本執(zhí)行。
3??xss的分類:
從攻擊代碼的工作方式可以分為三個(gè)類型:
①持久型跨站:最直接的危害類型,跨站代碼存儲(chǔ)在服務(wù)器(數(shù)據(jù)庫(kù))。②非持久型跨站:反射型跨站腳本漏洞,最普遍的類型。用戶訪問(wèn)服務(wù)器-跨站鏈接-返回跨站代碼。③DOM跨站:DOM(document object model文檔對(duì)象模型),客戶端腳本處理邏輯導(dǎo)致的安全問(wèn)題。
基于DOM的XSS漏洞是指受害者端的網(wǎng)頁(yè)腳本在修改本地頁(yè)面DOM環(huán)境時(shí)未進(jìn)行合理的處置,而使得攻擊腳本被執(zhí)行。在整個(gè)攻擊過(guò)程中,服務(wù)器響應(yīng)的頁(yè)面并沒(méi)有發(fā)生變化,引起客戶端腳本執(zhí)行結(jié)果差異的原因是對(duì)本地DOM的惡意篡改利用。
4??xss的攻擊方式:
常用的XSS攻擊手段和目的有:
①盜用cookie,獲取敏感信息。
②利用植入 Flash,通過(guò) crossdomain 權(quán)限設(shè)置進(jìn)一步獲取更高權(quán)限;或者利用 Java 等得到類似的操作。
③利用 iframe、frame、XMLHttpRequest 或 Flash 等方式,以(被攻擊)用戶的身份執(zhí)行一些管理動(dòng)作,或執(zhí)行一些一般的如發(fā)微博、加好友、發(fā)私信等操作。
④利用可被攻擊的域受到其他域信任的特點(diǎn),以受信任來(lái)源的身份請(qǐng)求一些平時(shí)不允許的操作,如進(jìn)行不當(dāng)?shù)耐镀被顒?dòng)。
⑤在訪問(wèn)量極大的一些頁(yè)面上的XSS可以攻擊一些小型網(wǎng)站,實(shí)現(xiàn)DDoS攻擊的效果。
⑥xss釣魚網(wǎng)站,利用JavaScript腳本直接放用戶跳轉(zhuǎn)到釣魚網(wǎng)站
⑦xss獲取鍵盤記錄,xss可以實(shí)現(xiàn)鍵盤操作,但是有局限性,不能跨域。
㈠、xss之存儲(chǔ)型xss:(又被稱為持久性XSS)
存儲(chǔ)型 XSS 的攻擊步驟:
①攻擊者將惡意代碼提交到目標(biāo)網(wǎng)站的數(shù)據(jù)庫(kù)中。②用戶打開目標(biāo)網(wǎng)站時(shí),網(wǎng)站服務(wù)端將惡意代碼從數(shù)據(jù)庫(kù)取出,拼接在 HTML 中返回給瀏覽器。③用戶瀏覽器接收到響應(yīng)后解析執(zhí)行,混在其中的惡意代碼也被執(zhí)行。 存儲(chǔ)型 XSS攻擊常見于帶有用戶保存數(shù)據(jù)的網(wǎng)站功能,如論壇發(fā)帖、商品評(píng)論、用戶私信等。
儲(chǔ)存型XSS會(huì)把用戶輸入的數(shù)據(jù)“儲(chǔ)存”在服務(wù)器端。這種XSS具有很強(qiáng)的穩(wěn)定性。持久的XSS危害性大,容易造成蠕蟲,因?yàn)槊慨?dāng)用戶打開頁(yè)面,查看內(nèi)容時(shí)腳本將自動(dòng)執(zhí)行。持久型XSS最大的危害在于可能在一個(gè)系統(tǒng)中的用戶間互相感染,以致整個(gè)系統(tǒng)的用戶淪陷。能夠造成這種危害的腳本我們稱之為XSS蠕蟲。
㈡、xss之反射型xss :(也被稱為非持久性XSS)
反射型 XSS 的攻擊步驟:
①攻擊者構(gòu)造出特殊的 URL,其中包含惡意代碼。
②用戶打開帶有惡意代碼的 URL 時(shí),網(wǎng)站服務(wù)端將惡意代碼從 URL 中取出,拼接在 HTML 中返回給瀏覽器。
③用戶瀏覽器接收到響應(yīng)后解析執(zhí)行,混在其中的惡意代碼也被執(zhí)行。 反射型 XSS漏洞常見于通過(guò) URL 傳遞參數(shù)的功能,如網(wǎng)站搜索、跳轉(zhuǎn)等。
反射型XSS只是簡(jiǎn)單的把用戶輸入的數(shù)據(jù)“反射”給瀏覽器,也就是說(shuō)需要誘使用戶“點(diǎn)擊”一個(gè)惡意鏈接,才能攻擊成功。漏洞產(chǎn)生的原因是攻擊者注入的數(shù)據(jù)反映在響應(yīng)中。非持久型XSS攻擊要求用戶訪問(wèn)一個(gè)被攻擊者篡改后的鏈接,用戶訪問(wèn)該鏈接時(shí),被植入的攻擊腳本被用戶游覽器執(zhí)行,從而達(dá)到攻擊目的。
㈢、xss之DOM 型 XSS:
DOM 型 XSS 的攻擊步驟:
①攻擊者構(gòu)造出特殊的 URL,其中包含惡意代碼。
②用戶打開帶有惡意代碼的 URL。
③用戶瀏覽器接收到響應(yīng)后解析執(zhí)行,前端 JavaScript 取出 URL 中的惡意代碼并執(zhí)行。 DOM 型 XSS 跟前兩種 XSS 的區(qū)別:DOM 型 XSS 攻擊中,取出和執(zhí)行惡意代碼由瀏覽器端完成,屬于前端 JavaScript 自身的安全漏洞,而其他兩種 XSS 都屬于服務(wù)端的安全漏洞。
?DOM通常代表在html、xhtml和xml中的對(duì)象,使用DOM可以允許程序和腳本動(dòng)態(tài)的訪問(wèn)和更新文檔的內(nèi)容、結(jié)構(gòu)和樣式。它不需要服務(wù)器解析響應(yīng)的直接參與,觸發(fā)XSS靠的是瀏覽器端的DOM解析,所以防范DOM型XSS完全就是前端的責(zé)任,必須注意!!!。
5??xss之繞過(guò):
大多數(shù)網(wǎng)站為了避免xss的攻擊,對(duì)于攻擊者的輸入都采取了過(guò)濾的措施,導(dǎo)致攻擊者通常不能正常插入惡意代碼來(lái)達(dá)到攻擊目的。但是仍存在一些漏洞可以利用,來(lái)繞過(guò)過(guò)濾措施。
xss繞過(guò)的方法有許多,主要取決于攻擊者的思路和對(duì)前端技術(shù)的掌握,以下介紹幾個(gè)簡(jiǎn)單的繞過(guò)方法。
1)對(duì)前端的輸入字符數(shù)量限制可以嘗試進(jìn)行抓包重發(fā)或者修改前端的HTML。
2)防止后臺(tái)對(duì)輸入的內(nèi)容進(jìn)行正則匹配來(lái)過(guò)濾輸入,對(duì)于這樣的過(guò)濾可以考慮大小寫混合輸入的方法。
payload:<sCRipT>alert('你打籃球像oldboy')</sCrIPt>
3)防止后臺(tái)對(duì)輸入的內(nèi)容進(jìn)行替換,采用拼拼湊的輸入方法。
payload:<sc<script>ript>alert('你打籃球像oldboy')</scr<script>ipt>
4)使用注釋來(lái)干擾后臺(tái)對(duì)輸入內(nèi)容的識(shí)別。
payload:<sc<!--test-->ript>alert('你打籃球像oldboy')</scr<!--tshauie-->ipt>
5)編碼思路:后臺(tái)有可能會(huì)對(duì)代碼中的關(guān)鍵字進(jìn)行過(guò)濾,但我們可以嘗試將關(guān)鍵字進(jìn)行編碼后在插入。(注意:編碼在輸出時(shí)是否會(huì)被正常識(shí)別和翻譯才是關(guān)鍵,不是所有的編碼都是可以的)
例:使用事件屬性onerror(): <img src=# οnerrοr="alert('oldboy')"/>
使用HTML進(jìn)行編碼: <img src=x οnerrοr="alert('yangshuang')"/> 6)htmlspecialchars()函數(shù)繞過(guò):
該函數(shù)的語(yǔ)法:htmlspecialchars(string,flags,character-set,double_encode) 過(guò)濾原理:htmlspecialchars() 函數(shù)把預(yù)定義的字符轉(zhuǎn)換為 HTML 實(shí)體,從而使XSS攻擊失效。但是這個(gè)函數(shù)默認(rèn)配置不會(huì)將單引號(hào)和雙引號(hào)過(guò)濾,只有設(shè)置了quotestyle規(guī)定如何編碼單引號(hào)和雙引號(hào)才能會(huì)過(guò)濾掉單引號(hào)
預(yù)定義的字符是:
& (和號(hào))成為 &
" (雙引號(hào))成為 "
’ (單引號(hào))成為'
< (小于)成為 <
>(大于)成為 >
可用的quotestyle類型:
ENT_COMPAT - 默認(rèn)。僅編碼雙引號(hào)
ENT_QUOTES - 編碼雙引號(hào)和單引號(hào)
ENT_NOQUOTES - 不編碼任何引號(hào)
可使用以下語(yǔ)句繞過(guò): q' onclick**='alert(111)' 點(diǎn)擊執(zhí)行 7) href 繞過(guò):當(dāng)輸入的值在 a 標(biāo)簽 herf 里
payload: javascript:alert(1111) 直接代入 a 標(biāo)簽 herf 里面一樣可以繞過(guò) htmlspecialchars() 8)xss之js輸出繞過(guò):當(dāng)目標(biāo)是用JavaScript腳本輸出的,只需閉合原有的表情即可插入代碼
payload:<script> $ms=' 11111111'</script><script>alert(1111)</script> ;
6??XSS的測(cè)試技巧:
①工具掃描:APPscan、awvs、burpsuite、XSSER XSSF②手動(dòng)測(cè)試:Burpsuite、firefox(hackbar)
1)在目標(biāo)站點(diǎn)上找到輸入點(diǎn),比如查詢接口,留言板等;
2)輸入一組"特殊字符+唯一識(shí)別字符",點(diǎn)擊提交后,查看返回的源碼,是否有做對(duì)應(yīng)的處理;
3)通過(guò)搜索定位到唯一字符,結(jié)合唯一字符前后語(yǔ)法確認(rèn)是否可以構(gòu)造執(zhí)行js的條件(構(gòu)造閉合);提交構(gòu)造的腳本代碼,看是否可以成功執(zhí)行,如果成功執(zhí)行則說(shuō)明存在XSS漏洞;第一種情況:可得知輸出位置
輸入一些敏感字符,例如<、>、"、'、()等等,在提交請(qǐng)求后去查看HTML源代碼,看這些輸入的字符是否被轉(zhuǎn)義。在輸出這些敏感字符的時(shí)候,很有可能程序已經(jīng)做過(guò)了過(guò)濾,那么你在尋找這些字符的時(shí)候就不是那么容易了,這時(shí)候你可以直接輸入“XXSER<>"'&”折床字符串,然后在查找源代碼的時(shí)候直接進(jìn)行查找XXSER或許比較方便一些。第二種情況:無(wú)法得知輸出位置
非常多的Web應(yīng)用程序源代碼是不對(duì)外開放的,這時(shí)在進(jìn)行測(cè)試XSS時(shí)就有可能無(wú)法得知輸入數(shù)據(jù)到底在何處顯示,比如測(cè)試某留言本是否存在XSS,那么在留言之后,你必須要經(jīng)過(guò)管理員的審核才能進(jìn)行顯示,這時(shí)你是無(wú)法得知,你輸入的數(shù)據(jù)在后臺(tái)管理頁(yè)面處于何種狀態(tài)。
萬(wàn)能測(cè)試XSS漏洞payload:"/></textarea><script>alert(1)</script>
7??XSS的防御策略:
只要有輸入數(shù)據(jù)的地方,就可能存在 XSS 危險(xiǎn)。永遠(yuǎn)不相信用戶的輸入。需要對(duì)用戶的輸入進(jìn)行處理,只允許輸入合法的值,其它值一概過(guò)濾掉。
XSS防御的總體思路是:對(duì)輸入進(jìn)行過(guò)濾,對(duì)輸出進(jìn)行編碼
httpOnly: 在 cookie 中設(shè)置 HttpOnly 屬性后,js腳本將無(wú)法讀取到 cookie 信息。
輸入過(guò)濾:一般是用于對(duì)于輸入格式的檢查,例如:郵箱,電話號(hào)碼,用戶名,密碼…等,按照規(guī)定的格式輸入。不僅僅是前端負(fù)責(zé),后端也要做相同的過(guò)濾檢查。因?yàn)楣粽咄耆梢岳@過(guò)正常的輸入流程,直接利用相關(guān)接口向服務(wù)器發(fā)送設(shè)置。
轉(zhuǎn)義 HTML: 如果拼接 HTML 是必要的,就需要對(duì)于url中的引號(hào),尖括號(hào),斜杠進(jìn)行轉(zhuǎn)義,但這還不是很完善.想對(duì) HTML 模板各處插入點(diǎn)進(jìn)行充分的轉(zhuǎn)義,就需要采用合適的轉(zhuǎn)義庫(kù)。 例如:htmlspecialchars()函數(shù)把一些預(yù)定義的字符轉(zhuǎn)換為 HTML 實(shí)體
預(yù)定義的字符是: & (和號(hào))成為 & " (雙引號(hào))成為 " ’ (單引號(hào))成為' < (小于)成為 < >(大于)成為 >**
白名單:對(duì)于顯示富文本來(lái)說(shuō),不能通過(guò)上面的辦法來(lái)轉(zhuǎn)義所有字符,因?yàn)檫@樣會(huì)把需要的格式也過(guò)濾掉。這種情況通常采用白名單過(guò)濾的辦法,當(dāng)然也可以通過(guò)黑名單過(guò)濾,但是考慮到需要過(guò)濾的標(biāo)簽和標(biāo)簽屬性實(shí)在太多,更加推薦使用白名單的方式。
總結(jié)
以上是生活随笔為你收集整理的对未标记为可安全执行的脚本_三、??XSS跨站脚本攻击的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: winrar 注册码
- 下一篇: 后端:MyBatis 面试问题集锦