文章目录

  • 文件上传漏洞:
  • webshell:
  • 文件上传漏洞的原因:
  • 文件上传常见检测:
  • 靶场实战
    • 1.前端验证绕过
    • 2.Content-Type方式绕过
    • 3.黑名单绕过
    • 4. .htaccess文件绕过
    • 5.后缀大小写绕过
    • 6.文件后缀(空)绕过
    • 7.文件后缀(点)绕过
    • 8.::$DATA(Windows文件流绕过)
    • 9.构造文件后缀绕过
    • 10双写文件后缀绕过

文件上传漏洞:

文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,对于攻击者来说很容易实施。

文件上传漏洞本身就是一个危害巨大的漏洞,WebShell更是将这种漏洞的利用无限扩大。大多数的上传漏洞被利用后攻击者都会留下WebShell以方便后续进入系统。攻击者在受影响系统放置或者插入WebShell后,可通过该WebShell更轻松,更隐蔽的在服务中为所欲为。

这里需要特别说明的是上传漏洞的利用经常会使用WebShell,而WebShell的植入远不止文件上传这一种方式。

webshell:

WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门。攻击者在入侵了一个网站后,通常会将这些asp或php后门文件与网站服务器web目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)。

文件上传漏洞的原因:

  • 文件上传时检查不严。没有进行文件格式检查。
  • 文件上传后修改文件名时处理不当。一些应用在服务器端进行了完整的黑名单和白名单过滤,在修改已上传文件文件名时却百密一疏,允许用户修改文件后缀。如应用只能上传.doc文件时攻击者可以先将.php文件后缀修改为.doc,成功上传后在修改文件名时将后缀改回.php。

文件上传常见检测:

1.客户端检测
一般都是在网页上写一段js脚本,通过js去检测上传文件的后缀名,有白名单形式也有黑名单形式。

判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。前端验证非常不可靠,通过修改数据包后缀名就可以绕过,甚至关闭js都可以尝试绕过。

2.服务端检测
检查content-type(内容类型)
检查后缀(多为检查后缀)
检查文件头

靶场实战

我们通过upload-labs这个靶场实践来进一步认识文件上传漏洞:

1.前端验证绕过

发现有一个上传点:

我们试着上传一个带一句话的php上去,并开启burp抓包:


发现被拦截下来,提示只能上传图片类型,而在burp上并无抓取到任何数据,这证明就是一个典型的客户端前端检测

我们通过将php文件改成jpg文件使其符合检测要求,再在抓取数据包时将文件后缀改回php,从而完成绕过:

发现成功上传

通过菜刀连接即可。

2.Content-Type方式绕过

分析源码,知道了是对Content-Type(内容类型)和文件头的检测,

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']            if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = '文件类型不正确,请重新上传!';}} else {$msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';}
}

那我们想到的是就是图片马,图片马是可以很好的绕过内容类型和文件头检测的,在这里我准备好了一个写了一句话的txt文件和一张小图片来合成一张图片马:


生成图片马后,然后我们将图片马上传并抓包将后缀改为php,因为web容器是根据后缀去解析不同的文件的,所以我们将他改成php

最后成功上传,并调用一句话

3.黑名单绕过

查看源码

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array('.asp','.aspx','.php','.jsp');$file_name = trim($_FILES['upload_file']['name']);$file_name = deldot($file_name);//删除文件名末尾的点$file_ext = strrchr($file_name, '.');$file_ext = strtolower($file_ext); //转换为小写$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA$file_ext = trim($file_ext); //收尾去空if(!in_array($file_ext, $deny_ext)) {$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;            if (move_uploaded_file($temp_file,$img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}

发现是一个黑名单绕过,它拦截了.asp,.aspx,.php,.jsp后缀的文件,但他拦截了php,是不是就意味着我们就不能上传php文件了呢?其实不是的,在默认状态下php,php3,php4,php5,phtml是会被解析成php的,请看下图

我们将图片马后缀改成php3,成功将上传,调用一句话,最后成功调用,证明是可以php3是可以被php解析的;

4. .htaccess文件绕过

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");$file_name = trim($_FILES['upload_file']['name']);$file_name = deldot($file_name);//删除文件名末尾的点$file_ext = strrchr($file_name, '.');$file_ext = strtolower($file_ext); //转换为小写$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA$file_ext = trim($file_ext); //收尾去空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 . '文件夹不存在,请手工创建!';}
}

.htaccess是什么?.htaccess文件也被称为分布式配置文件,提供了针对目录改变配置的方法,在一个特定的文档目录中放置一个包含一个或者多个指令的文件,以作用于此目录及其所有子目录。
.htaccess功能:
文件密码保护,用户自定义重定向,自定义404页面,扩展名伪静态化,禁止特定ip地址的用户,但这个功能默认是不开启的。

.htaccess中有一条指令:

AddType application/x-httpd-php .jpg

