漏洞说明:

用一张GIF图片就可导致服务器发生崩溃直至宕机,在现实中非常容易利用。

影响版本:

PHP 5 < 5.6.33

PHP 7.0 < 7.0.27

PHP 7.1 < 7.1.13

PHP 7.2 < 7.2.1

漏洞细节: 漏洞存在于文件ext/gd/libgd/gdgifin.c中,其中在LWZReadByte_函数中存在一个循环(while-loop):

do { 

    sd->firstcode = sd->oldcode = 

    GetCode(fd, &sd->scd, sd->code_size, FALSE, ZeroDataBlockP); 

} while (sd->firstcode == sd->clear_code); 

GetCode函数仅只是一个包装类,GetCode_才是真正的执行体:

static int 

GetCode_(gdIOCtx *fd, CODE_STATIC_DATA *scd, int code_size, int flag, int *ZeroDataBlockP) 

{ 

    int           i, j, ret; 

    unsigned char count; 

       ... 

    if ((count = GetDataBlock(fd, &scd->buf[], ZeroDataBlockP)) <= ) 

       scd->done = TRUE; 

       ... 

} 

GetCode_ 会调用GetDataBlock来读取GIF图片中的数据:

static int 

GetDataBlock_(gdIOCtx *fd, unsigned char *buf, int *ZeroDataBlockP) 

