文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,对于攻击者来说很容易实施。
文件上传漏洞本身就是一个危害巨大的漏洞,WebShell更是将这种漏洞的利用无限扩大。大多数的上传漏洞被利用后攻击者都会留下WebShell以方便后续进入系统。攻击者在受影响系统放置或者插入WebShell后,可通过该WebShell更轻松,更隐蔽的在服务中为所欲为。
这里需要特别说明的是上传漏洞的利用经常会使用WebShell,而WebShell的植入远不止文件上传这一种方式。
WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门。攻击者在入侵了一个网站后,通常会将这些asp或php后门文件与网站服务器web目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)。
1.客户端检测
一般都是在网页上写一段js脚本,通过js去检测上传文件的后缀名,有白名单形式也有黑名单形式。
判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。前端验证非常不可靠,通过修改数据包后缀名就可以绕过,甚至关闭js都可以尝试绕过。
2.服务端检测
检查content-type(内容类型)
检查后缀(多为检查后缀)
检查文件头
我们通过upload-labs这个靶场实践来进一步认识文件上传漏洞:
我们试着上传一个带一句话的php上去,并开启burp抓包:
发现被拦截下来,提示只能上传图片类型,而在burp上并无抓取到任何数据,这证明就是一个典型的客户端前端检测
我们通过将php文件改成jpg文件使其符合检测要求,再在抓取数据包时将文件后缀改回php,从而完成绕过:
分析源码,知道了是对Content-Type(内容类型)和文件头的检测,
那我们想到的是就是图片马,图片马是可以很好的绕过内容类型和文件头检测的,在这里我准备好了一个写了一句话的txt文件和一张小图片来合成一张图片马:
生成图片马后,然后我们将图片马上传并抓包将后缀改为php,因为web容器是根据后缀去解析不同的文件的,所以我们将他改成php
最后成功上传,并调用一句话
查看源码
发现是一个黑名单绕过,它拦截了.asp,.aspx,.php,.jsp后缀的文件,但他拦截了php,是不是就意味着我们就不能上传php文件了呢?其实不是的,在默认状态下php,php3,php4,php5,phtml是会被解析成php的,请看下图
我们将图片马后缀改成php3,成功将上传,调用一句话,最后成功调用,证明是可以php3是可以被php解析的;
.htaccess是什么?.htaccess文件也被称为分布式配置文件,提供了针对目录改变配置的方法,在一个特定的文档目录中放置一个包含一个或者多个指令的文件,以作用于此目录及其所有子目录。
.htaccess功能:
文件密码保护,用户自定义重定向,自定义404页面,扩展名伪静态化,禁止特定ip地址的用户,但这个功能默认是不开启的。
.htaccess中有一条指令:
AddType application/x-httpd-php .jpg
这个指令代表着.jpg文件会当做php来解析。
只要我们把带有这条指令的.htaccess配置文件上传上去到有黑名单拦截的上传点,那就意味着我们就能将图片马直接上传上去了!
图形化界面是不允许我们将文件命名为空文件名 .htaccess,所以这里通过cmd命令来进行重命名:
重命名后,我们接下来,只需要先将.htaccess配置文件先传上去,在将图片马传上去即可;
在这里,虽然使用了很多过滤,过滤了很多文件类型,但却没将文件后缀统一转化为小写,所以我们是能通过后缀大小写来绕过上传的:
这里相对于前面关卡的代码是少了一个消除两旁空格的函数trim();所以我们我们可以通过在后缀加个空格尝试绕过,黑名单机制中,是不允许上传什么,但如果我们传上去的文件与所限制的稍有不一样,那是不是就可以直接绕过黑名单了
我们还是进行将带有一句话的php文件上传并抓包
在后缀加个点,上传,在上传到服务器后,服务器会自动将点去掉,只读取前面有用的后缀;
::$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 ”绕过。
跟之前一样的思路,抓包改包绕过。
第九关好像用了我们前面关卡的所有过滤,那我们可不可以构造一个文件名后缀111.php. . 过滤参数在发现.时会将.去掉,在将空格去掉,最后只剩下111.php. 这样还是可以绕过黑名单机制的,因为111.php.不等于111.php,所以还是能绕过上传;
会将符合条件的文件后缀删除,我们只需要将文件后缀进行双写,令他删除后合并就能成功绕过!
会将符合条件的文件后缀删除,我们只需要将文件后缀进行双写,令他删除后合并就能成功绕过!