Bugku CTF_Web——file_get_contents
进入靶场
一段PHP代码
<?php
extract($_GET);
if (!empty($ac))
{
$f = trim(file_get_contents($fn));
if ($ac === $f)
{
echo "<p>This is flag:" ." $flag</p>";
}
else
{
echo "<p>sorry!</p>";
}
}
?>
php
extract($_GET);
extract($_GET);
:将$_GET
数组中的键值对作为变量导入当前的符号表。也就是说,如果通过 URL 传递了参数,例如?ac=value1&fn=value2
,那么$ac
会被设置为value1
,$fn
会被设置为value2
。- 这种使用方式可能会带来安全问题(变量污染)。恶意用户可能传入不受控制的变量名,覆盖原有变量,导致安全隐患。
php
if (!empty($ac))
- 判断
$ac
是否非空。如果$_GET
中没有传递ac
参数或它的值为空字符串,那么不会执行接下来的验证逻辑。
php
$f = trim(file_get_contents($fn));
file_get_contents($fn)
:读取$fn
指定文件的内容,并将读取的内容赋值给$f
。trim()
去掉内容的首尾空白字符。- 这里存在一个文件包含漏洞(LFI)。如果用户传入了
fn
参数并包含了系统中某个敏感文件的路径(如/etc/passwd
),那么代码将尝试读取该文件的内容,造成信息泄露。
php
if ($ac === $f)
- 检查
$ac
是否等于文件内容$f
。 - 如果相等,表示验证通过。
php
echo "<p>This is flag:" ." $flag</p>";
- 如果验证通过,将输出
This is flag: $flag
,其中$flag
是一个变量,可能包含某种标志 - 由于
$flag
没有在代码中定义,很可能在某个外部文件或环境变量中提供。
php
else
{
echo "<p>sorry!</p>";
}
- 如果
$ac
和$f
不相等,则输出sorry!
表示验证失败。
Get传输ac再用fn读取数据
看到file_get_contents就想到用php://input
构造payload
http://114.67.175.224:15128/?ac=1&fn=php://input
试了半天
一改Post就传输不过去
换成火狐的试了一下
flag就出来了
试了一下火狐的hackbar
貌似是插件问题
也传不过去
反正拿到flag了
flag{3f64315c5f6d1446ea5d192e1c17032a}