{ 

 unsigned char   count; 

 if (! ReadOK(fd,&count,)) { 

     return -; 

 } 

 *ZeroDataBlockP = count == ; 

 if ((count != ) && (! ReadOK(fd, buf, count))) { 

     return -; 

 } 

 return count;
 

该漏洞依赖于从整形(int)到无符号字符(unsigned char)的类型转换。就像上述的:如果GetDataBlock_返回-1,则第400行中的scd->done将会被设置为True,并停止while循环。但是其定义的count是无符号字符,它总是从0到255的正数,所以这种循环停止动作是不会被触发执行的。

因此,最终结果就是,一张GIF图片就可以实现无限循环,导致服务器资源耗尽,直到崩溃宕机。

开始测试:

测试环境win10,php 7.0.12;

下载好poc.gif图片文件,放到桌面上。

win+R,输入cmd,打开cmd窗口。

cd Desktop

进入桌面位置。

输入

php -r imagecreatefromgif('poc.gif');

(注:本机已配置好php环境变量)

开了多个cmd窗口进行操作,可以看到CPU占用非常大。

另:

在window10装了phpstudy进行测试。

开了五个网页测试,然后访问本地服务器其他网页,可以访问得到,就是非常慢。

-- end;

参考链接:http://www.freebuf.com/vuls/161262.html

php GD库快速消耗CPU资源漏洞 CVE-2018-5711测试的更多相关文章

  1. 连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑

    由于是开发阶段,所以并没有配置postgres的参数,都是使用安装时的默认配置,以前运行也不见得有什么不正常,可是前几天我的cpu资源占用突然升高.查看进程,发现有一个postgres的进程占用CPU ...

  2. 一个表缺失索引发的CPU资源瓶颈案例

    背景 近几日,公司的应用团队反应业务系统突然变慢了,之前是一直比较正常.后与业务部门沟通了解详情,得知最近生意比较好,同时也在做大的促销活动,使得业务数据处理的量出现较大的增长,最终系统在处理时出现瓶 ...

  3. 逻辑读为何消耗CPU?

    在数据库系统中,经常会看到这个说法:“逻辑读很消耗CPU”,然后开始把这句话当作一个定理来使用.但是为什么“同样是读,为什么逻辑读会使用那么多CPU?” 查了一些资料,配合自己的理解,有下面几点体会: ...

  4. docker19.03限制容器使用的cpu资源

    一,用--cpus限制可用的cpu个数 例子: [root@localhost liuhongdi]# docker run -idt --name kafka1 --hostname kafka1 ...

  5. sql server 性能调优之 CPU消耗最大资源分析1 (自sqlserver服务启动以后)

    一. 概述 上次在介绍性能调优中讲到了I/O的开销查看及维护,这次介绍CPU的开销及维护, 在调优方面是可以从多个维度去发现问题如I/O,CPU,  内存,锁等,不管从哪个维度去解决,都能达到调优的效 ...

  6. 【转】如何快速定位JVM中消耗CPU最多的线程?

    [转]如何快速定位JVM中消耗CPU最多的线程? https://mp.weixin.qq.com/s?__biz=MzIwMzg1ODcwMw==&mid=2247487802&id ...

  7. 如何快速定位JVM中消耗CPU最多的线程?

    第一步.先找出Java的进程PID ps -ef | grep 进程名关键字 这里假设找到的PID是:12345   第二步.找出该进程内最消耗CPU的线程 top -Hp log4x R :11.7 ...

  8. 如何快速定位JVM中消耗CPU最多的线程? Java 性能调优

    https://mp.weixin.qq.com/s/ZqlhPC06_KW6a9OSgEuIVw 上面的线程栈我们注意到 nid 的值其实就是线程 ID,它是十六进制的,我们将消耗 CPU 最高的线 ...

  9. PostgreSQL相关的软件,库,工具和资源集合

    PostgreSQL相关的软件,库,工具和资源集合. 备份 wal-e - Simple Continuous Archiving for Postgres to S3, Azure, or Swif ...

随机推荐

  1. java控制多线程同时写一个文件

    最近出现一个需求,大体要做的就是控制多线程同时操作一个文件.当时第一个反应是不要用synchronized,太low了,然后我就使用了读写锁ReentrantReadWriteLock,然后写完静下来 ...

  2. 20175315 《Java程序设计》第6周学习总结

    20175215 <Java程序设计>第6周学习总结 教材学习内容总结 第七章主要讲的是内部类,匿名类,异常类等等. 内部类:Java支持在一个类中定义另一个类,称作内部类,包含内部类的类 ...

  3. 题解-GXOI/GZOI2019 特技飞行

    Problem loj3085 bzoj不放题面差评 题意概要:给出两条竖直直线,再给出 \(n\) 架飞机的初始航线:一条接通这两条直线的线段,保证航线交点不在两条直线上.现要求安排所有飞机在航线相 ...

  4. dash视频服务器本地搭建 (初探)

    2019-4-17 15:54:17 星期三 技术说明: dash: 将一个大视频分解成不同分辨率, 不同清晰度的小视频, 以及一个描述文件(后缀: mpd), 根据网络带宽自动调整视频流, 看起来更 ...

  5. C++11 double转化为string

    C++11转化double为string是一件很容易的事情. 方法: 1:使用C中的sprintf函数,这里就不说了. 2:使用std::ostringstream.这个与std::cout是一样的. ...

  6. JAVA Scanner的简单运用

    package Code428; import java.util.Scanner; /*Scanner 可以实现键盘输入数据 引用的步骤1.import 包路径.类名称只有java.lang包下的内 ...

  7. mysql 利用druid 为访问密码加密

    在原来数据库配置文件jdbc.properties 文件中增加几行加密文件 jdbc.username=rootjdbc.password=KqYkfcQkQOdOpCnaokLfb9Kbzdf+NG ...

  8. form表单老忘的

    禁止拉伸 textarea{ resize:none; } 左侧 label 对齐注意事项 必须要和 label-width 共同使用,才会生效. 表单域标签的宽度,直接写入 Form, 子元素 fo ...

  9. 记一个 dubbo中hessian2反序列化 Map 的一个问题

    dubbo版本: 2.5.10 解决方案: 改用 "dubbo" 序列化方式 (但是 dubbo 方式也存在一个比较坑的问题 详见: Dubbo序列化多个CopyOnWriteAr ...

  10. leetcode python快乐数

    编写一个算法来判断一个数是不是“快乐数” “快乐数”的定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复该过程直到为1,也可能是无限循环但始终变不到1. 如果可以变为1,那 ...