首页 » 网站建设 » php上传宕机技巧_CVE20185711一张GIF图片就能让做事器宕机的PHP马脚

php上传宕机技巧_CVE20185711一张GIF图片就能让做事器宕机的PHP马脚

访客 2024-12-11 0

扫一扫用手机浏览

文章目录 [+]

最近,台湾Web漏洞挖掘大牛Orange Tsai在对一些Web开拓框架和程序实现模块进行安全审核的过程中,创造了一些故意思的漏洞。
就比如说,这个PHP的CVE-2018-5711,它能用一张GIF图片就可导致做事器发生崩溃直至宕机,在现实中非常随意马虎利用。
在此,Orange Tsai大略地先容了这个漏洞。

漏洞影响的PHP版本

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

php上传宕机技巧_CVE20185711一张GIF图片就能让做事器宕机的PHP马脚

PHP 5 < 5.6.33

php上传宕机技巧_CVE20185711一张GIF图片就能让做事器宕机的PHP马脚
(图片来自网络侵删)

PHP 7.0 < 7.0.27

PHP 7.1 < 7.1.13

PHP 7.2 < 7.2.1

漏洞细节

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

460 do {461 sd->firstcode = sd->oldcode =462 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 337 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 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图形的扩展库,对用户上传的图片作重新尺寸调度处理,以是该漏洞具有很强的现实危害。

后记

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

标签:

相关文章