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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

XXE详解

發(fā)布時(shí)間:2023/12/15 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 XXE详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

xxe漏洞的學(xué)習(xí)與利用總結(jié)

前言

對(duì)于xxe漏洞的認(rèn)識(shí)一直都不是很清楚,而在我為期不長(zhǎng)的挖洞生涯中也沒有遇到過,所以就想著總結(jié)一下,撰寫此文以作為記錄,加深自己對(duì)xxe漏洞的認(rèn)識(shí)。

xml基礎(chǔ)知識(shí)

要了解xxe漏洞,那么一定得先明白基礎(chǔ)知識(shí),了解xml文檔的基礎(chǔ)組成。

XML用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言,可以用來標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對(duì)自己的標(biāo)記語言進(jìn)行定義的源語言。XML文檔結(jié)構(gòu)包括XML聲明、DTD文檔類型定義(可選)、文檔元素

xml文檔的構(gòu)建模塊

所有的 XML 文檔(以及 HTML 文檔)均由以下簡(jiǎn)單的構(gòu)建模塊構(gòu)成:

  • 元素
  • 屬性
  • 實(shí)體
  • PCDATA
  • CDATA

下面是每個(gè)構(gòu)建模塊的簡(jiǎn)要描述。
1,元素
元素是 XML 以及 HTML 文檔的主要構(gòu)建模塊,元素可包含文本、其他元素或者是空的。
實(shí)例:

<body>body text in between</body>
<message>some message in between</message>

空的 HTML 元素的例子是 “hr”、”br” 以及 “img”。

2,屬性
屬性可提供有關(guān)元素的額外信息
實(shí)例:

<img src="computer.gif" />

3,實(shí)體
實(shí)體是用來定義普通文本的變量。實(shí)體引用是對(duì)實(shí)體的引用。

4,PCDATA
PCDATA 的意思是被解析的字符數(shù)據(jù)(parsed character data)。
PCDATA 是會(huì)被解析器解析的文本。這些文本將被解析器檢查實(shí)體以及標(biāo)記。

5,CDATA
CDATA 的意思是字符數(shù)據(jù)(character data)。
CDATA 是不會(huì)被解析器解析的文本。

DTD(文檔類型定義)

DTD(文檔類型定義)的作用是定義 XML 文檔的合法構(gòu)建模塊。

DTD 可以在 XML 文檔內(nèi)聲明,也可以外部引用。

1,內(nèi)部聲明:<!DOCTYPE 根元素 [元素聲明]> ex: <!DOCTYOE test any>
完整實(shí)例:

<?xml version="1.0"?>
<!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

2,外部聲明(引用外部DTD):<!DOCTYPE 根元素 SYSTEM “文件名”> ex:<!DOCTYPE test SYSTEM 'http://www.test.com/evil.dtd'>
完整實(shí)例:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note> 

而note.dtd的內(nèi)容為:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

DTD實(shí)體

DTD實(shí)體是用于定義引用普通文本或特殊字符的快捷方式的變量,可以內(nèi)部聲明或外部引用。

實(shí)體又分為一般實(shí)體和參數(shù)實(shí)體
1,一般實(shí)體的聲明語法:<!ENTITY 實(shí)體名 “實(shí)體內(nèi)容“>
引用實(shí)體的方式:&實(shí)體名;
2,參數(shù)實(shí)體只能在DTD中使用,參數(shù)實(shí)體的聲明格式: <!ENTITY % 實(shí)體名 “實(shí)體內(nèi)容“>
引用實(shí)體的方式:%實(shí)體名;

1,內(nèi)部實(shí)體聲明:<!ENTITY 實(shí)體名稱 “實(shí)體的值”> ex:<!ENTITY eviltest "eviltest">
完整實(shí)例:

<?xml version="1.0"?>
<!DOCTYPE test [ <!ENTITY writer "Bill Gates"> <!ENTITY copyright "Copyright W3School.com.cn"> ]>

<test>&writer;&copyright;</test>

2,外部實(shí)體聲明:<!ENTITY 實(shí)體名稱 SYSTEM “URI”>
完整實(shí)例:

<?xml version="1.0"?>
<!DOCTYPE test [ <!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> <!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> ]>
<author>&writer;&copyright;</author>

在了解了基礎(chǔ)知識(shí)后,下面開始了解xml外部實(shí)體注入引發(fā)的問題。

XXE的攻擊與危害(XML External Entity)

1,何為XXE?
答: xxe也就是xml外部實(shí)體注入。也就是上文中加粗的那一部分。

2,怎樣構(gòu)建外部實(shí)體注入?
方式一:直接通過DTD外部實(shí)體聲明
XML內(nèi)容

方式二:通過DTD文檔引入外部DTD文檔,再引入外部實(shí)體聲明
XML內(nèi)容:

DTD文件內(nèi)容:

方式三:通過DTD外部實(shí)體聲明引入外部實(shí)體聲明
好像有點(diǎn)拗口,其實(shí)意思就是先寫一個(gè)外部實(shí)體聲明,然后引用的是在攻擊者服務(wù)器上面的外部實(shí)體聲明
具體看例子,XML內(nèi)容

dtd文件內(nèi)容:

3,支持的協(xié)議有哪些?
不同程序支持的協(xié)議如下圖:

其中php支持的協(xié)議會(huì)更多一些,但需要一定的擴(kuò)展支持。

4,產(chǎn)生哪些危害?

XXE危害1:讀取任意文件

該CASE是讀取/etc/passwd,有些XML解析庫支持列目錄,攻擊者通過列目錄、讀文件,獲取帳號(hào)密碼后進(jìn)一步攻擊,如讀取tomcat-users.xml得到帳號(hào)密碼后登錄tomcat的manager部署webshell。

另外,數(shù)據(jù)不回顯就沒有問題了嗎?如下圖,

不,可以把數(shù)據(jù)發(fā)送到遠(yuǎn)程服務(wù)器,

遠(yuǎn)程evil.dtd文件內(nèi)容如下:

觸發(fā)XXE攻擊后,服務(wù)器會(huì)把文件內(nèi)容發(fā)送到攻擊者網(wǎng)站

XXE危害2:執(zhí)行系統(tǒng)命令

該CASE是在安裝expect擴(kuò)展的PHP環(huán)境里執(zhí)行系統(tǒng)命令,其他協(xié)議也有可能可以執(zhí)行系統(tǒng)命令。

XXE危害3:探測(cè)內(nèi)網(wǎng)端口

該CASE是探測(cè)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)站,遠(yuǎn)程執(zhí)行系統(tǒng)命令。

如何防御xxe攻擊

方案一、使用開發(fā)語言提供的禁用外部實(shí)體的方法

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。

最后

通過本次對(duì)XXE的總結(jié),認(rèn)真了解了XML基礎(chǔ)知識(shí),XXE的攻擊方式與及防御方案。

參考資料

1,未知攻焉知防——XXE漏洞攻防
2,XXE注入攻擊與防御
3,DTD教程

總結(jié)

以上是生活随笔為你收集整理的XXE详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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