您的位置:首页 > 其它

渗透之路基础 -- 文件上传

2020-02-03 05:03 2121 查看

具体还是要根据实战情况来判断分析,本文仅供思路学习和参考

漏洞危害

可以直接上传Shell,导致服务器getshell

漏洞形成

Web应用程序没有对上传文件的格式进行严格过滤 , 还有一部分是攻击者通过 Web服务器的解析漏洞来突破Web应用程序的防护;通常都会出现在,上传功能上

文件上传格式及解析

​ 没有解析漏洞的情况下,格式代码必须要和文件格式一直,否则无法正常解析运行,如果存在解析漏洞的情况下,格式代码可以和不同格式相互解析

​ 之后也会发出关于解析漏洞的文章!

漏洞防御

可以针对文件名文件大小文件内容文件类型等进行防御

  1. 检查文件上传路径 ( 避免 0x00 截断、 IIS6.0 文件夹解析漏洞、目录遍历 )

  2. 文件扩展名检测 ( 避免服务器以非图片的文件格式解析文件 )

  3. 文件 MIME验证 ( 比如 GIF 图片 MIME为 image/gif,CSS 文件的 MIME为 text/css 等 ) 3. 文件内容检测 ( 避免图片中插入 webshell)

  4. 图片二次渲染 ( 最变态的上传漏洞防御方式 , 基本上完全避免了文件上传漏洞 )

  5. 文件重命名 ( 如随机字符串或时间戳等方式 , 防止攻击者得到 webshell 的路径 )

注意:若攻击者上传了shell之后,肯定会通过某刀剑进行连接,所以尽量不要暴露文件路径,并且设置访问权限,以进一步防御

文件上传验证及突破

文件过滤,验证后缀:

  1. 文件头验证

  2. 文件类型验证

  3. 文件后缀验证

    绕过:

    修改文件头,伪造文件属性
  4. 修改文件类型,伪造文件类型 MIME绕过
  5. 增加多重后缀,伪造文件后缀 命名绕过

js 本地验证突破

  1. 复制js代码,创建本地文件删除相应验证代码后直接上传(无防盗链可用)

  2. %00 截断 shell.php%00.jpg => shell.php

    测试代码 upload.php

    <?php
    //文件上传漏洞演示脚本之js验证
    $uploaddir = 'uploads/';
    if (isset($_POST['submit'])) {
    if (file_exists($uploaddir)) {
    if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploaddir . '/' . $_FILES['upfile']['name'])) {
    echo '文件上传成功,保存于:' . $uploaddir . $_FILES['upfile']['name'] . "\n";
    }
    } else {
    exit($uploaddir . '文件夹不存在,请手工创建!');
    }
    //print_r($_FILES);
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html;charset=gbk"/>
    <meta http-equiv="content-language" content="zh-CN"/>
    <title>文件上传漏洞演示脚本--JS验证实例</title>
    <script type="text/javascript">
    function checkFile() {
    var file = document.getElementsByName('upfile')[0].value;
    if (file == null || file == "") {
    alert("你还没有选择任何文件,不能上传!");
    return false;
    }
    //定义允许上传的文件类型
    var allow_ext = ".jpg|.jpeg|.png|.gif|.bmp|";
    //提取上传文件的类型
    var ext_name = file.substring(file.lastIndexOf("."));
    //alert(ext_name);
    //alert(ext_name + "|");
    //判断上传文件类型是否允许上传
    if (allow_ext.indexOf(ext_name + "|") == -1) {
    var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
    alert(errMsg);
    return false;
    }
    }
    </script>
    <body>
    <h3>文件上传漏洞演示脚本--JS验证实例</h3>
    
    <form action="" method="post" enctype="multipart/form-data" name="upload" onsubmit="return checkFile()">
    <input type="hidden" name="MAX_FILE_SIZE" value="204800"/>
    请选择要上传的文件:<input type="file" name="upfile"/>
    <input type="submit" name="submit" value="上传"/>
    </form>
    </body>
    </html>
    [/code]

