加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

你不知道的文件上传漏洞php代码分析

发布时间:2020-12-12 21:45:03 所属栏目:PHP教程 来源:网络整理
导读:漏洞描述 开发中文件上传功能很常见,作为开发者,在完成功能的基础上我们一般也要做好安全防护。文件处理一般包含两项功能,用户上传和展示文件,如上传头像。 文件上传攻击示例 upload.php upload.html 上述代码未经过任何验证,恶意用户可以上传php文件,

漏洞描述

开发中文件上传功能很常见,作为开发者,在完成功能的基础上我们一般也要做好安全防护。 文件处理一般包含两项功能,用户上传和展示文件,如上传头像。

文件上传攻击示例

upload.php

upload.html

上述代码未经过任何验证,恶意用户可以上传php文件,代码如下

恶意用户可以通过访问 如http://server/uploads/shell.php?command=phpinfo(); 来执行远程命令

Content-type验证

upload.php

该方式是通过Http请求头信息进行验证,可通过修改Content-type ==> image/jpg绕过验证,可以通过脚本或BurpSuite、fiddle修改 如下 Content-Disposition: form-data; name="userfile"; filename="shell.php" Content-Type: image/gif

图片类型验证

该方法通过读取文件头中文件类型信息,获取文件类型

备注:如JPEG/JPG文件头标识为FFD8

upload.php

可以通过图片添加注释来绕过此验证。 如添加注释,保存图片后将其扩展名改为php,则可成功上传。 上传成功后访问该文件则可看到如下显示

文件扩展名验证

通过黑名单或白名单对文件扩展名进行过滤,如下代码

upload.php

当黑名单不全,构造特殊文件名可以绕过扩展名验证

直接访问上传的文件

将上传文件保存在非web root下其他文件夹下,可以防止用户通过路径直接访问到文件。 upload.php

用户不可以直接通过http://localhost/uploads/ 来访问文件,必须通过view.php来访问 view.php

查看文件代码未验证文件名,用户可以通过例如http://localhost/view.php?name=..//php/upload.php,查看指定的文件

解决漏洞示例

upload.php

query("INSERT INTO uploads SET name=?,original_name=?,mime_type=?",      array(basename($uploadfile,basename($_FILES['userfile']['name']),$_FILES['userfile']['type']));   if(PEAR::isError($res)) {     unlink($uploadfile);     die "Error saving data to the database. The file was not uploaded";   }   $id = $db->getOne('SELECT LAST_INSERT_ID() FROM uploads');   echo "File is valid,and was successfully uploaded. You can view it n"; } else {   echo "File uploading failed.n"; } ?>

view.php

getRow('SELECT name,mime_type FROM uploads WHERE id=?',array($id),DB_FETCHMODE_ASSOC); if(PEAR::isError($file)) {   die("Error fetching data from the database"); } if(is_null($file) || count($file)==0) {   die("File not found"); } header("Content-Type: " . $file['mime_type']); readfile($uploaddir.$file['name']); ?>

上述代码文件名随机更改,文件被存储在web root之外,用户通过id在数据库中查询文件名,读取文件,可以有效的阻止上述漏洞发生

总结

通过以上示例分析,可总结一下几点

1.文件名修改,不使用用户上传的文件名

2.用户不可以通过上传路径直接访问文件

3.文件查看采用数据库获取文件名,从而在相应文件服务器读取文件

4.文件上传限制文件大小,个人上传数量等

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读