PHP

PHP protocol的坑

Posted by rk700 on March 25, 2015

LFI(local file inclusion)是一类比较典型的漏洞,不过之前也并没怎么利用过它,主要还是include时往往有许多限制,比如文件的后缀必须是.php。今天偶然发现了PHP伪协议的一个坑,可以得到php文件的内容而不是作为php解释。

这是php://filter/convert.base64_encode/resource=。根据官方文档的描述,他可以像base64_encode()那样将stream进行编码。于是,在如下的场景中

<?php 

include($_GET["var"] . ".php");

?>

如果我们访问index.php?var=php://filter/convert.base64-encode/resource=index,那么就会得到include(php://filter/convert.base64-encode/resource=index.php),将index.php的内容进行base64编码了。由此,我们可以解码得到index.php的代码。

这种方法还有一点好处,是不包含截断用的\x00字符。当然,局限就是读后缀被对方限制的文件。不过能获取源代码,也是比较危险的了。

话说回来,之前ISG初赛有一道题目就是利用了PHP的data://text/plain;base64,这种protocol来绕过过滤。确实这些protocol给程序员带来了不少方便,但也埋下了一个个坑,给黑名单过滤这种机制带来隐患。