diff --git a/02.WEB安全/07.文件包含漏洞.md b/02.WEB安全/07.文件包含漏洞.md index 7db7c7d..8679bf2 100644 --- a/02.WEB安全/07.文件包含漏洞.md +++ b/02.WEB安全/07.文件包含漏洞.md @@ -92,26 +92,28 @@ include $_GET['file']; ### 2.1 常见协议 -file:// — 访问本地文件系统 -http:// — 访问 HTTP(s) 网址 -ftp:// — 访问 FTP(s) URLs -php:// — 访问各个输入/输出流(I/O streams) -zlib:// — 压缩流 -data:// — 数据(RFC 2397) -glob:// — 查找匹配的文件路径模式 -phar:// — PHP 归档 -ssh2:// — Secure Shell 2 -rar:// — RAR -ogg:// — 音频流 -expect:// — 处理交互式的流 +- file:// — 访问本地文件系统 + +- http:// — 访问 HTTP(s) 网址 +- ftp:// — 访问 FTP(s) URLs +- php:// — 访问各个输入/输出流(I/O streams) +- zlib:// — 压缩流 +- data:// — 数据(RFC 2397) +- glob:// — 查找匹配的文件路径模式 +- phar:// — PHP 归档 +- ssh2:// — Secure Shell 2 +- rar:// — RAR +- ogg:// — 音频流 +- expect:// — 处理交互式的流 ![image-20240130134253405](07.文件包含漏洞/image-20240130134253405.png) ### 2.2 php.ini 参数设置 在 php.ini 里有两个重要的参数:allow_url_fopen、allow_url_include。 -allow_url_fopen:默认值是 ON。允许 url 里的封装协议访问文件; -allow_url_include:默认值是 OFF。不允许包含 url 里的封装协议包含文件; + +- allow_url_fopen:默认值是 ON。允许 url 里的封装协议访问文件; +- allow_url_include:默认值是 OFF。不允许包含 url 里的封装协议包含文件; ![image-20240130134255497](07.文件包含漏洞/image-20240130134255497.png) @@ -281,9 +283,11 @@ foreach($it as $f){ #### 2.3.9 phar:// -PHP 伪协议 phar:// 可以用于在 PHP 中访问 Phar(PHP 归档)文件中的资源(如文件和目录)。 -Phar 文件是一个 PHP 应用程序或库的预打包归档文件,它可以包含代码、配置、模板、图片、音频等相关资源。Phar 格式相当于 Java 中的 JAR 包,.NET 中的 DLL 文件,或者 Python 中的 Egg 包。 -通过 phar:// 协议,我们可以在 PHP 中方便地对 Phar 文件中的特定资源进行读取、写入、修改、添加和删除等操作,而无需解压缩整个 Phar 文件,从而提高了文件操作的效率。 +- PHP 伪协议 phar:// 可以用于在 PHP 中访问 Phar(PHP 归档)文件中的资源(如文件和目录)。 + +- Phar 文件是一个 PHP 应用程序或库的预打包归档文件,它可以包含代码、配置、模板、图片、音频等相关资源。Phar 格式相当于 Java 中的 JAR 包,.NET 中的 DLL 文件,或者 Python 中的 Egg 包。 +- 通过 phar:// 协议,我们可以在 PHP 中方便地对 Phar 文件中的特定资源进行读取、写入、修改、添加和删除等操作,而无需解压缩整个 Phar 文件,从而提高了文件操作的效率。 + 举例来说,假设我们的目录结构如下: ``` @@ -309,9 +313,10 @@ $fileContent = file_get_contents($pharFile); | is_readable | is_writable | is_writeable | parse_ini_file | | copy | unlink | stat | readfile | -phar文件要能够上传到服务器端。如file_exists(),fopen(),file_get_contents(),file()等文件操作的函数要有可用的魔术方法作为“跳板”。文件操作函数的参数可控,且:、/、phar等特殊字符没有被过滤。 -可以理解为一个标志,格式为` xxx `,前面内容不限,但必须以__HALT_COMPILER() ;?> 来结尾,否则phar扩展将无法识别这个文件为phar文件。 -phar的本质是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data,这是上述攻击手法最核心的地方。 +- phar文件要能够上传到服务器端。如file_exists(),fopen(),file_get_contents(),file()等文件操作的函数要有可用的魔术方法作为“跳板”。文件操作函数的参数可控,且:、/、phar等特殊字符没有被过滤。 + +- 可以理解为一个标志,格式为` xxx `,前面内容不限,但必须以__HALT_COMPILER() ;?> 来结尾,否则phar扩展将无法识别这个文件为phar文件。 +- phar的本质是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data,这是上述攻击手法最核心的地方。 ##### 2.3.9.1 案例