源码级剖析PHP 7.2.x GD拒绝服务漏洞
触发条件:
php 7.2.x,开启gd库。只需要三行代码即可完成!
我在本地调试php的时候发现某个老代码能够直接把php给crash掉,因此成文。
php没有报错,直接死掉了,应该是内部逻辑有问题。再传到服务器上试试:
啊哈,一样的结果。触发这个问题的代码如下:
$im=imagecreate(100,100);
imageantialias($im,true);
imageline($im,0,0,10,10,0xffffff);
话不多说,上vs调试。先看调用堆栈吧。
从这里可以看出是在GD库的画像素点的地方出了错,被调试器断在了gdImageSetAAPixelColor这个函数里。
再看对应代码,访问了gdImagePtr结构体中的一个成员,导致访问违例。我们再从即时窗口检查一下:
没错,tpixels是个空指针!
那tpixels是干啥的呢?在gd.h里面有如下说明:
/* Truecolor flag and pixels. New 2.0 fields appear here at the
end to minimize breakage of existing object code. */
int trueColor;
int ** tpixels;
看来是和真彩色相关的东西,我们再沿着调用堆栈往前看。
这里是gdImageAALine函数,一个个点地画线,干的是苦力活。从gdImageLine里调用了它:
这里的条件判断是是否开启了防锯齿功能。如果我们调用imageantialias函数打开这个功能,那么就会走这里来。
上面图里就是我们从php调用的imageline函数的实现啦,非常简单。可以看出图片是真彩色的时候它会默认开启防锯齿功能。
这里问题就在于,我们创建(imagecreate)的图片不是真彩色的图,而后我们手动开启了防锯齿(imageantialias),调用进去想当然地把它当作一张真彩色图,从而导致了错误。
最后我们来看看两个函数的不同:
跟进去,可以看到imagecreate函数调用的gdImageCreate里直接把真彩色相关的成员设为了null。
与之对比,imagecreatetruecolor函数调用的gdImageCreateTrueColor函数里为每个像素点都分配了对应内存并初始化为0了:
总结一下,从上面分析可以看出,触发这个问题的条件有3个:
1.php版本为7.2.x且开启了gd库 2.创建了非真彩色图且开启抗锯齿 3.在创建的图句柄上进行像素点写入
导致这个问题的原因还是代码修改考虑不周全,引入了新的漏洞;没有对所有可能条件进行测试,所以从php 7.2.0一直到php 7.2.4都还存在问题。
已经向php官方报告,如果正在生产环境使用相关版本请退回旧版本,旧版本里不存在这个问题。
- 数据分析小案例(三):调查问卷(python)
- CTF---Web入门第十六题 天下武功唯快不破
- 数据分析小案例(二):面包是不是变轻了(python)
- 数据分析小案例(一):商业街抽奖(python)
- Bagging算法(R语言)
- iOS @property探究(一): 基础详解你要知道的@property都在这里
- 在创建带输出参数和返回值的存储过程时---犯下的一个低级错误
- iOS block探究(二): 深入理解你要知道的block都在这里
- 使用开源人脸特征提取器进行脸部颜值评分
- iOS @property探究(二): 深入理解你要知道的@property都在这里
- iOS block探究(一): 基础详解你要知道的block都在这里
- 在不动用sp_configure的情况下,如何 =》去掉列的自增长,并保留原数据
- iOS runtime探究(一): 从runtime开始理解面向对象的类到面向过程的结构体你要知道的runtime都在这里
- iOS runtime探究(二): 从runtime开始深入理解OC消息转发机制你要知道的runtime都在这里
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- Ubuntu下Subversion(SVN)的快速安装与配置详解
- Linux查看某个端口的连接数的方法
- 浅析Linux中使用nohup及screen运行后台任务的示例和区别
- 快速搭建简易、高效、多线程http服务器
- Linux解压文件到指定目录的方法
- Linux系统中CPU占用率较高问题排查思路与解决方法
- linux中ftp服务搭建需要注意的地方
- CentOS下使用LibreOffice实现文档格式的转换方式
- 详解在Linux中怎么使用cron计划任务
- Linux系统删除文件夹和文件的命令
- 详解Linux防火墙iptables禁IP与解封IP常用命令
- 在Ubuntu 16.04 Server上安装Zabbix的方法
- Centos7.3安装部署最新版Zabbix3.4的方法(图文)
- Linux系统下移植busybox中mkfs.vfat命令
- Linux服务器配置ip白名单防止远程登录以及端口暴露的问题