一、INFO_GENERAL:一般信息
1.1 版本
1.2 操作系统版本和SAPI
原创 猎豹安全中心 小豹讲安全 2021-05-25 14:30
在PHP中,我们往往通过phpinfo()函数(及可选选项)来检查配置设置和预定义变量,返回结果输出关于PHP的配置信息,其中包含了 PHP 编译选项、启用的扩展、PHP 版本、服务器信息和环境变量(如果编译为一个模块的话)、PHP环境变量、操作系统版本信息、path 变量、配置选项的本地值和主值、HTTP 头和PHP授权信息(License)。根据phpinfo()的可选选项,重点分析部分选项信息。
一、INFO_GENERAL:一般信息
1.1 版本
首先很明显就是PHP的版本了。截至写下这篇文章,PHP已经发布到PHP 8.0.3,但目前应用最广泛的仍然还是5和7版本了。PHP各个版本之间有很多特定的安全利用的trick,以下列举PHP 5到8版本之间与安全性的部分改动信息。
__autoload自动加载类,但只能一次调用;spl_autoload_register加载类,__autoload的实现
修复空字符截断
新增全局变量__DIR__
phar://流包装,绕过后缀限制、文件操作触发反序列化
glob://绕过open_dir列目录
删除注册全局变量、魔术引号、和安全模式
新增session.upload_progress.enabled,默认为1,可用来文件包含
废除preg_replace中可代码执行的\e修饰符
容易引发变量覆盖的函数import_request_variables()不可用
运算符...实现函数中支持可变数量的参数列表
移除script标签<script language="php"></script>、asp标签<% ... %>、<%= ... %>
含十六进制字符串不再被认为是数字
assert()成为一种语言构造,而不是一个函数,意味着很多assert一句话都会失效
移除preg_replace中可代码执行的\e修饰符
废除mb_ereg_replace()和mb_eregi_replace()的e模式修饰符
禁用assert以字符串作为第一个参数
废除可以动态执行字符串的create_function
废除容易导致变量覆盖的parse_str()无设置参数的行为
字符串数字弱类型比较优化
assert()不再支持执行代码
移除mb_ereg_replace()的e模式
移除create_function
移除php://filter中的string.strip_tags
这里仅仅列举各版本之间部分的改动信息,更多内容可在官方文档中进行查看。
1.2 操作系统版本和SAPI
操作系统版本信息可用于后续提权
SAPI
可以明显地判断PHP的连接方式
Apache 2.0 Handler
是通过Apache服务器的mod_php模块部署PHP服务的运行方式
FPM(FastCGI流程管理器)则是PHP FastCGI的一种替代实现。FPM有一个设计缺陷,由于两个进程间的通信没有进行安全性验证,可以伪造Nginx发送给FastCGI封装的数据给PHP-FPM去进行解析
1.3 配置文件路径和加载路径
Configuration File (php.ini) Path
指的是PHP默认的配置文件路径,Loaded Configuration File
是实际加载的配置文件。
这个php.ini文件可有或可无真实的文件(比如docker),其加载的配置文件会表示为"none"。
有无加载php.ini之间,其默认配置会有一些区别。
phith0n师傅在小密圈通过Discuz 7.x/6.x的全局变量防御绕过导致代码执行这个例子,提出了这样一个差异,request_order
项在apt安装(有php.ini)和docker(无php.ini)下的默认值分别为GP和CGP。
由于这里显示的是apt安装自己设定好的情况,查看安装的模块配置文件是放在Scan this dir for additional .ini files
目录,显示加载到的模块详情在Additional .ini files parsed
查看,源码安装其值则为none。
当源码安装PHP或安装扩展时候,使用设置--with-config-file-path
或--with-config-file-scan-dir选项来完成,那么在运行时,PHP将扫描加载所
有以.ini为后缀的文件,并在显示在Additional .ini files parsed
项。
假设以上路径可控,即可读可写,那么可控制覆盖PHP配置进行提权等操作。
1.4 协议/包装器(Registered PHP Streams)
php://
是php特有的协议,用于访问PHP的输入输出流、标准输入输出和错误描述符等功能
php://input可访问请求的原始数据的只读流,即POST请求的情况下,php://input可以获取到POST数据,但使用enctype="multipart/form-data"的时候,php://input是无效的
php://output只写的数据流,允许允许以print和echo一样的方式写入到输出缓冲区
php://filter常用到的伪协议,设计用于数据流打开时的筛选过滤应用(即Registered Stream Filters),读文件、读源码等有明显效果
file://
访问本地文件系统(绝对路径)guan,比如浏览器打开file:///d:/www/example.html
、
读取本地文件readfile('file:///etc/passwd')
;
glob://
查找匹配的文件路径模式,查找的文件路径也需要限定在open_basedir范围内
data://
可分为三部分,比如data://text/plain;base64,cGhwaW5mbw==
第一部分就是data协议头,标识了这个内容为一个data URI资源
第二部分为MIME类型,表示这个内容以怎样的方式去展现,比如text/plain即以文本类型展示
第三部分为编码设置,默认编码是 charset=US-ASCII,以上示例即为base64
http、https、ftp和ftps这些再熟悉不过了,略...
zip
PHP的读写zip文件的压缩流,zip文件压缩包可以压缩存放一个webshell,利用文件读取或者包含漏洞,
比如file=zip:///var/www/html/upload/abc.zip#shell.php
可执行利用。
除此之外,类似的压缩流协议还有compress.bzip2://
和compress.zlib://
等。
phar
PHP的读写归档,在不经过解压的情况下能够被php所访问并且执行。phar配合文件操作直接拓展了PHP反序列化攻击的利用面,并且还能绕过一大部分文件上传检测。
1.5 流过滤器(Registered Stream Filters)
PHP在Registered Stream Filters项默认提供了可用过滤器列表,以用于在调用php://filter
打开数据流进行读写时,应用相应的流过滤器对数据筛选。
可用过滤器列表如下:
标签:文件,php,系列,index,phpinfo,session,PHP,fastcgi From: https://www.cnblogs.com/o-O-oO/p/18269167