无聊到看了会《PHP安全之道》,记录一次学习笔记。文件上传安全在Web系统中,文件上传的基本功能是必不可少的,如论坛用户上传附件、视频网站上传视频、修改头像等。文件上传漏洞的危害如果Web系统没有对上传的文件格式进行合理的校验,被恶意攻击者利用上传一些webshell后,可能完全控制网站程序并执行系统命令,获取数据库链接字串进行操作数据库等危险操作。文件上传漏洞的演示简单的文件上传页面html代码
文件接收上传PHP代码
当前系统未对上传的文件格式进行校验,如果攻击者上传了一个hacker.php的脚本文件Hacker.php文件代码:
文件上传成功
攻击者:我可以通过该文件进行URL请求
执行该文件,就可以找到php.in文件目录
重启php后生效,再次执行
这里脚本执行后的结果,其中列出了该目录下的所有文件。检查文件类型防止上传漏洞下面在PHP代码中通过限制文件类型来防止上传漏洞
上传hacker.php,php文件上传失败
以下是拒绝上传的HTTP请求返回数据包
这里通过文件类型检查机制防止了非授权类型文件的上传;但是如果只是进行上传文件类型的检查也是不够的
可以通过修改POST请求数据包中content-type字段,修改为
重发
文件上传成功..
攻击者跳过了文件类型检查检查文件扩展名防止上传漏洞可以通过白名单或黑名单验证上传的文件拓展名是否符合,达到对文件类型的上传限制。黑名单
白名单
白名单要比黑名单安全的多,并不是说采用白名单方式就足够安全了。相关了解在IIS服务中存在一个漏洞,上传hacker.php;gif的文件到服务器,PHP脚本文件因限制最后四个字符,所以本文件是合法的,但是当上传后浏览该文件/uploads/hacker.php;gif时,就可绕过Web程序的逻辑检查,从而导致服务器以IIS进程权限执行任意恶意用户定义的脚本。此漏洞只针对IIS特定版本。在Apache程序中,同样存在一个由扩展名解析的漏洞。当攻击者上传一个由多个扩展名的PHP脚本文件时,由于最后的扩展名未定义,就会解析前一个扩展如:hacker.php.2020文件当该文件上传时,如果是黑白名单方式进行验证,就可以绕过验证,非法上传到服务器,当去访问该文件时,会被当成PHP脚本执行。文件上传漏洞的综合防护关于文件漏洞的防护,需要同时综合应用检查文件类型、扩展名、黑白名单、使用随机文件名称等方法。综合应用示例:
目前限制png文件类型的上传,上传png文件到服务器
Png文件被重新命名文件上传综合防护总结:①验证上传文件的扩展名,以白名单、黑名单为主,但最好使用白名单。②除了在代码逻辑中防止上传漏洞外,同时也可以将上传目录放到项目工程目录之外,当做静态文件资源处理,并且对文件的权限进行设定,禁止文件的执行权限。③当用户把文件上传到服务器时,要先使文件随机重命名再进行存储,保证扩展名合法唯一,防止对上传文件非法扩展进行解析。综合应用代码:

文件上传系统 请选择需要上传的文件:
文件接收上传PHP代码
<?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文件夹下
当前系统未对上传的文件格式进行校验,如果攻击者上传了一个hacker.php的脚本文件Hacker.php文件代码:
文件上传成功
攻击者:我可以通过该文件进行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文件,代码如下
执行该文件,就可以找到php.in文件目录
重启php后生效,再次执行
这里脚本执行后的结果,其中列出了该目录下的所有文件。检查文件类型防止上传漏洞下面在PHP代码中通过限制文件类型来防止上传漏洞
上传hacker.php,php文件上传失败
以下是拒绝上传的HTTP请求返回数据包
这里通过文件类型检查机制防止了非授权类型文件的上传;但是如果只是进行上传文件类型的检查也是不够的
可以通过修改POST请求数据包中content-type字段,修改为Content-type:image/gif
重发
文件上传成功..
攻击者跳过了文件类型检查检查文件扩展名防止上传漏洞可以通过白名单或黑名单验证上传的文件拓展名是否符合,达到对文件类型的上传限制。黑名单
白名单
白名单要比黑名单安全的多,并不是说采用白名单方式就足够安全了。相关了解在IIS服务中存在一个漏洞,上传hacker.php;gif的文件到服务器,PHP脚本文件因限制最后四个字符,所以本文件是合法的,但是当上传后浏览该文件/uploads/hacker.php;gif时,就可绕过Web程序的逻辑检查,从而导致服务器以IIS进程权限执行任意恶意用户定义的脚本。此漏洞只针对IIS特定版本。在Apache程序中,同样存在一个由扩展名解析的漏洞。当攻击者上传一个由多个扩展名的PHP脚本文件时,由于最后的扩展名未定义,就会解析前一个扩展如:hacker.php.2020文件当该文件上传时,如果是黑白名单方式进行验证,就可以绕过验证,非法上传到服务器,当去访问该文件时,会被当成PHP脚本执行。文件上传漏洞的综合防护关于文件漏洞的防护,需要同时综合应用检查文件类型、扩展名、黑白名单、使用随机文件名称等方法。综合应用示例:
目前限制png文件类型的上传,上传png文件到服务器
Png文件被重新命名文件上传综合防护总结:①验证上传文件的扩展名,以白名单、黑名单为主,但最好使用白名单。②除了在代码逻辑中防止上传漏洞外,同时也可以将上传目录放到项目工程目录之外,当做静态文件资源处理,并且对文件的权限进行设定,禁止文件的执行权限。③当用户把文件上传到服务器时,要先使文件随机重命名再进行存储,保证扩展名合法唯一,防止对上传文件非法扩展进行解析。综合应用代码:<?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 -
本文介绍了文件上传漏洞的危害及防御措施,包括检查文件类型、扩展名等,并提供了PHP代码实例。
1万+

被折叠的 条评论
为什么被折叠?



