又是php代码审计,开始吧.
这不用审吧,啊喂.
意思就是我们要利用require_once()函数和传入的file的value去读取flag的内容.,貌似呢require_once()已经被用过一次了,直接读取还不行,看一下下面的知识点.
require_once()
require_once()
是 PHP 中的一个非常有用的函数,用于在脚本中引入(包含)另一个文件。与require()
函数类似,require_once()
在执行时也会尝试包含并运行指定的文件。但是,require_once()
函数有一个重要的区别:它会在尝试包含文件之前检查该文件是否已经被包含(或引入)过了。如果文件已经被包含过了,那么require_once()
将不会再次包含该文件,从而避免了函数、类、变量等的重复定义问题。
require_once
和include_once
机制在处理文件包含时,是基于文件的绝对路径来进行“已包含”检查的。这意味着,不论文件是通过直接路径、相对路径、符号链接(软链接)还是硬链接被引用,只要这些引用最终解析到同一个文件的绝对路径上,require_once
或include_once
就会认为该文件已经被包含过,从而避免重复包含
/proc/self/root <=> /
在Linux系统中,
/proc
是一个虚拟文件系统,它提供了一个接口来访问内核数据结构以及其他系统信息。/proc
文件系统中的一个特别重要的目录是/proc/self
,它是一个非常特殊的符号链接,指向访问它的进程的/proc/[pid]/
目录,其中[pid]
是该进程的进程ID(PID)。
/proc/self
的特性
/proc/self
是一个指向当前进程自己的/proc/[pid]/
目录的符号链接。这意味着,无论哪个进程访问/proc/self
,它都会看到与自己相关的/proc/[pid]/
目录的内容。- 这个特性在编写需要获取当前进程信息的程序时特别有用,因为无论程序的PID是多少,它都可以通过访问
/proc/self
来获取这些信息,而无需首先查询或传递PID。
/proc/self/root
的含义
/proc/self/root
是/proc/self/
目录下的一个特殊文件,它本身是一个符号链接,指向了根文件系统的挂载点。在大多数情况下,这个链接直接指向/
,即根目录。- 然而,在容器技术(如Docker)中,
/proc/self/root
的指向可能会有所不同。在容器内部,/proc/self/root
可能不指向宿主机的根目录(/
),而是指向容器内部的根文件系统,这取决于容器是如何配置和运行的。- 这种设计允许容器内的进程能够感知到自己运行在一个受限的、隔离的环境中,并且仍然可以通过
/proc/self/root
访问到这个环境的根文件系统。总之,
/proc/self
和/proc/self/root
提供了访问当前进程信息和根文件系统信息的便捷方式,同时也支持了Linux系统中复杂的容器化技术。
所以我们不能直接用伪协议去读取flag的内容,我们需要一点小小的技巧,就像人力有时尽一样,require_once()的匹配内容是有限的,咱们直接把require_once()累死来绕过,多让他读取几次总会有个极限的,而为了保证能够正确的读取到flag,填充的内容就为/proc/self/root.
目标明确开始构造flag.
http://f14010d8-c800-46aa-9b4c-e3cfacce9ece.node5.buuoj.cn:81/?file=php://filter/convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/flag.php
在进行一下base64解码,得到flag,游戏结束~