php限制image_PHP安全之文件上传漏洞及综合防护

本文介绍了文件上传漏洞的危害及防御措施,包括检查文件类型、扩展名等,并提供了PHP代码实例。
无聊到看了会《PHP安全之道》,记录一次学习笔记。文件上传安全在Web系统中,文件上传的基本功能是必不可少的,如论坛用户上传附件、视频网站上传视频、修改头像等。文件上传漏洞的危害如果Web系统没有对上传的文件格式进行合理的校验,被恶意攻击者利用上传一些webshell后,可能完全控制网站程序并执行系统命令,获取数据库链接字串进行操作数据库等危险操作。文件上传漏洞的演示简单的文件上传页面html代码79cddcfb92ac9dc8eafb8d9392b5f618.png
文件上传系统  请选择需要上传的文件:
f92e0a367708edce2c1aa0addfffb7d3.png文件接收上传PHP代码1e52006a17e85fde1716919a026b9b18.png
<?php $upload_dir = 'uploads/';//这里是用户上传文件,文件保存的目录$upload_file = $upload_dir . basename($_FILES['userfile']['name']);//文件目录+文件名/*move_uploaded_file():将上传的文件移动到新位置。两个参数1.上传的文件的文件名2.移动文件到这个位置若成功,则返回 true,否则返回 false */if (move_uploaded_file($_FILES['userfile']['tmp_name'], $upload_file)){echo "文件上传成功";} else {echo "文件上传失败";}?>
这样就是一个简单的文件上传系统,由用户上传文件,如果文件上传成功则文件会保存在http://服务器路径/uploads文件夹下cef54526b35298464306880e0577c082.png当前系统未对上传的文件格式进行校验,如果攻击者上传了一个hacker.php的脚本文件Hacker.php文件代码:423fcfba494b69d9116f8dc8f3eef8b1.pngc9ff2acf3ef762c36702d620b154f547.png文件上传成功4e5b0351c1e13698c5ed14f51580439e.pngd6d33c666edca8e00bfa791590edc422.png攻击者:我可以通过该文件进行URL请求
http://服务器路径/uploads/hacker.php?shell=ls%20-al
可以执行任何shell命令本地搭建环境执行后的常见问题:
https://zhidao.baidu.com/special/view?id=60765a24626975510400
我这里的服务器,上传hacker.php脚本文件后执行提示Warning: system() has been disabled for security reasons该错误是由于服务器安全配置将system 函数关闭了,打开php.ini 文件,将disable_functions等号后面的system 去掉即可。php.ini文件在哪?在服务器目录下新建一个php文件,代码如下b6c7f563fd35b6b3405d0e10959379d9.png执行该文件,就可以找到php.in文件目录f327daf3cfd750d918f99de191880db4.png重启php后生效,再次执行f5823a0e65bc9b6136e14297a05c5d0a.png这里脚本执行后的结果,其中列出了该目录下的所有文件。检查文件类型防止上传漏洞下面在PHP代码中通过限制文件类型来防止上传漏洞5e3d13ddc1a308dde426939076b7a5ad.png上传hacker.php,php文件上传失败4db70bb224bf9d1d73bcecfa25b7bc9f.png以下是拒绝上传的HTTP请求返回数据包c5dc12341ea52794843406959895522e.png825482ffdcb3ae574c534172b7b1c59d.png这里通过文件类型检查机制防止了非授权类型文件的上传;但是如果只是进行上传文件类型的检查也是不够的988270aad41c0345b665cfffea0d9901.png可以通过修改POST请求数据包中content-type字段,修改为
Content-type:image/gif
c3975b39c8ba4ed23f8bc69f84f6be25.png重发9185f9f56b68cb1b3e064cd40a1f5e91.png文件上传成功..1f4052448537b6b4c0b40146747e0320.png攻击者跳过了文件类型检查检查文件扩展名防止上传漏洞可以通过白名单或黑名单验证上传的文件拓展名是否符合,达到对文件类型的上传限制。黑名单3d5112bcaf6f0bf1af6a3e98163887b7.png白名单5082b01624bf6c237cd4a89d7788d08e.png白名单要比黑名单安全的多,并不是说采用白名单方式就足够安全了。相关了解在IIS服务中存在一个漏洞,上传hacker.php;gif的文件到服务器,PHP脚本文件因限制最后四个字符,所以本文件是合法的,但是当上传后浏览该文件/uploads/hacker.php;gif时,就可绕过Web程序的逻辑检查,从而导致服务器以IIS进程权限执行任意恶意用户定义的脚本。此漏洞只针对IIS特定版本。在Apache程序中,同样存在一个由扩展名解析的漏洞。当攻击者上传一个由多个扩展名的PHP脚本文件时,由于最后的扩展名未定义,就会解析前一个扩展如:hacker.php.2020文件当该文件上传时,如果是黑白名单方式进行验证,就可以绕过验证,非法上传到服务器,当去访问该文件时,会被当成PHP脚本执行。文件上传漏洞的综合防护关于文件漏洞的防护,需要同时综合应用检查文件类型、扩展名、黑白名单、使用随机文件名称等方法。综合应用示例:9b649743ea2c919603fc2fad56b09ed7.png目前限制png文件类型的上传,上传png文件到服务器08f20171442015774c49440e3d5dd0c3.pngPng文件被重新命名文件上传综合防护总结:①验证上传文件的扩展名,以白名单、黑名单为主,但最好使用白名单。②除了在代码逻辑中防止上传漏洞外,同时也可以将上传目录放到项目工程目录之外,当做静态文件资源处理,并且对文件的权限进行设定,禁止文件的执行权限。③当用户把文件上传到服务器时,要先使文件随机重命名再进行存储,保证扩展名合法唯一,防止对上传文件非法扩展进行解析。综合应用代码:
<?php header('Content-Type: text/html; charset=utf-8');function genRandomString($len){$chars = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k","l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v","w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G","H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R","S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2","3", "4", "5", "6", "7", "8", "9");$charsLen = count($chars)-1;shuffle($chars);//将数组打乱$output = "";for($i = 0; $i < $len; $i++){     $output .= $chars[mt_rand(0,$charsLen)];}return $output;}$whitelist = array(".jpg",".gif",".png");//白名单$item = substr($_FILES['userfile']['name'], -4);if(!in_array($item, $whitelist)){die("请上传正确的文件类型,文件后缀名不在白名单");}if($_FILES['userfile']['type'] != "image/png"){die("请上传正确的文件类型,文件类型不正确");}$upload_dir = 'tmp/uploads/';//将用户上传的文件放到目录项$upload_file = $upload_dir.genRandomString(20).$item;//使用随机文件名if (move_uploaded_file($_FILES['userfile']['tmp_name'], $upload_file)){echo "文件上传成功";} else {echo "文件上传失败";}?>
个人总结web漏洞种类繁多,利用方法奇葩而有趣,值得研究和学习。- End -

1f4afa609213581fe0f6e360c590da40.gif

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值