fileinclude(通过cookie赋值的文件包含)
这个故事告诉我们,网络世界里的“宝藏”往往藏在不起眼的角落。就像这次通过cookie赋值进行文件包含的操作,看似简单的代码背后,却隐藏着获取flag的秘密。首先,问题的核心在于如何通过lan的值来包含目标文件flag.php。既然lan是从cookie中获取的,那么我们只需在cookie中传入language=php://filter/read=convert.base64-encode/resource=flag,就可以巧妙地绕过直接访问的限制,读取到目标文件的源码。
那么,为什么需要base64编码呢?因为直接读取文件可能会遇到权限问题,或者文件内容被直接执行,导致无法获取有效信息。而通过php://filter伪协议进行base64编码后,我们可以安全地获取文件内容,再通过解码得到“宝藏”——flag。这种手法不仅仅是技术上的巧妙,更是对文件包含漏洞的深刻理解。
最后,想提醒大家,网络安全的世界里,不仅要有好奇心,更要有安全意识。就像这次的操作,虽然成功找到了flag,但也暴露了系统的潜在漏洞。如果你是一个开发者,务必加强对文件包含漏洞的防护,避免被黑客“挖宝”。如果你是安全爱好者,那就要深入研究这些技巧,既是为了学习,也是为了帮助他人完善安全防护。
打开链接,提示flag在flag.php里
内容里还有一个路径/var/www/html/index.php,猜测flag.php应该也是在这个路径下
Ctrl+u查看网页源码
代码中发现 @include($lan.".php");
可知这里存在文件包
且包含与lan的值有关
由代码 $lan = $_COOKIE['language'];
可知lan的值是从cookie的值传上去的
所以这里我们对language赋值
if(!$lan)
{
@setcookie("language","english");
@include("english.php");
}
如果lan的值为0,则会设置一个新的cookie,这并不是我们想要的,我们要使传入的lan不为0,即cookie的赋值不能为空。
else
{
@include($lan.".php");
}
当cookie不为空时,lan的值会和".php"拼起来
我们使用php://filter伪协议来读取flag.php的源码并进行base64编码输出
当它与包含函数结合时,php://filter流会被当作php文件执行
这里要注意我们指定的文件应该是flag而不是flag.php
(因为前面说了当cookie不为空时这个lan值会去和".php"进行拼接)
所以我们这里只需在cookie传入language=php://filter/read=convert.base64-encode/resource=flag
或者使用绝对路径
language=php://filter/read=convert.base64-encode/resource=/var/www/html/flag
读取到
PD9waHANCiRmbGFnPSJjeWJlcnBlYWNlezg5ZjcwNGMzNWIxMzNjODI1NDliMzAyYTFjMzM1Mjk5fSI7DQo/Pg==
将输出进行base64解码
或者直接在hackbar进行base64decode
得到
$flag="cyberpeace{89f704c35b133c82549b302a1c335299}