这个指令代表着.jpg文件会当做php来解析。

只要我们把带有这条指令的.htaccess配置文件上传上去到有黑名单拦截的上传点,那就意味着我们就能将图片马直接上传上去了!

图形化界面是不允许我们将文件命名为空文件名 .htaccess,所以这里通过cmd命令来进行重命名:

重命名后,我们接下来,只需要先将.htaccess配置文件先传上去,在将图片马传上去即可;

5.后缀大小写绕过

$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",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");$file_name = trim($_FILES['upload_file']['name']);$file_name = deldot($file_name);//删除文件名末尾的点$file_ext = strrchr($file_name, '.');$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA$file_ext = trim($file_ext); //首尾去空if (!in_array($file_ext, $deny_ext)) {$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = '此文件类型不允许上传!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}

在这里,虽然使用了很多过滤,过滤了很多文件类型,但却没将文件后缀统一转化为小写,所以我们是能通过后缀大小写来绕过上传的:

我们将做成图片马直接将后缀改成Php,进行上传

6.文件后缀(空)绕过

$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",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");$file_name = $_FILES['upload_file']['name'];$file_name = deldot($file_name);//删除文件名末尾的点$file_ext = strrchr($file_name, '.');$file_ext = strtolower($file_ext); //转换为小写$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATAif (!in_array($file_ext, $deny_ext)) {$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;if (move_uploaded_file($temp_file,$img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = '此文件不允许上传';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}

这里相对于前面关卡的代码是少了一个消除两旁空格的函数trim();所以我们我们可以通过在后缀加个空格尝试绕过,黑名单机制中,是不允许上传什么,但如果我们传上去的文件与所限制的稍有不一样,那是不是就可以直接绕过黑名单了

我们进行将带有一句话的php文件上传并抓包

在后缀加个空格,上传

7.文件后缀(点)绕过

$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",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");$file_name = trim($_FILES['upload_file']['name']);$file_ext = strrchr($file_name, '.');$file_ext = strtolower($file_ext); //转换为小写$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA$file_ext = trim($file_ext); //首尾去空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 . '文件夹不存在,请手工创建!';}
}

这里是少了一个删除末尾的点的函数

我们还是进行将带有一句话的php文件上传并抓包

在后缀加个点,上传,在上传到服务器后,服务器会自动将点去掉,只读取前面有用的后缀;

8.::$DATA(Windows文件流绕过)

$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",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");$file_name = trim($_FILES['upload_file']['name']);$file_name = deldot($file_name);//删除文件名末尾的点$file_ext = strrchr($file_name, '.');$file_ext = strtolower($file_ext); //转换为小写$file_ext = trim($file_ext); //首尾去空if (!in_array($file_ext, $deny_ext)) {$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = '此文件类型不允许上传!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}

::$DATA(Windows文件流绕过)(这里利用到了NTFS交换数据流(ADS),ADS是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都存在许多个数据流。通俗理解,就是其他文件可以“寄宿”在某个文件身上,而在资源管理器中却只能看到宿主文件,找不到寄宿问文件。)

例如在cmd命令下运行:echo abcd>>a.txt:b.txt 很明显生成一个a.txt,但是会是空值,因为系统将值写到寄宿文件上去了;

然后再运行 echo 123>>a.txt:: D A T A , 是 会 在 a . t x t 中 输 出 123 的 , 因 为 : : DATA,是会在a.txt中输出123的,因为 :: DATA,是会在a.txt中输出123的,因为::DATA相当是个空值,不是一个寄宿文件,所以还是会将文件写入到a.txt中去,不修改文件存储过程;

在利用Windows特性,可在后缀加上“ ::$DATA ”绕过。
跟之前一样的思路,抓包改包绕过。

9.构造文件后缀绕过

$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",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");$file_name = trim($_FILES['upload_file']['name']);$file_name = deldot($file_name);//删除文件名末尾的点$file_ext = strrchr($file_name, '.');$file_ext = strtolower($file_ext); //转换为小写$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA$file_ext = trim($file_ext); //首尾去空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 . '文件夹不存在,请手工创建!';}
}

第九关好像用了我们前面关卡的所有过滤,那我们可不可以构造一个文件名后缀111.php. . 过滤参数在发现.时会将.去掉,在将空格去掉,最后只剩下111.php. 这样还是可以绕过黑名单机制的,因为111.php.不等于111.php,所以还是能绕过上传;

10双写文件后缀绕过

$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 = trim($_FILES['upload_file']['name']);$file_name = str_ireplace($deny_ext,"", $file_name);$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 = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}

会将符合条件的文件后缀删除,我们只需要将文件后缀进行双写,令他删除后合并就能成功绕过!


会将符合条件的文件后缀删除,我们只需要将文件后缀进行双写,令他删除后合并就能成功绕过!

