文件上传漏洞获取webshell
文件上传
原理
文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。在应用程序执行了这些恶意脚本文件之后,攻击者便获得了webshell,从而达到控制网站服务器的目的。
危害
- 服务器被控制:如果攻击者成功上传并执行恶意脚本文件,就可以获取服务器的控制权,进行各种恶意操作,如窃取敏感信息、篡改数据、安装后门等。
- 数据泄露:可能导致服务器上的重要数据被窃取或破坏。
- 项目3 传播恶意软件:可以作为攻击其他用户或系统的跳板,传播恶意软件。
文件上传漏洞如何查找及判断?
黑盒: 使用扫描工具扫描打开网站。
黑盒:测试会员中心,测试后台。
白盒:直接撸源代码。
webshell
web是指服务器开放web服务,有一个能够进入服务器的接口,shell的含义是对服务器取得某种程度上的操作权限。webshell常常被称为入侵者通过网站端口对网站服务器的某种程度上操作的权限。由于webshell其大多是以动态脚本的形式出现,也有人称之为网站的后门工具。
常用脚本文件
在文件上传中,有常用的几种脚本文件来获取服务器系统权限。
php
<?php @eval($_POST['eval']) ?>
asp
<%eval request ("pass")%>
jsp
<% if(request.getParameter("cmd")!=null){Runtime.getRuntime().exec(request.getParameter("cmd"));} %>
aspx
<%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%>
对于以上常见的 一句话木马,大家只要会使用就行了,原理不必了解
文件上传常见的类型
前端检测
js检测
首先就是前端的检测,常用的方式是javascript代码进行检测,这种基于js的检测很容易被绕过。
方法一:删除或者禁用js:火狐浏览器–>about:config–>JavaScriptenable-false (ajax)
方法二:利用burpsuite抓包修改文件类型。
文中的小箭头指的是火狐禁用js的插件,这个方便推荐大家下载。
删除js绕过
直接删除代码中onsubmit事件中关于文件上传时验证上传文件的相关代码即可:
文件扩展名检测
通常是针对文件的扩展名后缀进行检测,主要是通过黑白名单进行过滤检测,如果不符全过滤规则则不允许上传。
需要用到的工具:BurpSuite火狐/谷歌浏览器AntSword(蚁剑)
检测方法:黑名单检测:一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。例如: fckeditor 2.4.3 或之前版本的黑名单:
白名单检测白名单检测:一般有个专门的 whitelist 文件,里面会包含的正常文件。Jpg png GIF。
截断上传
原理:虽然web应用做了校验,但是由于文件上传后的路径用户可以控制,攻击者可以利用手动添加字符串标识符0X00的方式来将后面的拼接的内容进行截断,导致后面的内容无效,而且后面的内容又可以帮助我们绕过黑白名单的检测。
绕过思路:在C语言中,空字符有一个特殊含义,代表字符串的拼接结束。这里我们使用的是php语言,属于高级语言,底层靠C语言来实现的,也就是说空字符的字符串拼接结束功能在PHP中也能实现。但是我们在URL中不能直接使用空,这样会造成无法识别;我们通过查看ASCII对照表,发现ASCII对照表第一个就空字符,它对应的16进制是00,这里我们就可以用16进制的00来代替空字符,让它截断后面的内容。
使用burpsuite进行抓包,因为这里是通过URL进行传递的文件上传后存储路径,所以需要对16进制的00进行URL编码,编码的结果就是%00,通过这种方式,就可以%00截断后面的内容,让拼接的文件名不再进行生效:
文件头检测
这种方法利用的是每一个特定类型的文件都会有不太一样的开头或者标志位。可以通过比如php的exif_imagetype()/getimagesize()函数,一个通过这种方法来过滤的示例代码如下:
if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) {
echo "File is not an image";
return;
}
常见文件的文件头:
JPG FF D8 FF E0 00 10 4A 46 49 46
GIF 47 49 46 38 39 61 // 相当于文本的GIF89a
PNG 89 50 4E 47
后端会检测上传文件图片的文件头,在burp里面抓的包如下,这是上传java文件的文件头!
当上传正常的图片时:
绕过的方法就是通过burpsuite抓包修改php脚本文件的文件头为正常的图片文件头,从而实现绕过。
MIME类型检测
什么是MIME:
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。
常见的MIME类型:
text/plain (纯文本)
text/html (HTML文档)
text/javascript (js代码)
application/xhtml+xml (XHTML文档)
image/gif (GIF图像)
image/jpeg (JPEG图像)
image/png (PNG图像)
video/mpeg (MPEG动画)
application/octet-stream (二进制数据)
application/pdf (PDF文档)
检测方式:在文件上传过程中,服务端会针对我们的上传的文件生成一个数组,这个数组其中有一项就是这个文件的类型file_type;服务端对文件进行检测时,就是通过检测脚本中的黑白名单和这个数组中的file_type进行对比,如果符合要求就允许上传这个文件。
绕过原理:
部分Web应用系统判定文件类型是通过content-type字段,可以通过抓包,将content-type字段改为常见的图片类型,如image/gif,image/png等等,从而绕过校验。
.htaccess文件解析漏洞
原理:.htaccess文件(或者"分布式配置文件") ,全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法,即,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
利用方式:上传覆盖.htaccess文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析。
代码语言:
<FilesMatch "evil.gif">
SetHandler application/x-httpd-php #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
AddHandler php5-script .gif #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
</FilesMatch>
漏洞利用的前提:web具体应用没有禁止.htaccess文件的上传,同时web服务器提供商允许用户上传自定义的.htaccess文件
IIS6.0解析漏洞
IIS6.0解析漏洞分两种:
1、目录解析: 以xx.asp命名的文件夹里的文件都将会被当成ASP文件执行。
2、文件解析: xx.asp;.jpg 像这种畸形文件名在;后面的直接被忽略,也就是说当成xx.asp文件执行。
IIS6.0 默认的可执行文件除了asp还包含这三种 .asa .cer .cdx。
IIS7.0 | IIS7.5 | Nginx的解析漏洞
原理: Nginx拿到文件路径(更专业的说法是URI)/test.jpg/test.php后,一看后缀是.php,便认为该文件是php文件,转交给php去处理。php一看/test.jpg/test.php不存在,便删去最后的/test.php,又看/test.jpg存在,便把/test.jpg当成要执行的文件了,又因为后缀为.jpg,php认为这不是php文件,于是返回Access denied。 这其中涉及到php的一个选项:cgi.fix_pathinfo,该值默认为1,表示开启。开启这一选项PHP可以对文件路径进行修理。
举个例子,当php遇到文件路径/1.jpg/2.txt/3.php时,若/1.jpg/2.txt/3.php不存在,则会去掉最后的/3.php,然后判断/1.jpg/2.txt是否存在,若存在,则把/1.jpg/2.txt当做文件/1.jpg/2.txt/3.php,若/1.jpg/2.txt仍不存在,则继续去掉/2.txt,以此类推。
Apache解析漏洞
原理:Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如test.php.a.b的“.a”和“.b”这两种后缀是apache不可识别解析,apache就会把test.php.a.b解析成test.php。
影响版本:
apache 1.x apache 2.2.x。
漏洞利用
通过文件上传漏洞,上传脚本文件到目标服务器里面,通过访问脚本文件实现webshell,在此我们用pikachu靶场来实现。
当我们上传php文件时,会提示上传的图片只能是jpg,jpeg,png格式的!基于此我们可以认为这个是MIME类型检测,通过抓包查看
我们修改content-type进行尝试
可以看到文件上传成功,我们绕过了MIME检测。接下来我们打开蚁剑,建立连接。
打开网站源码界面,可以看到内容一样,可以进行增删查改等操作
自此一个完整的流程就是这样,文件上传其中还包括其他各种漏洞,就本文严格来说并不详细,只是给大家提供一个思路。尚未完全讲述其细节之处,如有错误请指正。