========== 實驗環(huán)境 ========== Windows Server 2018 R2 DVWA ========== 實驗環(huán)境 ========== XSS攻擊,指黑客利用網(wǎng)站漏洞把惡意的腳本代碼(通常包括HTML代碼和JS腳本)注入到網(wǎng)頁中,當(dāng)用戶瀏覽網(wǎng)頁時,就會執(zhí)行其中的惡意代碼(控制用戶瀏覽器),對受害用戶采取Cookie數(shù)據(jù)竊取、會話劫持、釣魚欺騙等各種攻擊。 它對Web服務(wù)器沒有直接危害,借助網(wǎng)站進(jìn)行傳播,使網(wǎng)站的用戶受到攻擊。 攻擊者一般通過留言、電子郵件或其他途徑向受害用戶發(fā)送一個惡意的URL,當(dāng)惡意URL被用戶觸發(fā)時,惡意腳本就會在受害者的計算機(jī)上執(zhí)行。 造成XSS攻擊的因素?
XSS漏洞的危害 攻擊者通過注入如alert(/xss/)之類的JS代碼來證明XSS漏洞的存在性,但沒有真實地反映其危害性!
反射型XXS(非持久型XSS,一次性):主要用于將惡意腳本附加到URL地址參數(shù)中。 攻擊者通過特定的手法,比如利用電子郵件,誘使用戶去訪問一個包含惡意代碼的URL,當(dāng)受害者觸發(fā)時,惡意JS代碼會直接在受害者主機(jī)上的瀏覽器執(zhí)行。特點是,只在用戶觸發(fā)的時候,執(zhí)行一次! 流程: 通常出現(xiàn)在網(wǎng)站的搜索欄,用戶登入口,用來竊取客戶端Cookie或進(jìn)行釣魚欺騙。 POC:
過濾掉了<sCr<scrscRiptipt>OonN'"<> DVWA low: 過濾掉了<sCr<scrscRiptipt>,其他沒有過濾! 源碼: 構(gòu)造:
成功: medium: 源碼: 也只進(jìn)行了<script>過濾,替換了成空!攻擊手段同low一樣!
high: impossible: 結(jié)論: 使用php中的htmlspecialchars函數(shù)把預(yù)定義的字符&、”、 ’、<、>轉(zhuǎn)換為 HTML 實體, 防止瀏覽器將其作為HTML元素! 存儲型XSS:也叫持久型跨站腳本,攻擊者事先將惡意JS代碼上傳或存儲到漏洞服務(wù)器中,只要瀏覽包含惡意JS代碼的頁面就會被執(zhí)行。 持久型XSS一般出現(xiàn)在網(wǎng)站的留言、評論等交互處,惡意腳本被存儲到客戶端或者服務(wù)器的數(shù)據(jù)庫中,當(dāng)用戶瀏覽該網(wǎng)頁時,服務(wù)器從數(shù)據(jù)庫中讀取惡意用戶存入的非法數(shù)據(jù),然后顯示在頁面中,在受害者電腦上的瀏覽器執(zhí)行惡意代碼。它不需要用戶去單擊URL進(jìn)行觸發(fā),可以利用它滲透網(wǎng)站,掛馬,釣魚...... 利用此XSS還能編寫XSS蠕蟲,能夠在網(wǎng)站中實現(xiàn)病毒的幾何數(shù)級傳播!XSS蠕蟲會直接影響網(wǎng)站的所有用戶,一個地方出現(xiàn)XSS漏洞,網(wǎng)站下的所有用戶都有可能被攻擊。 low:
medium:
high:
impossible:
通過使用htmlspecialchars函數(shù),解決了XSS,但是要注意的是,如果htmlspecialchars函數(shù)使用不當(dāng),攻擊者就可以通過編碼的方式繞過函數(shù)進(jìn)行XSS注入,尤其是DOM型的XSS。 DOM型XSS:通過修改頁面的DOM節(jié)點形成的XSS,并不會將payload上傳到服務(wù)器,沒有與服務(wù)器端進(jìn)行交互,如果DOM中的數(shù)據(jù)沒有經(jīng)過嚴(yán)格確認(rèn),就會產(chǎn)生DOM—based XSS漏洞 可能觸發(fā)DOM型XSS的屬性 document.referer window.name location innerHTML documen.write low: 查看頁面源代碼: document屬于window 的一個子對象 window.location 包含 href 屬性,直接取值賦值時相當(dāng)于 window.location.href window.location.href 當(dāng)前頁面完整 URL document.location 包含 href 屬性,直接取值賦值時相當(dāng)于 document.location.href document.location.href 當(dāng)前頁面完整 URL decodeURI() 函數(shù)可對 encodeURI() 函數(shù)編碼過的 URI 進(jìn)行解碼 插入的 javascript 代碼可以在 decodeURL(lang) 被執(zhí)行
meduim: 查看服務(wù)器端源碼: array_key_exists() 函數(shù)檢查某個數(shù)組中是否存在指定的鍵名,如果鍵名存在則返回 true,如果鍵名不存在則返回 false。 stripos() 函數(shù)查找字符串在另一字符串中第一次出現(xiàn)的位置(不區(qū)分大小寫) header() 函數(shù)向客戶端發(fā)送原始的 HTTP 報頭 結(jié)論:Medium 級別過濾了 <script> 構(gòu)造:
high: 源碼:
impossible: 輸入的參數(shù)都進(jìn)行了URL編碼! 攻擊: Cookie劫持和欺騙 注意:詳細(xì)過程,請參考<<Web滲透測試(XSS)>>! 防御: Set-Cookie時給關(guān)鍵字Cookie植入HttpOnly標(biāo)識! Cookie與客戶端的IP地址綁定! 攻擊:模擬GET,POST請求操作用戶的瀏覽器 防御:提交表單的時候要求用戶輸入驗證碼 "修改密碼"的功能中,要求用戶輸入舊密碼! 繞過: 對于驗證碼,XSS Payload可以通過讀取頁面內(nèi)容,將驗證碼的圖片URL發(fā)送到遠(yuǎn)程服務(wù)器上來實施(遠(yuǎn)程XSS后臺接收當(dāng)前的驗證碼),將驗證碼的值返回給當(dāng)前的XSS Payload,從而繞過驗證碼。 修改密碼,可以通過釣魚網(wǎng)站來偽造獲取舊密碼! 攻擊:識別用戶瀏覽器(UserAgent對象) 但瀏覽器的UserAgent對象可以偽造,瀏覽器的好多擴(kuò)展都可以自定義瀏覽器的UserAgent,所以獲取到的信息不一定準(zhǔn)確。但由于瀏覽器之間實現(xiàn)存在差異,通過這些差異可以準(zhǔn)確地判斷出瀏覽器版本。(通過代碼實現(xiàn)) 攻擊:識別用戶安裝的軟件 IE中,通過判斷ActiveX控件的classid是否存在,來推測用戶是否安裝了該軟件。通過判斷用戶安裝的軟件,選擇對應(yīng)的瀏覽器漏洞,來植入木馬的目的。 攻擊:識別瀏覽器的擴(kuò)展和插件 firefox的插件列表存放在一個DOM對象中,通過查詢DOM對象可以遍歷出所有的插件。查詢navigator.plugins對象! firefox的擴(kuò)展,通過圖標(biāo)來判斷是否存在。 通過CSS,發(fā)現(xiàn)用戶曾經(jīng)訪問過的網(wǎng)站,style的visited屬性! 獲取用戶的真實IP地址: 比如客戶端安裝了Java環(huán)境,XSS可以調(diào)用Java Applet接口來獲取客戶端的本地IP地址。 ActiveX Flash iTunes office Word QuickTime ...等等第三方軟件的功能,來抓取用戶的本地信息。 XSS Cheat Sheet: 在測試XSS的過程中,需要嘗試各種XSS輸入,來繞過服務(wù)器端程序?qū)缯灸_本的過濾,如果有一份待測試的XSS語句列表會方便很多。 XSS語句列表羅列出各種各樣的XSS代碼,代碼在不同的瀏覽器、不同的應(yīng)用場景、不同的環(huán)境下均有跨站觸發(fā)的可能。通常,此類列表被稱為Cheat Sheet!
...... XSS構(gòu)造: 繞過XSS-filter XSS-filter一般基于黑白名單的安全過濾策略(攔截、編碼和消毒過濾等處理),實際上是一段編寫額過濾函數(shù)。
過濾和轉(zhuǎn)義<>和<script>
Javascript:[code]偽協(xié)議的形式,它聲明了URL的主體是任意的JS代碼,由JS的解釋器運行
注:不是所有標(biāo)記的屬性值都能產(chǎn)生XSS,通常只有引用文件的屬性才能觸發(fā)XSS腳本
過濾JavaScript等關(guān)鍵字
JS通常以分號結(jié)尾,如果JS引擎確認(rèn)一個語句是完整的,而這一行的結(jié)尾有換行符,那么就可以省略分號:
除了在引號中分隔單詞或強(qiáng)制結(jié)束語句之外,額外的空白無論以何種方式添加都無所謂!
繞過過濾:
對普通的HTML標(biāo)記的屬性值進(jìn)行過濾,用戶還是可以通過編碼處理來繞過,因為HTML中屬性值本身支持ASCII碼形式。
另外,tab符的ASCII碼 、換行符 、回車符 可以被插入到代碼中的任意位置!
onerror onclick ......
對style屬性進(jìn)行過濾! CSS的引入:
過濾/javascript/import字符
大小寫轉(zhuǎn)換 大小寫混淆 使用單引號 不使用引號
利用編碼工具,把字符編碼為十進(jìn)制或十六進(jìn)制進(jìn)行替換!
JS還支持unicode、escapes、八進(jìn)制等編碼形式! XSS shellcodeshellcode調(diào)用方式:
XSS的利用注意:具體實操在之前文章已有涉及,這里只涉及利用手段!
XSS防御
輸入過濾:(輸入是否合法,長度限制,格式,過濾敏感字符等等) 輸出過濾:(編碼處理,如HTML實體)
...... |
|