日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

html中alert的用法_【渗透实战】通过HTML命名空间混淆绕过DOMPurify实现XSS

發(fā)布時(shí)間:2025/3/19 HTML 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 html中alert的用法_【渗透实战】通过HTML命名空间混淆绕过DOMPurify实现XSS 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
點(diǎn)擊上方藍(lán)字關(guān)注我們1概述本篇文章主要介紹了如何繞過主流的HTML殺毒程序庫DOMPurify。DOMPurify是一款使用JavaScript編寫的的HTML過濾庫,可以處理來自用戶的不受信任的HTML片段,刪除可能導(dǎo)致跨站腳本攻擊(XSS)的所有元素及屬性。具體的繞過方法如下所示:<form><math><mtext>form><form><mglyph><style>math><img src onerror=alert(1)>以上代碼沒有任何多余的元素,為了理解具體的繞過原理,我們需要先了解HTML規(guī)范的一些特性。2DOMPurify用法

我們首先了解下DOMPurify通常是如何使用的。假設(shè)我們需要將html Markup中一個(gè)不受信任的HTML賦值給某個(gè)div,我們可以通過以下代碼使用DOMPurify對該內(nèi)容進(jìn)行過濾,在賦值給div:

div.innerHTML = DOMPurify.sanitize(htmlMarkup)

