PHP多个版本爆出远程DOS漏洞
近日,php多个版本爆出远程DoS漏洞(官方编号69364),利用该漏洞构造poc发起链接,很容易导致目标主机cpu的100%占用率,绿盟科技威胁响应中心随即启动应急机制, 启动应急响应工作,总结PHP漏洞要点,并制定了一系列防护方案。
受此漏洞影响的软件及系统包括PHP的版本有:
• PHP 5.0.0 - 5.0.5
• PHP 5.1.0 - 5.1.6
• PHP 5.2.0 - 5.2.17
• PHP 5.3.0 - 5.3.29
• PHP 5.4.0 - 5.4.40
• PHP 5.5.0 - 5.5.24
• PHP 5.6.0 - 5.6.8
此次漏洞具备的特性有:
1. 一旦被利用成功,可以在迅速消耗被攻击主机的CPU资源,从而达到DoS的目的;
2. PHP在全球的部署量相当大,为攻击者提供了相当多可以攻击的目标;
3. PHP官方目前仅给出了5.4及5.5版本的补丁。
有关PHP远程DoS漏洞
4月3日,有人在PHP官网提交PHP 远程DoS漏洞(PHP Multipart/form-data remote dos Vulnerability),代号69364。该漏洞涉及PHP的所有版本,影响面较大,所以发布后迅速引发多方面关注。14日,各种PoC已经在网络上流传。
Boundary中的键值对分隔
PHP是一种流行的Web服务器端编程语言,它功能强大,简单易用,利用它编写网络应用程序,可以应对大规模的Http请求,所以很多业务环境中都部署了PHP。考虑规范性,PHP在设计之初就遵循rfc规范,进行各个协议模块的封装及过程处理。PHP与其他同样遵循rfc规范的语言及环境相比,不过是处理方式不同。
而从rfc1867开始,http协议开始支持"multipart/form-data"请求,以便接受多种数据格式,包括多种变量甚至是文件上传。multipart/form-data中可以包含多个报文,每一个报文boundary(分隔符)分隔开来,而每个报文中都包含了多行键值对,键值对用冒号分隔,这样的设计是为了让程序可以清晰的区分这些数据。

但如果由于某种原因,键值中间缺少了那个冒号,PHP函数会将下一对键值合并到了上一行,形成这样的键值对,“键1:值1键2值2”。由于PHP进行键值合并的算法不够优化,这样的事情发生几次还没什么,如果数以百万记,就变成了一种灾难。
在下面的例子中,当a的部分达到一定数量的时候(几十万行or上百万行),由于每行键与值之间并没有冒号分隔,函数就自动将下一行的键值对合并,这样数据越来越大,越来越长,函数针对这些数据不断执行内存的分配和释放,最终被攻击目标主机的CPU资源被耗尽。

这样的代码,在抓包时显示情况如下:

Boundary报文解析过程
PHP在main/rfc1867.c中,有两个函数都涉及boundary的解析,包括SAPI_API SAPI_POST_HANDLER_FUNC及multipart_buffer_headers函数。DoS漏洞出现在main/rfc46675pxultipart_buffer_headers函数。
PHP先解析解析multipart/form-data http请求, http请求体的入口函数在SAPI_POST_HANDLER_FUNC(rfc1867.c中的函数),SAPI_POST_HANDLER_FUNC函数首先解析请求的boundary,也就是POST请求中第一次定义时的boundary;并且在其内部调用了multipart_buffer_headers,该函数先找到boundary(也就是一次引用的boundary),会和定义时的boundary比较。如果相等即找到第一次引用的boundary,接下来会逐行读取请求的输入以解析body port header(也就是解析第一次引用boundary后面的内容)。
SAPI_API SAPI_POST_HANDLER_FUNC




multipart_buffer_headers



出现问题的函数处理逻辑
multipart_buffer_headers函数在解析HTTP请求中的multipart头部数据时,每次解析由get_line得到的一行键值对。当被解析的行是以空白字符开始,或者出现一个不包含 ' : ' 的行,该行将被当作是上一行键值对的延续来处理,将当前的值拼接到上一个键值对里,并且在拼接的过程里,该函数进行如下动作:
一次内存分配

两次内存复制

一次内存释放

当出现多个不包含 ' : ' 的行时,PHP就会进行大量内存分配释放的操作,并且分配的空间与拷贝的长度将越来越大。当行的数目足够多时,拷贝的操作将显著的消耗服务器的CPU。实际测试中,包含近一百万行的头字段可以使服务器的CPU保持100%几秒或者数十秒。如果并发多个攻击请求,可能造成更长时间的资源占用。
漏洞利用原理
攻击者可通过发送一个2M左右的包含多行multipart头部数据的HTTP请求来发起攻击,无需认证,也不依赖PHP程序本身的内容。例如,通过发送畸形请求,每隔若干秒,同时并发多个这样的请求,就会耗尽目标主机的CPU资源。
PHP远程DoS漏洞检测
面对如此简单的漏洞利用,以及较低的攻击门槛,分析人员迅速将经过安全验证后的检测方法向云端、产品端及服务端传递,并建议用户尽快对其业务环境进行一次全面的漏洞检测,以便可以尽快拿到第一手数据,为后续制定漏洞防护方案及执行措施提供数据支撑及决策依据。
云端检测
5月16日晚,绿盟科技客户自助门户系统Portal发布PHP远程DoS漏洞检测引擎,为PHP Multipart/form-data远程DoS漏洞(PHP-69364)提供扫描支持。

现在您随时可以使用这个自助系统,对业务环境进行扫描,以便确认是否存在该漏洞,扫描请点击:https://portal.nsfocus.com/vulnerability/list/
漏洞确认 当扫描结果信息中出现信息“您的检测目标存在此漏洞”,即可确认当前业务环境中存在该漏洞,建议您尽快制定防护计划,以避免系统在获得加固前遭受攻击。
产品检测
通过部署绿盟远程安全评估系统(Remote Security Assessment System),可以在您的业务环境中快速扫描及获取此次漏洞情况,同时支持1实现漏洞的安全闭环管理,包括预警、检测、分析管理、修补、审计等几个环节;2获取丰富的漏洞和配置知识库支持,该知识库是国内领先的安全漏洞库,目前累计接近3万条;3灵活部署,并获得绿盟企业安全中心(NSFOCUS ESPC)进行集中管理,可以有效实现大型网络的统一漏洞管理。4享有Gartner推荐的信誉保障。

PHP远程DoS漏洞防护
知道了漏洞利用方法,也知道了攻击检测方法,那么漏洞的防护也就知道该如何做了。如果确认您的业务环境中存在这个漏洞,那么就需要参考上面的信息,尽快制定并启动加固方案,这些加固从漏洞补丁开始,到产品防护,到整体防护,逐步推进。
漏洞加固
PHP官方已经针对PHP 5.4 及PHP 5.5版本给出了补丁,请使用这些版本的用户,尽快到官方网站下载并安装补丁,补丁的下载地址如下:
http://php.net/ChangeLog-5.php#5.4.41
http://php.net/ChangeLog-5.php#5.5.25

