1016.XXE漏洞攻防学习
前言
對于xxe漏洞的認識一直都不是很清楚,而在我為期不長的挖洞生涯中也沒有遇到過,所以就想著總結(jié)一下,撰寫此文以作為記錄,加深自己對xxe漏洞的認識。
xml基礎(chǔ)知識
要了解xxe漏洞,那么一定得先明白基礎(chǔ)知識,了解xml文檔的基礎(chǔ)組成。
XML用于標記電子文件使其具有結(jié)構(gòu)性的標記語言,可以用來標記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對自己的標記語言進行定義的源語言。XML文檔結(jié)構(gòu)包括XML聲明、DTD文檔類型定義(可選)、文檔元素
xml文檔的構(gòu)建模塊
所有的 XML 文檔(以及 HTML 文檔)均由以下簡單的構(gòu)建模塊構(gòu)成:
- 元素
- 屬性
- 實體
- PCDATA
- CDATA
下面是每個構(gòu)建模塊的簡要描述。
1,元素
元素是 XML 以及 HTML 文檔的主要構(gòu)建模塊,元素可包含文本、其他元素或者是空的。
實例:
空的 HTML 元素的例子是 "hr"、"br" 以及 "img"。
2,屬性
屬性可提供有關(guān)元素的額外信息
實例:
3,實體
實體是用來定義普通文本的變量。實體引用是對實體的引用。
4,PCDATA
PCDATA 的意思是被解析的字符數(shù)據(jù)(parsed character data)。
PCDATA 是會被解析器解析的文本。這些文本將被解析器檢查實體以及標記。
5,CDATA
CDATA 的意思是字符數(shù)據(jù)(character data)。
CDATA 是不會被解析器解析的文本。
DTD(文檔類型定義)
DTD(文檔類型定義)的作用是定義 XML 文檔的合法構(gòu)建模塊。
DTD 可以在 XML 文檔內(nèi)聲明,也可以外部引用。
1,內(nèi)部聲明:<!DOCTYPE 根元素 [元素聲明]> ex:?<!DOCTYOE test any>
完整實例:
2,外部聲明(引用外部DTD):<!DOCTYPE 根元素 SYSTEM "文件名"> ex:<!DOCTYPE test SYSTEM 'http://www.test.com/evil.dtd'>
完整實例:
而note.dtd的內(nèi)容為:
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (DTD實體
DTD實體是用于定義引用普通文本或特殊字符的快捷方式的變量,可以內(nèi)部聲明或外部引用。
實體又分為一般實體和參數(shù)實體
1,一般實體的聲明語法:<!ENTITY 實體名 "實體內(nèi)容“>
引用實體的方式:&實體名;
2,參數(shù)實體只能在DTD中使用,參數(shù)實體的聲明格式: <!ENTITY % 實體名 "實體內(nèi)容“>
引用實體的方式:%實體名;
1,內(nèi)部實體聲明:<!ENTITY 實體名稱 "實體的值"> ex:<!ENTITY eviltest "eviltest">
完整實例:
2,外部實體聲明:<!ENTITY 實體名稱 SYSTEM "URI">
完整實例:
在了解了基礎(chǔ)知識后,下面開始了解xml外部實體注入引發(fā)的問題。
XXE的攻擊與危害(XML External Entity)
1,何為XXE?
答: xxe也就是xml外部實體注入。也就是上文中加粗的那一部分。
2,怎樣構(gòu)建外部實體注入?
方式一:直接通過DTD外部實體聲明
XML內(nèi)容
方式二:通過DTD文檔引入外部DTD文檔,再引入外部實體聲明
XML內(nèi)容:
DTD文件內(nèi)容:
方式三:通過DTD外部實體聲明引入外部實體聲明
好像有點拗口,其實意思就是先寫一個外部實體聲明,然后引用的是在攻擊者服務(wù)器上面的外部實體聲明
具體看例子,XML內(nèi)容
dtd文件內(nèi)容:
3,支持的協(xié)議有哪些?
不同程序支持的協(xié)議如下圖:
其中php支持的協(xié)議會更多一些,但需要一定的擴展支持。
4,產(chǎn)生哪些危害?
XXE危害1:讀取任意文件
該CASE是讀取/etc/passwd,有些XML解析庫支持列目錄,攻擊者通過列目錄、讀文件,獲取帳號密碼后進一步攻擊,如讀取tomcat-users.xml得到帳號密碼后登錄tomcat的manager部署webshell。
另外,數(shù)據(jù)不回顯就沒有問題了嗎?如下圖,
不,可以把數(shù)據(jù)發(fā)送到遠程服務(wù)器,
遠程evil.dtd文件內(nèi)容如下:
觸發(fā)XXE攻擊后,服務(wù)器會把文件內(nèi)容發(fā)送到攻擊者網(wǎng)站
XXE危害2:執(zhí)行系統(tǒng)命令
該CASE是在安裝expect擴展的PHP環(huán)境里執(zhí)行系統(tǒng)命令,其他協(xié)議也有可能可以執(zhí)行系統(tǒng)命令。
XXE危害3:探測內(nèi)網(wǎng)端口
該CASE是探測192.168.1.1的80、81端口,通過返回的“Connection refused”可以知道該81端口是closed的,而80端口是open的。
XXE危害4:攻擊內(nèi)網(wǎng)網(wǎng)站
該CASE是攻擊內(nèi)網(wǎng)struts2網(wǎng)站,遠程執(zhí)行系統(tǒng)命令。
如何防御xxe攻擊
方案一、使用開發(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))方案二、過濾用戶提交的XML數(shù)據(jù)
關(guān)鍵詞:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。
最后
通過本次對XXE的總結(jié),認真了解了XML基礎(chǔ)知識,XXE的攻擊方式與及防御方案。
參考資料
1,未知攻焉知防——XXE漏洞攻防
2,XXE注入攻擊與防御
3,DTD教程
轉(zhuǎn)載于:https://www.cnblogs.com/yh-ma/p/10275933.html
總結(jié)
以上是生活随笔為你收集整理的1016.XXE漏洞攻防学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Capital one TPS整理
- 下一篇: DBvisualizer free 9.