文件上传漏洞-解析、验证、伪造1相关推荐

  1. web安全入门(第七章-1)文件上传漏洞--解析、验证、伪造

    一.客户端检测 1,客户端校验:一般是在网页上写一段Js脚本,用Js去检测,校验上传文件的后缀名,有白名单也有黑名单. 2,判断方式:通过抓包来判断,如果还未抓住包,就弹出不准上传,那么就是前端验证, ...

  2. 文件上传漏洞 解析、验证、伪造(二)

    注意:仅用于本人学习的笔记记录,禁止进行传播分享,一旦造成严重后果与本人无关!!! 后端校验的黑名单机制比较危险 1.大小写绕过 2.点空绕过 3.NTFS文件流绕过::$DATA 4.htacces ...

  3. 文件上传漏洞-解析、验证、伪造2

    我们接着上一篇博客文章对upload_labs上传漏洞的讲解: 文章目录 %00截断绕过 %00截断绕过(二) 图片马绕过 getimagesize图片类型绕过 php_exif模块图片类型绕过 二次 ...

  4. 文件上传漏洞 解析、验证、伪造(一)

    注意:仅用于本人学习的笔记记录,禁止进行传播分享,一旦造成严重后果与本人无关!!! 文件上传:把自己电脑上的文件传到服务器上 文件上传是个功能 任意文件上传就是漏洞了 一句话木马<?php  e ...

  5. 文件上传漏洞 解析、验证、伪造(三)

    注意:仅用于本人学习的笔记记录,禁止进行传播分享,一旦造成严重后果与本人无关!!! 1.文件上传是个功能,任意文件上传(漏洞) 2.无法提交shell但是可以提交其他的文件,例如HTML(上传存储型x ...

  6. 文件上传漏洞 — 解析、验证、伪造

    绕过黑名单 前端验证绕过 看看前段白名单允许上传什么后缀名的文件 写个一句话木马,后缀名改成白名单里的后缀名 <?php eval($_REQUEST['a'])?> 上传时抓包修改后缀名 ...

  7. 文件上传漏洞-解析、验证、伪造3

    接上一篇内容 IIS6.0解析漏洞(一) 我们现在要讲的第一个是IIS6.0的解析问题: iis6.0除了将ASP后缀当成ASP进行解析的同时,当文件后缀名字为.asa .cer .cdx也会当做as ...

  8. 文件上传漏洞及常见的利用方式

    文章目录 概述 "文件上传"漏洞与"WebShell" 文件上传漏洞的原理 "文件上传漏洞"被利用植入"WebShell" ...

  9. 00截断上传绕过_【文件上传与解析】文件上传与解析漏洞总结v1.0

    点击上方"公众号" 可以订阅哦! Hello,各位小伙伴晚上好~ 这里是依旧勤劳写公众号的小编~ 今天本公众号将推出一个新的模块,那就是漏洞知识点总结模块!!!(此处应有掌声~) ...

最新文章

  1. Java DatagramSocket(UDP)要注意的问题
  2. 判断sem信号量为零_Linux系统编程——进程同步与互斥:System V 信号量
  3. 高并发之并发容器,了解多少(从入门到超神)
  4. Hadoop大数据——MR程序map任务数的规划机制
  5. 嵌套饼图_你真的了解matplotlib吗?---环形图
  6. matlab2c使用c++实现matlab函数系列教程-conv函数
  7. 计算机专业代码933,数学类专业代码
  8. FGUI GTween 完成事件不回调的问题
  9. EDI 助力 VMI 加固供应链三道防线
  10. 大龄程序员的出路究竟在何处?从369个过来人问答贴里,我们得到了答案
  11. python计算时差
  12. 编程程序 runtime error
  13. Qt表格分页,跳转,首尾页
  14. python核心编程电子书_Python核心编程 PDF 超清第3版
  15. 通过Python做葡萄酒成分与质量的关系分析并可视化--GBDT/随机森林特征选取
  16. C语言主函数返回值含义
  17. 某百亿量化金融公司base北上杭深现招岗位:C++量化系统开发工程师年base40-80万+bonus工作职责1. 参与交易平台的设计、开发与测试,实现交易策略、风控等需求;2. 开发交易
  18. 电子计算机机房设备接地线,电子计算机机房的防雷接地措施
  19. linux下的CPU、内存、IO、网络的压力测试
  20. [转载]ffmpeg的使用

热门文章

  1. Linux文本检索命令grep
  2. Faiss PQ乘积量化的学习总结
  3. 【vim】【statusline】【状态栏】设置,显示更多有用的信息
  4. 办公室合租的话需要注意什么问题?合租办公室有什么优缺点吗?
  5. instagram架构分析_转
  6. 关于DNS迭代递归及区域复制
  7. validform简单用法
  8. Linux进程学习【进程状态】
  9. 在SEO中如何计算网页的价值呢?
  10. 大数据晨报:用人工智能伪造奥巴马演讲 阿里巴巴市值超过4000亿