2026年10月29日 · 今日 0 帖 · 会员 6.1万 · 主题 17.4万
登录 · 注册 · 游客,欢迎随便逛逛
返回版块
JK-0042313
Lv9有为九子能等级图标
勋章勋章勋章
帖子
105
回复
4,906
积分
2万
注册
2011-05-19
[怀旧国机]

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

[复制链接]
查看 3,692 回复 2
楼主 发表于 | 只看该作者
15 人收藏

:负载均衡设备作为关键应用的入口,自然也成为各种攻击的目标所在。如何确保负载均衡设备在自身不会瘫痪的前提下保护后端服务器,是负载均衡器必须解决的问题。事实上,负载均衡设备从诞生之日起,其高并发会话和新建连接速率让防火墙产品相形见绌。另外,绝*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).‘“/&gt;‘;

//使用上传的图片生成新的图片

$$$$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.‘“/&gt;‘;

}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/>“;

}

?>

进行上传操作,我们会发现写马后的图片也能正常生成预览,

登录回复
JK-0002641
Lv8能识八方语等级图标等级图标等级图标等级图标等级图标
勋章勋章勋章勋章勋章勋章勋章
帖子
45
回复
1,256
积分
7.5万
注册
2010-11-30
1 楼

看不懂

JK-0095122
Lv7可吟七步诗等级图标等级图标等级图标
勋章勋章勋章勋章勋章勋章勋章勋章+3
帖子
0
回复
2万
积分
1.4万
注册
2012-02-12
2 楼

9

登录后可以回复这个帖子。旧账号可使用原密码登录。

登录 注册新号
← 返回版块