在解析、系列化以及處理DOM樹的過程中,上訴代碼實(shí)際上會(huì)執(zhí)行以下操作:

  • htmlMarkup被解析為DOM樹

  • DOMPurify過濾DOM樹(簡而言之,這個(gè)過程中DOMPurify會(huì)遍歷DOM樹中的所有元素以及屬性,并刪除不在允許列表中的所有節(jié)點(diǎn))

  • DOM樹被序列化回HTML標(biāo)記

  • 賦值給innerHTML之后,瀏覽器將再次解析HTML標(biāo)記

  • 解析的DOM樹被附加到文檔的DOM樹中

  • 來看個(gè)簡單的示例。假設(shè)我們的初始標(biāo)記為AB。在第一步中,它會(huì)被解析到以下樹中:然后,DOMPurify對其進(jìn)行過濾后,剩下以下DOM樹:將其系列化后得到以下內(nèi)容:A<img src="1">B

    這就是DOMPurify.sanitize返回的結(jié)果。然后瀏覽器在賦值給innerHTML時(shí)會(huì)再次解析該標(biāo)記。

    DOM樹與DOMPurify處理過的樹相同,然后將其附加到目標(biāo)文檔中。

    簡而言之,按順序,以上過程可以總結(jié)成:解析->序列化->解析。直觀上,大家可能會(huì)覺得系列化DOM樹,并再次解析后,應(yīng)該會(huì)返回初始的DOM樹,但事實(shí)并非如此。

    HTML規(guī)范中,關(guān)于系列化HTML片段的警告信息表明:如果使用HTML解析器進(jìn)行解析,則此算法[序列化HTML]的輸出可能不會(huì)返回初始的樹結(jié)構(gòu)。HTML解析器本身也有可能輸出不往返序列化和重新解析步驟的樹結(jié)構(gòu),盡管這種情況通常不符合要求。

    值得注意的是,序列號-重新解析的往返操作并不一定能返回初始的DOM樹,這也是造成mutation XSS(突變XSS) 的根本原因。通常這類情況是由于某些解析器、序列化器錯(cuò)誤所導(dǎo)致的結(jié)果,但有兩種特殊情況符合上訴警告信息所描述的場景。

    3嵌套FORM元素

    其中一種情況涉及FORM元素,它是HTML里非常特殊的一個(gè)元素,因?yàn)樗旧聿荒芮短住TML規(guī)范中,明確指出FORM元素不可以是某個(gè)FORM元素的后繼。

    可以在任何瀏覽器中使用以下標(biāo)記進(jìn)行驗(yàn)證:

    <form id=form1>INSIDE_FORM1<form id=form2>INSIDE_FORM2

    該片段會(huì)生成以下DOM樹:

    第2個(gè)form在DOM樹中會(huì)被完全忽略,就像從未存在過一樣。

    接下來是比較有趣的部分。如果我們繼續(xù)閱讀HTML規(guī)范,會(huì)發(fā)現(xiàn)它實(shí)際上給出了一個(gè)示例,該示例通過帶有錯(cuò)誤嵌套標(biāo)簽的標(biāo)記成功創(chuàng)建了一個(gè)嵌套式表單。如下所示:

    <form id="outer"><div>form><form id="inner"><input>

    結(jié)果會(huì)生成以下包含一個(gè)嵌套表單元素的DOM樹:

    這并不是特定瀏覽器的bug,它直接來自HTML規(guī)范,并且在解析HTML的算法中也有描述。大意如下所示:

    • 當(dāng)我們打開標(biāo)簽時(shí),解析器需要記錄該標(biāo)簽是由表單元素指針打開的。如果指針不為空,則無法創(chuàng)建表單元素。

    • 當(dāng)我們結(jié)束標(biāo)簽時(shí),表單元素指針始終設(shè)置為null。

    因此,回到以下片段:

    <form id="outer"><div>form><form id="inner"><input>

    首先,表單元素指針設(shè)置為id =“outer”,然后開始解析div,碰到閉合標(biāo)簽后,表單元素指針會(huì)被設(shè)置為null。由于指針為null,因此可以創(chuàng)建下一個(gè)id=“ inner”的表單。并且由于我們當(dāng)前位于div內(nèi),因此可以成功創(chuàng)建一個(gè)嵌套式表單。

    現(xiàn)在,如果我們嘗試序列化生成的DOM樹,將獲得以下標(biāo)記:

    <form id="outer"><div><form id="inner"><input>form>div>form>

    值得注意的是,該標(biāo)記將不包含任何錯(cuò)誤嵌套的標(biāo)簽。當(dāng)再次解析標(biāo)記時(shí),將創(chuàng)建以下DOM樹:

    綜上,我們證明了經(jīng)過序列化、重解析后并不一定能返回原始的DOM樹。更有趣的是,這基本上是一種符合規(guī)范的突變。

    當(dāng)我發(fā)現(xiàn)這一點(diǎn)后,便意識到可以通過某種方式濫用這種特性以繞過HTML過濾器。思考了很久后,偶然間發(fā)現(xiàn)HTML規(guī)范中的另一個(gè)異常點(diǎn)。在繼續(xù)討論該問題前,我們先來了解下HTML規(guī)范中的潘多拉魔盒:外部內(nèi)容(foreign content)。

    4外部內(nèi)容

    外部內(nèi)容就好比一把瑞士軍刀,可以用來破壞解析器及過濾器。該方法曾被我用來繞過DOMPurify以及Ruby過濾庫。

    HTML解析器可以使用三個(gè)命名空間元素創(chuàng)建DOM樹:?

    • HTML命名空間(http://www.w3.org/1999/xhtml)?

    • SVG命名空間(http://www.w3.org/2000/svg)?

    • MathML命名空間(http://www.w3.org/1998/Math/MathML)?

    默認(rèn)情況下,所有元素都位于HTML命名空間中。但是,如果解析器遇到或元素,則它將分別“切換”到SVG和MathML命名空間。這兩個(gè)命名空間都會(huì)產(chǎn)生外部內(nèi)容。

    在外部內(nèi)容中,標(biāo)記的解析過程與普通的HTML不同。尤其是在解析


    思考以下標(biāo)記:

    <style><a>ABCstyle><svg><style><a>ABC

    它將被解析成以下DOM樹:

    備注:從現(xiàn)在開始,本文DOM樹中的所有元素都將包含一個(gè)命名空間。因此html style意味著它是HTML命名空間中的


    最終的DOM樹證實(shí)我的觀點(diǎn):html style僅包含文本內(nèi)容,而svg style會(huì)像普通元素一樣被解析。?


    繼續(xù)分析,我們可能會(huì)猜想:如果我們位于或內(nèi)部,則所有元素也都會(huì)位于非HTML命名空間中。但事實(shí)并非如此,HTML規(guī)范中包含MathML文本集成點(diǎn)和HTML集成點(diǎn),這些元素的子元素都具有HTML命名空間(但某些情況除外)。?


    思考以下示例:

    <math><style>style><mtext><style>style>

    它將被解析成以下DOM樹

    請注意觀察,在MathML命名空間中,style元素是如何成為math的直接子元素的,而mtext中的style元素則位于HTML命名空間中。這是因?yàn)閙text是MathML文本集成點(diǎn),并使用解析器切換命名空間。


    MathML文本集成點(diǎn)包括:


    • math mi

    • math mo

    • math mn

    • math ms


    HTML集成點(diǎn)包括:


    • math annotation-xml(如果其具有encoding屬性,并且屬性值等于text/html或者application/xhtml+xml)

    • svg foreignObject

    • svg desc

    • svg title

    我之前一直以為MathML文本集成點(diǎn)或HTML集成點(diǎn)的所有子級,默認(rèn)情況下都具有HTML命名空間,但事實(shí)并非如此。HTML規(guī)范指出,默認(rèn)情況下,MathML文本集成點(diǎn)的子級都位于HTML命名空間中。但有兩種例外情況:mglyph和malignmark。只有當(dāng)它們是MathML文本集成點(diǎn)的直接子級時(shí),才會(huì)發(fā)生這種情況。


    我們可以通過以下標(biāo)記進(jìn)行檢查:

    注意,作為mtext的直接子元素的mglyph在MathML命名空間中,而作為html元素的子元素的mglyph在HTML命名空間中。


    假設(shè)我們想確定一個(gè)“當(dāng)前元素”的命名空間。此時(shí)我已經(jīng)制定了一些經(jīng)驗(yàn)法則:


    • 非滿足以下條件,否則當(dāng)前元素將位于其父元素的命名空間中

    • 如果當(dāng)前元素為或,且其父元素在HTML命名空間中,則當(dāng)前元素分別位于SVG或MathML命名空間中。?

    • 如果當(dāng)前元素的父元素是HTML集成點(diǎn),則當(dāng)前元素位于HTML命名空間中除非它是或。?

    • 如果當(dāng)前元素的父元素是MathML集成點(diǎn),則當(dāng)前元素位于HTML命名空間中,除非它是,,或。

    • 如果當(dāng)前元素是,,

      ,,
      ,,,,,,, ,,

      ,,,,,
    • ,,,,,,

      ,,,,或,并定義了color,face或size屬性,那么堆棧上的所有元素將關(guān)閉,直到看到MathML文本集成點(diǎn)、HTML集成點(diǎn)或HTML命名空間中的元素為止。然后,當(dāng)前元素也會(huì)位于HTML命名空間中。

    當(dāng)我在HTML規(guī)范中找到mglyph時(shí),馬上就意識到這是濫用html form突變以繞過過濾器的方法。
    5
    DOMPurify繞過


    因此,讓我們回到繞過DOMPurify的有效載荷上:有效載荷利用了錯(cuò)誤嵌套的html form元素,并且包含mglyph元素,它將生成以下DOM樹:該DOM樹是無害的,所有元素都在DOMPurify的允許列表中。值得注意的是,mglyph位于HTML命名空間中,而看起來像XSS有效載荷的代碼片段只是html style中的一個(gè)文本。由于存在一個(gè)嵌套的html form,所以我們可以確定此DOM樹將在重新解析時(shí)發(fā)生突變。


    因此,這里DOMPurify不會(huì)執(zhí)行任何操作,將返回序列化的HTML:



    該片段具有嵌套的Form標(biāo)簽。因此,當(dāng)其賦值給innerHTML時(shí),將被解析成以下DOM樹:所以現(xiàn)在沒有創(chuàng)建第二個(gè)html表單,mglyph為mtext的直接子元素,這意味著它位于MathML命名空間中。因此,style同樣位于MathML命名空間中,且其內(nèi)容不會(huì)被視為文本來解析。然后, math>會(huì)閉合元素,現(xiàn)在會(huì)在HTML名稱空間中創(chuàng)建img,從而導(dǎo)致XSS。


    6總結(jié)


    以上繞過方式可以總結(jié)成以下幾點(diǎn):


    DOMPurify的典型使用方法致使HTML標(biāo)記被解析兩次

    HTML規(guī)范中存在特殊情況,可以創(chuàng)建嵌套form元素。但是,在重新解析時(shí),第二個(gè)form會(huì)被忽略

    mglyph和malignmark是HTML規(guī)范中的特殊元素,即使默認(rèn)情況下其他所有標(biāo)簽都位于HTML命名空間中,但如果它們是MathML文本集成點(diǎn)的直接子元素,那么它們也將位于MathML命名空間中。

    結(jié)合以上幾點(diǎn),我們可以創(chuàng)建一個(gè)具有兩個(gè)form元素和mglyph元素的標(biāo)記,這些標(biāo)記最初位于HTML命名空間中,但是在重新解析時(shí)位于MathML命名空間中,從而使后續(xù)的style標(biāo)簽的解析方式有所不同,導(dǎo)致XSS。


    end




    好文!必須在看

    總結(jié)

    以上是生活随笔為你收集整理的html中alert的用法_【渗透实战】通过HTML命名空间混淆绕过DOMPurify实现XSS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久综合伊人 | 亚洲第一天堂影院 | 国产 日韩 欧美 精品 | 成人午夜影院在线观看 | 美女啪啪网址 | 制服丝袜av一区二区三区下载 | 五月天一区二区三区 | 99精品在线视频观看 | a国产| 日本妇乱大交xxxxx | 这里只有精品在线播放 | 91视频精品 | 日韩黄色片 | 久热在线视频 | 精品欧美一区二区三区成人 | bt天堂新版中文在线地址 | 伦理亚洲| 青娱乐久久 | 久热热| 日韩每日更新 | 日韩国产一区二区三区 | 免费黄色av片 | 男人日女人b视频 | 欧美人与zoxxxx另类 | 久久最新 | 小早川怜子久久精品中文字幕 | 久久久久久综合网 | 国产精品毛片 | 国产成人短视频在线观看 | 制服丝袜亚洲色图 | 成人免费毛片嘿嘿连载 | 亚洲黄色在线观看视频 | 亚洲激情图片区 | 丁香色欲久久久久久综合网 | 国产精彩视频一区二区 | 成年人在线免费 | 小俊大肉大捧一进一出好爽 | 日韩六九视频 | 免费一区二区三区 | 国偷自产视频一区二区久 | 凹凸视频一区二区 | 日韩无码电影 | 亚洲高清在线免费观看 | 91.xxx.高清在线| 超碰狠狠操 | 午夜精品免费观看 | 中文字幕人妻伦伦 | 中文字幕日韩欧美 | av2014天堂| 在线免费看污网站 | 捆绑无遮挡打光屁股 | 欧美一级免费 | 成人午夜视频在线观看 | 国产高清免费在线观看 | 午夜特片网 | 国产成人免费视频 | 麻豆chinese极品少妇 | 中文字幕无码乱码人妻日韩精品 | 美女自卫网站 | 亚洲天堂手机在线观看 | 老熟妇仑乱一区二区视频 | 国产精品天美传媒入口 | 日韩欧美一区二区在线观看 | 丝袜视频在线观看 | 国产香蕉视频在线播放 | 精品韩国一区二区三区 | 亚洲影院一区二区三区 | 亚洲男女啪啪 | xxxx亚洲| 91av视频在线免费观看 | 丝袜人妖 | 天天舔天天摸 | 久草剧场 | 久久久美女视频 | 一本在线免费视频 | bangbros性欧美18| 色玖玖 | 中文字幕在线免费看线人 | 国产精品一区二区久久毛片 | 97伦伦午夜电影理伦片 | 中文字幕av专区 | 亚洲一区二区三区国产 | 久久久久草 | 99热在线观看免费 | 毛片毛片毛片毛片毛片毛片毛片毛片 | 国产精品免费av一区二区 | 日本无遮挡边做边爱边摸 | 韩国伦理片在线播放 | 日本中文字幕免费观看 | 国产精品久久影视 | 一道本无吗一区 | 亚洲国产大片 | av影片在线 | 图书馆的女友动漫在线观看 | 亚洲伊人精品 | 成人精品免费在线观看 | 涩涩视频在线免费看 | 天天躁夜夜躁狠狠是什么心态 | 亚洲大片免费看 |