上传成功之后仍然是图片格式

*这时候需要抓包修改*

- 注意:直接通过burp抓包修改,可能上传的文件还是shell.php%00.jpg
- 需要通过修改%00的URL编码格式:
- 选中%00 右键选中 URL
- 点击 URL-decode
- %00 乱码则可以上传

文件上传MIME验证突破

​ 测试页面 mime.php

<?php
//文件上传漏洞演示脚本之MIME验证
$uploaddir = 'uploads/';
if (isset($_POST['submit'])) {
if (file_exists($uploaddir)) {
if (($_FILES['upfile']['type'] == 'image/gif') || ($_FILES['upfile']['type'] == 'image/jpeg') ||
($_FILES['upfile']['type'] == 'image/png') || ($_FILES['upfile']['type'] == 'image/bmp')
) {
if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploaddir . '/' . $_FILES['upfile']['name'])) {
echo '文件上传成功,保存于:' . $uploaddir . $_FILES['upfile']['name'] . "\n";
}
} else {
echo '文件类型不正确,请重新上传!' . "\n";
}
} else {
exit($uploaddir . '文件夹不存在,请手工创建!');
}
//print_r($_FILES);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gbk"/>
<meta http-equiv="content-language" content="zh-CN"/>
<title>文件上传漏洞演示脚本--MIME验证实例</title>
<body>
<h3>文件上传漏洞演示脚本--MIME验证实例</h3>

<form action="" method="post" enctype="multipart/form-data" name="upload">
请选择要上传的文件:<input type="file" name="upfile"/>
<input type="submit" name="submit" value="上传"/>
</form>
</body>
</html>
[/code]

抓包修改 Content-Type

序号 内容类型 文件扩展名 描述
1 application/msword doc Microsoft Word
2 application/octet-stream bin dms lha lzh exe class 可执行程序
3 application/pdf pdf Adobe Acrobat
4 application/postscript ai eps ps PostScript
5 appication/powerpoint ppt Microsoft Powerpoint
6 appication/rtf rtf rtf 格式
7 appication/x-compress z unix 压缩文件
8 application/x-gzip gz gzip
9 application/x-gtar gtar tar 文档 (gnu 格式 )
10 application/x-shockwave-flash swf MacroMedia Flash
11 application/x-tar tar tar(4.3BSD)
12 application/zip zip winzip
13 audio/basic au snd sun/next 声音文件
14 audio/mpeg mpeg mp2 Mpeg 声音文件
15 audio/x-aiff mid midi rmf Midi 格式
16 audio/x-pn-realaudio ram ra Real Audio 声音
17 audio/x-pn-realaudio-plugin rpm Real Audio 插件
18 audio/x-wav wav Microsoft Windows 声音
19 image/cgm cgm 计算机图形元文件
20 image/gif gif COMPUSERVE GIF 图像
21 image/jpeg jpeg jpg jpe JPEG 图像
22 image/png png PNG 图像

http://www.w3school.com.cn/media/media_mimeref.asp

关于编辑器上传漏洞利用

​ 网站程序编辑器插件,eweb,fck,ce,cfinder,ck等

​ 利用图片路径判断编辑器类型

.htaccess 文件上传漏洞

​ 只适用于Apache 通过配置文件来解析执行相应脚本

<FilesMatch "code">
SetHandler application/x-httpd-php
</FilesMatch>

直接访问是访问不到的

通过修改.htaccess文件可直接访问

可以将任意文件解析为PHP

  1. 如果存在上次.htaccess文件,可以直接利用规则解析
  2. 如果存在修改文件的权限,修改解析规则
  3. 拓展利用:权限维持

转载于:https://www.cnblogs.com/r0ckysec/p/11527474.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
b627074592 发布了0 篇原创文章 · 获赞 0 · 访问量 181 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: