CTF竞赛中,有一类题目叫做无权查看。无权查看常见的形式是在web系统中,运行了一段得到flag的PHP代码,并将PHP源代码备份为PHP.bak。但是我们无法通过原web系统来查看PHP.bak中的内容。这个时候,我们需要运用一些技巧,绕过这种限制,获取flag。
首先,我们要了解一下PHP实现文件包含时的原理。当我们在PHP中使用require或include时,PHP会读取指定文件,并将文件中的代码插入到当前的PHP代码中。如果我们没有指定文件的路径,PHP会从include_path中查找符合条件的文件。如果include_path中没有找到文件,PHP会继续查找当前目录、PHP配置文件目录、或者apache配置文件目录下是否存在符合条件的文件。如果这些路径都没有找到文件,则PHP认为文件不存在,不再往后处理。我们可以通过修改include_path来绕过访问PHP.bak的限制。例如:
上面的代码中,我们把想要访问的目录/path/to/flag添加到include_path中,然后引入PHP.bak中的文件。PHP会按照上述的路径规则查找文件,找到符合条件的文件之后,就会将PHP.bak中的代码包含进来。只要我们在/path/to/flag目录中创建一个文件,其中包含获取flag的PHP代码,我们就能成功获取flag。
上面的方法需要我们修改PHP的配置项。如果我们没有这个权限,或者希望不改变PHP的全局配置,还可以采用另外一种方法绕过访问限制。这个方法称为PHP伪协议攻击。在PHP中,有一些特殊的文件协议,例如PHP://filter、PHP://input、PHP://output等,我们可以通过这些特殊的协议来绕过文件包含时的限制。其中,PHP://input协议是一个非常有用的协议,它表示PHP的输入流。我们可以通过POST或GET方式向PHP文件中传递数据,并将数据保存在PHP://input中。然后,我们就可以通过PHP://input协议读取数据,并获得包含在数据中的PHP代码,从而绕过文件包含时的限制。例如:
PHP // 读取POST或GET传递的数据,并将数据保存在PHP://input中 file_put_contents( 'PHP://input',"" ); // 引入PHP.bak中的文件 include('PHP.bak'); ?>
上面的代码中,我们使用file_put_contents函数将获取flag的PHP代码写入到PHP://input中,然后在PHP.bak中引入PHP://input。由于我们已经将获取flag的代码写入到了PHP://input中,因此PHP会自动执行该代码,并输出flag的内容。通过这样的方法,我们可以轻松绕过对PHP.bak的访问限制,查看其中的PHP源代码,获取flag。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。