日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产精品嫩草影院精东 | www.色在线观看 | 日日操夜夜摸 | 欧美一级二级三级视频 | 久久精品九九 | 亚洲国产精品女人久久久 | 欧美一区二区三区免费看 | 黄色大片aa | 欧美精品在线免费观看 | av成人在线网站 | 久久精品国产亚洲av麻豆 | 成人三区 | 亚洲精品一区二区三区婷婷月 | 日韩av在线第一页 | 亚洲国产精品狼友在线观看 | 国产精品秘 | 91黄免费| 国产精品av在线免费观看 | 久久深夜 | 色悠悠网址| 国产精品久久久久久久久久妞妞 | 麻豆av一区二区三区久久 | 成人国产精品蜜柚视频 | 强制憋尿play黄文尿奴 | 日韩一级伦理片 | xxx性欧美 | 久久久久女人精品毛片九一 | 国产精彩视频一区二区 | 成年人午夜影院 | 欧美一二三| 亚洲欧美日本韩国 | 欧美 亚洲 视频 | 欧美人喂奶吃大乳 | 在线视频精品一区 | 波多野结衣一区二区三区高清 | 欧美男女交配视频 | 欧美人与性动交xxⅹxx | 成年人免费在线观看视频网站 | 国产一卡二卡 | 色婷婷亚洲 | 黄色的一级片 | 国产免费看av | 干干天天 | av一区二区在线播放 | 亚洲福利久久 | 国产视频不卡一区 | 在线中文视频 | 亚洲综合p| 国产一级做a爱免费视频 | 蓝牛av| 青青草视频网站 | 波多野结衣一区二区三区高清 | 国内激情自拍 | 女人的天堂av在线 | 久久精品美女 | 日少妇b | 实拍澡堂美女洗澡av | 亚洲AV成人午夜无码精品久久 | 日韩成人无码影院 | 色噜噜在线观看 | 日日骚一区 | 韩日av片| 日韩永久 | 中文字幕国产综合 | 五月天婷婷丁香花 | 秋霞自拍| 二区免费视频 | 一级中国毛片 | 久久久影院 | 中文字幕在线免费视频 | 欧美黑人又粗又大高潮喷水 | 国产精品二区一区 | 亚洲午夜精品一区二区三区 | 欧美一级大片在线观看 | 97激情| 亚洲熟女少妇一区二区 | 成年人免费黄色片 | 日韩高清国产一区在线 | xxxx999| 欧美 日韩 国产精品 | 黄网站欧美内射 | 亚洲av无码一区二区三区人妖 | 少妇脱了内裤让我添 | 黑人巨茎大战欧美白妇 | 成人黄色在线视频 | 欧美成人免费网站 | 在线成人 | 日韩精品电影在线 | jzjzjzjzj亚洲成熟少妇 | 国产又粗又大又黄 | 亚洲乱码国产乱码精品精的特点 | 一区二区久久久 | 日韩高清一区二区 | 日本吃奶摸下激烈网站动漫 | sao虎视频在线精品永久 | 日韩一区二区三区久久 | 国产美女极度色诱视频www | 丁香婷婷一区二区三区 | 日本一区二区三区视频在线观看 |