• php GD库快速消耗CPU资源漏洞 CVE20185711测试


    漏洞说明:

    用一张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[2], ZeroDataBlockP)) <= 0) 
     
           scd->done = TRUE; 
     
           ... 
     
    } 

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

    static int 
     
    GetDataBlock_(gdIOCtx *fd, unsigned char *buf, int *ZeroDataBlockP) 
     
    { 
     
     unsigned char   count; 
     
     if (! ReadOK(fd,&count,1)) { 
     
         return -1; 
     
     } 
     
     *ZeroDataBlockP = count == 0; 
     
     if ((count != 0) && (! ReadOK(fd, buf, count))) { 
     
         return -1; 
     
     } 
     
     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

  • 相关阅读:
    类似吸顶功能解决ios不能实时监听onscroll的触发问题
    js 移动端识别手机号码
    H5输入框实时记录文字个数
    C语言指针和数组
    PHP变量
    PHP 的引用计数基础知识
    PHP提高效率的经验
    JS内置Function对象详解
    Javascript小细节总结
    浅析C++中内存分配的方式
  • 原文地址:https://www.cnblogs.com/passer101/p/8992905.html
Copyright © 2020-2023  润新知