作者:从妖妖 | 来源:互联网 | 2023-10-11 11:04
本文由 东塔网络安全学院学员---吴同学 投稿。
0x00 文件包含的出现
开发者为了节约开发时间,可以将重复利用的代码使用文件包含的函数,如include,reuqire等进行文件包含,大大节约开发的时间和成本。
0x01文件包含函数
Include:包含并指定运行的函数。如果未找到文件则include结构会发出一条警告。
Require:包含并指定运行的函数。如果未找到文件则include结构会发出一个致命的错误。
Include_once:include_once语句和include语句完全相同,唯一区别是php会检查该文件是否已经被包含过,如果是则不会包含。
Require_once:require_once语句和require语句完全相同,唯一区别是php会检查该文件是否已经被包含过,如果是则不会包含。
0x02 php伪协议
Php支持的伪协议和封装协议:
具体协议请参照
![1742c891becad0e19dca606bf381be52.png](https://img5.php1.cn/3cdc5/9453/42f/22a8d373a8e02a9c.jpeg)
0x03常见伪协议的用法:
1. file://:指定一个绝对路径包含,该路径表示服务器所存在的文件的路径。
例如:
![3d6a24bf86dc29906e1c98f79b461829.png](https://img5.php1.cn/3cdc5/9453/42f/25b2409f442606d8.jpeg)
2. php://
1. php://input是个可以访问请求的原始数据的只读流,在PHP5.6之前打开的数据流只能读取一次。需要在配置文件php.ini的allow_url_include设置为on。
例如:http://192.168.10.115/test.php?file=php://input 【POST DATA】,使用菜刀连接方式如下:
![02c8ac6e4d655fec8e94ff09c79c3287.png](https://img5.php1.cn/3cdc5/9453/42f/035129344091352b.jpeg)
2. php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用。使用以下的参数将作为它路径的一部分。
![b178bb644de4c9979dd8f97f45844fcf.png](https://img5.php1.cn/3cdc5/9453/42f/43eb56f9fb8ab1ea.jpeg)
例子:
![1c2b1d00c8a16894b669d2beae7197d6.png](https://img5.php1.cn/3cdc5/9453/42f/3066b698540c631b.jpeg)
读取的内容为base64编码。
0x04例题
下面是来源于XTCTF的一道文件包含题:
![e91d24fda21bd539a854567aaa619fdf.png](https://img5.php1.cn/3cdc5/9453/42f/caabe2b9299630df.jpeg)
如图源码显示,$page表示GET传过来的参数,会将该参数进行包含。在while循环条件中,strstr表示查找字符串的首次出现,如果存在php://,循环不会结束。str_replace会将$page参数中中的php://字符替换为空,说明该循环是为了除掉php://伪协议。
这里可以发现,php://被过滤无法使用,file://需要知道本地文件的路径,我们可以使用data://伪协议进行包含。
使用playload:?page=data://text/plain,
![deb644e9058cc7316733d26f39f33072.png](https://img5.php1.cn/3cdc5/9453/42f/2a1d8096587e87fc.jpeg)
输出当前文件的路径,然后使用playload:?page=data://text/plain,
![79d187db5b22cef69a6e0e4b8267d88d.png](https://img5.php1.cn/3cdc5/9453/42f/07c6c24b882dab3a.jpeg)
读出当前路径下的所有文件,看到flag文件,读出该文件的内容就能拿到flag值。playload:?page=data://text/plain,
![d39e2cfbee3ef94ee2cc1a9318780429.png](https://img5.php1.cn/3cdc5/9453/42f/a594a290b738eead.jpeg)