如果您使用了PHP的其它版本,请随时关注PHP官方的最新通告。
业务安全加固
PHP多个版本爆出远程DOS漏洞的更多相关文章
- [转帖]预警 | Linux 爆“SACK Panic”远程DoS漏洞,大量主机受影响
预警 | Linux 爆“SACK Panic”远程DoS漏洞,大量主机受影响 https://cloud.tencent.com/developer/article/1447879 所有的 版本 ...
- PHP远程DoS漏洞深入分析及防护方案
PHP远程DoS漏洞 4月3日,有人在PHP官网提交PHP 远程DoS漏洞(PHP Multipart/form-data remote dos Vulnerability),代号69364.由于该漏 ...
- PHP multipart/form-data 远程DOS漏洞
import sys import urllib,urllib2 import datetime from optparse import OptionParser def http_proxy(pr ...
- 记录php漏洞--宇宙最强语言 PHP 爆出 DoS 漏洞,可以直接灌满 CPU
站长之家(Chinaz.com)5月20日消息 近日,PHP被爆出存在远程DOS漏洞,若黑客利用该漏洞构造PoC发起连接,容易导致目标主机CPU被迅速消耗.此漏洞涉及众多PHP版本,因而影响范围极大 ...
- 关于Linux TCP "SACK PANIC" 远程拒绝服务漏洞的修复
Linux 内核被曝存在TCP "SACK PANIC" 远程拒绝服务漏洞(漏洞编号:CVE-2019-11477,CVE-2019-11478,CVE-2019-11479),攻 ...
- PHP DOS漏洞的新利用:CVE-2015-4024 Reviewed
1. 背景介绍 今天我们想从2015.04.03的一个PHP远程dos漏洞(CVE-2015-4024)说起.技术细节见如下链接,https://bugs.php.net/bug.php?id ...
- Apache HTTP Server mod_session_dbd 远程安全漏洞(CVE-2013-2249)
漏洞版本: Apache 2.4.2 漏洞描述: BUGTRAQ ID: 61379 CVE(CAN) ID: CVE-2013-2249 Apache HTTP Server是开源HTTP服务器. ...
- Apache CXF多个远程拒绝服务漏洞(CVE-2013-2160)
漏洞版本: Apache Group CXF <= 2.5.10 Apache Group CXF 2.7.4 Apache Group CXF 2.6.7 漏洞描述: BUGTRAQ ID: ...
- WordPress ‘crypt_private()’方法远程拒绝服务漏洞
漏洞名称: WordPress ‘crypt_private()’方法远程拒绝服务漏洞 CNNVD编号: CNNVD-201306-250 发布时间: 2013-06-20 更新时间: 2013-06 ...
随机推荐
- div遮罩实现禁用鼠标(click、hover等)事件
这两天在帮老师做网页,今天想实现在一块区域内禁止鼠标的各种事件,本来是想在框架模板的js文件里去修改,但是改代码的时候有点凌乱...感觉应该自己把问题想复杂了. 所以想了想要是能实现在一个区域内(如: ...
- fileIO和OS操作文件和目录
1.FileIO操作文件 # 文件IO,读取文件和创建文件 # 1.读取键盘输入 x=input("please input number") print("您输入的是& ...
- ASLR pe 分析
ASLR 转:http://www.cnblogs.com/dliv3/p/6411814.html 3ks @author:dlive 微软从windows vista/windows server ...
- python魔法函数__dict__和__getattr__的妙用
python魔法函数__dict__和__getattr__的妙用 __dict__ __dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值. 既然__dict__是个字典那么我们就 ...
- linux动态库编译和使用详细剖析 - 后续
引言 - 也许是修行 很久以前写过关于动态库科普文章, 废话反正是说了好多. 核心就是在 linux 上面玩了一下 dlopen : ) linux动态库编译和使用详细剖析 - https://www ...
- LNMP结合discuz的配置
一.安装discuz 配置参照LAMP结合discuz的第一部分 不要忘记了 添加hosts~!!!! ===============我是分割线.========================== ...
- Homestead在windows7 下的搭建
遇到的问题有 1.Homestead 的版本问题,教程git版本是 v5,最新是v7的,如果用最新,就要求vagrant的版本是 2.0的: 2.启动homestead后,出现 No input fi ...
- PHP的instanceof关键字
PHP5的另一个新成员是instdnceof关键字.使用这个关键字可以确定一个对象是类的实例.类的子类,还是实现了某个特定接口,并进行相应的操作.在某些情况下,我们希望确定某个类是否特定的类型,或者是 ...
- AtCoder Non-decreasing(数学思维)
题目链接:https://abc081.contest.atcoder.jp/tasks/arc086_b 题目大意:有n个数,最多可以执行2*n次操作,每次可以选择将ai加到aj上,最终使得该序列满 ...
- ***PHP5.6.x SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 解决方案
centos: 在php.ini中增加一行 1 openssl.cafile=/etc/pki/tls/certs/ca-bundle.crt 重启服务器使修改生效