看题目提示,应该是一道文件包含的题目,打开环境后直接告诉我flag在flag.php里
但是因为不知道绝对路径,不能直接利用file读取
查看源码后,发现里面嵌入了一段php代码
代码审计
首先,通过if( !ini_get('display_errors') )判断当前PHP环境是否已设置display_errors配置参数。如果没有设置,则通过ini_set('display_errors', 'On')设置为打开错误显示功能。
使用error_reporting(E_ALL)设置错误报告级别为显示所有错误。
然后,从$_COOKIE数组中获取名为language的值,并将其赋值给$lan变量。
如果$lan不存在或为空,使用setcookie函数设置一个名为language的cookie,值为"english",并包含"english.php"文件。
如果$lan有值,根据该值包含相应的语言文件。
使用file_get_contents函数获取名为index.php的文件的内容,并将其赋值给变量$x。
最后,使用echo语句将变量$x的内容输出。
分析到这里方法就明确了,通过cookie传入文件包含的payload,就会执行
display_errors
display_errors是PHP配置选项之一,用于控制是否在页面上显示错误信息。
当display_errors配置参数被设置为On时,PHP会在页面上显示运行时错误信息。这对于开发和调试阶段非常有用,可以实时查看代码中的错误,并及时进行修复。
当display_errors配置参数被设置为Off时(或者未设置),PHP将禁止在页面上显示错误信息。这在生产环境中是一种常见的配置,以防止敏感信息暴露给用户或潜在的安全风险。
解题步骤
首先我们通过burp抓包,修改cookie值传入payload,这里尝试传入filter伪协议读取源码
发现可以读取,抓包后是没有Cookie字段的,记得插入Cookie的位置不要处于数据包最后,反正我会请求超时
解密后直接获得了flag
fileclude
代码审计
依旧很简单的哦
<?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);}}elsedie("NONONO");
}
首先包含flag文件
然后检测GET传参的file和fil2是否存在
如果存在就分别对变量进行赋值
如果变量都不为空,并且打开file2后的值等于hello ctf,就包含file1
直接这样构造file2,触发报错说没有找到目录或文件,有点傻的
突然想要file_get_contents函数是打开文件读取的,所以我们这里需要利用php的data伪协议写入数据
不行,虽然没有报错,但是没有回显数据,我语句没错吧
那就使用input方法写入文件吧
也不行,无语了没有报错说明其实写入了呀,为啥读不出来,检查了很多遍filter命令也没错
最后是因为,第一次传参的时候加了引号闭合,导致传入不成功
?file1=php://filter/convert.base64-encode/resource=flag.php&file2=data://text//plain,hello ctf
解码后获得flag