[BJDCTF2020]EzPHP1 --不会编程的崽
这是一个PHP代码审计问题,涉及到文件包含漏洞和本地文件包含LFI(Local File Include)。
解题步骤:
- 分析代码:
<?php
$flag = "flag{...}"; // 假设的flag值
$file = $_GET['file'];
if (strstr($file, '../') || strstr($file, '..\\')) {
echo "Oh no, not again!";
exit();
}
include $file;
?>
这段代码首先定义了一个变量$flag
,用来表示flag。然后获取GET请求中的file
参数。接着代码检查$file
中是否包含../
或..\
,这是常用的目录跳转字符串,如果包含,则退出并显示消息。最后,如果$file
没有包含不允许的字符,则使用include
指令包含文件。
- 利用本地文件包含漏洞:
由于代码限制了$file
中不能包含../
或..\
,我们可以尝试使用绝对路径来读取服务器上的文件。
例如,如果服务器上有一个文件/etc/passwd
,我们可以通过构造URL:
http://challenge-url.com/?file=/etc/passwd
来尝试读取该文件的内容。
- 绕过限制:
如果无法直接读取文件,可以尝试以下方法:
- 利用
/
或\
代替../
或..\
,比如file=/etc/passwd
。 - 使用协议相对路径,如
file=//etc/passwd
(在Windows上可能需要两个斜杠file=\\\\etc\\passwd
)。 - 利用包含缓存文件,如
file=php://filter/convert.base64-encode/resource=flag
,然后解码得到内容。
- 获取flag:
成功读取文件后,你会得到文件的内容。如果文件内容是flag,那么你就获取到了flag。
注意:
- 不同的环境和PHP版本可能会有不同的绕过方法。
- 对于CTF比赛,确保不违反比赛规则。
- 本答案提供的信息仅用于学习目的,不得用于非法用途。
评论已关闭