文件上传
1、文件上传漏洞
有文件上传的地方可能有上传漏洞,但有文件上传不一定有上传漏洞,具体要看实际情况。
2、危害
如果有漏洞,我们可以上传一个后门,获取权限,危害还是比较大的。
3、查找和判断
1)常规类:扫描获取上传、会员中心上传、后台系统上传、各种途径上传
2)CMS类:已知CMS源码
3)编辑器类
4)其他类/CVE:代码审计、平台/三方应用等
注:(1)解析问题,一般网站允许上传什么格式的文件,就会对相对应的格式进行解析,而解析不了其他类型的文件。但是如果一个网站的文件上传的过滤得很好,能将上传的脚本文件都给过滤掉,但刚好有解析漏洞,我们就可以将脚本写进允许上传格式的文件中,逃过过滤来执行。(2)如果知道网站的CMS或编辑器等,我们在找相对应的漏洞时就不需要抓包一步一步去分析,我们可以直接网上搜索相关漏洞利用,大大节省我们的时间和精力。
4、文件上传常见验证
后缀名、类型、文件头等
后缀名:白名单(可以上传的格式后缀)、黑名单(不能上传的格式后缀)
文件类型:MIME信息(MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。)
文件头:内容头信息
5、找文件上传漏洞思路
1)首先收集网站中间件的版本信息看有没有解析漏洞。2)找网站上传点,可以用字典来扫,可能的上传点会员中心上传、后台系统上传、各种途径上传。3)找到上传点后尝试绕过黑名单、白名单、文件类型、文件头等过滤将脚本上传。4)上面绕过不了,找CMS漏洞、编辑器漏洞、CVE漏洞,根据网上漏洞利用资料实现文件上传漏洞。
6、上传参数名解析(实例见下图)
Content-Disposition: 一般可改;
name=表单参数值不可改;
filename=文件名可改
Content-Type: 文件MIME可改
7、常见绕过方法(实验见下面绕安全狗)
数据溢出--防匹配
符号变异--防匹配
数据截断--防匹配
重复数据--防匹配
upload-labs下载地址:https://github.com/c0ny1/upload-labs
------------------------------------------------------------------------------------------------------------------
vulhub靶场搭建(虚拟机用centos7)
更改centos的下载镜像源,命令curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo覆盖,命令cat /etc/yum.repos.d/CentOS-Base.repo查看是否覆盖成功。
命令sudo yum -y update更新一下软件,更新好后yum list docker-ce --showduplicates | sort -r查看本机是否安装docker,报错了没装。
添加yum源,命令yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo。
命令yum install docker-ce -y安装最新的docker,如果有依赖问题的话使用命令yum install -y yum-utils device-mapper-persistent-data lvm2提前下好依赖,下好后使用docker version查看版本。
命令systemctl start docker和systemctl enable docker设置启动并开机自启。
命令curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose安装docker-compose
命令cd /usr/local/bin/进入到目录中,命令chmod +x docker-compose给目录增加可执行权限。
命令mkdir -p /var/local/soft/创建存放vulhub的目录,cd /var/local/soft/进入到目录中,yum -y install git安装git,git clone https://github.com/vulhub/vulhub.git下载vulhub
命令cd ./vulhub,ls查看有哪些漏洞
------------------------------------------------------------------------------------------------------------------
测试一下nginx中的PHP文件上传漏洞
cd ./nginx,ls,cd ./nginx_parsing_vulnerability,docker-compose build,docker-compose up -d开启这个漏洞靶场
出了点小问题80端口被占用了
命令netstat -tln | grep 80查看端口是否使用,在用lsof -i:80命令查看是哪个在占用。kill -9 2098和kill -9 2100将这两个进程杀掉。
按照上面的步骤再次开启靶场漏洞,浏览器访问一下
弄一张jpg格式的图片,打开写一些PHP的代码放在后面。
浏览器地址栏输入这个路径可以查看到对应的上传照片
在文件路径后面加个/x.php就可以执行我们的PHP代码(x为任意字符)
------------------------------------------------------------------------------------------------------------------
upload-labs靶场过关(其实每关都有很多的过关方法)
pass-01
看源码就是前端的一个js验证。过关方法就是将我们的后门代码.php改为.jpg,上传就绕过了前端验证,再用burpsuite把这个数据包抓住。抓住后再将.jpg改为.php上传。还有第二种方法就是这里的前端验证是js写的一个函数实现的,将js禁用就可以直接上传php脚本了。
pass-02
看源码这次是在后端代码中验证,验证文件的文件类型。我们使用burpsuite抓到这个数据包,将文件类型改一下就能上传成功了。
pass-03
看源码有个黑名单,然后呢还会对文件名进行过滤,去除文件名的空格,去掉文件名最后的.,获取文件名第一个.后面的字符串也就是后缀名,将获取的后缀名全部转化为小写,去掉时间戳再去空格,最后将过滤得到的后缀名和黑名单里面的后缀名比照。不在黑名单里就存储到对应位置。这个过滤规则可以看到还是非常严格的,但这个黑名单里的限制格式是比较少的,我们可以上传特殊解析后缀,比如php5等(可以在第四关的黑名单中看)。
pass-04
这关的黑名单和过滤规则都很严苛,我们换种方式来上传。.htaccess 是Apache HTTP Server的文件目录系统级别的配置文件的默认的名字。它提供了在主配置文件中定义用户自定义指令的支持。 这些配置指令需要在 .htaccess 上下文 和用户需要的适当许可。创建一个.htaccess的文件里面写上如下内容,这串代码会将名为along的文件当成php文件类型来执行。
<FilesMatch "along">
SetHandler application/x-httpd-php
</FilesMatch>
上传.htaccess文件,然后再上传along.jpg的php后门。可能是版本的问题执行不成功。
pass-06
没有过滤大小写,将后缀名改成大写就行了。
pass-07
没有去除文件最后的空格,在后缀名后面加个空格。抓包到数据包中修改。可能是版本的问题执行不成功。
pass-08
没有去除文件最后的.,在后缀名后面加个点。抓包到数据包中修改。可能是版本的问题执行不成功。
1到11关都是一次过滤,都可以通过在后缀名后面多打几个空格和点来绕过。
pass-012
这关黑名单换成白名单了,源码将上传文件后缀名获取,看是否在白名单中。在的话将上传文件放到一个生成的路径中去。这个需要使用%00来截断。将php脚本改为jpg格式上传,然后burpsuite抓包将上传路径后面加个1.php%00将后面的文件名和后缀阶段,重新成为php脚本文件。但是下面这个没成功,%00需要php版本5.3以下才能使用,但是小皮面板下载不了5.3以下的php。
pass-013
和12差不多,只不过是提交方式改变了,有get改为了post提交。注这个是post提交不会对%00进行解码,需要我们来url解码。也失败了可能还是PHP版本问题。
pass-014
源码会打开文件,获取文件的头部信息,根据文件头部信息来确定文件类型。这里类似一个白名单,不在名单里的就上传不成功。这里选择利用文件包含漏洞,上传一个包含php后门脚本的图片来实现。首先制作一个图片马,打开图片插入<?php @eval($_POST['x']);?>
上传这张图片,然后查看文件包含漏洞中的信息,浏览器中添加上传文件的路径和我们上传脚本中需要的post参数,然后提交执行我们的脚本。
14到17都差不多,都是利用文件包含漏洞来过关。
二次渲染:在我们上传文件后,网站会对图片进行二次处理(格式、尺寸,保存,删除 要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片(标准化)并放到网站对应的标签进行显示。
pass-018
这关就是一个二次渲染的逻辑漏洞,先保存到服务器再过滤。这关我们可以配合条件竞争来过关。我们就可以使用burpsuite一直往网站发脚本的数据包,我们在浏览器一直访问我们上传的脚本,那么我们就有概率在脚本在被过滤删除之前执行。抓到数据包右键sent to intruder,设置好参数(先在positions中添加一个攻击标识可以点auto&,再在payload中设置攻击次数,再在resource pool资源池中设置每次发多少个)然后攻击。我们在浏览器中输入上传地址一直刷新就有概率执行上传的脚本。
pass-020
这关抓包将上传的文件名改为.php/.就可以上传成功了。这关也是利用操作系统的漏洞,将一个文件夹路径强制为一个文件路径。
pass-021
这关是白名单,看源码。注意这里修改数据包时是将save_name改为数组,要将-----------------------------2671557371068138260382635这个分隔符也加上不然靶场识别不出来。
------------------------------------------------------------------------------------------------------------------
利用上面的uploadlabs的第二关来绕过安全狗(这条狗是Apache v4.0版本)
网站安全狗安装时需要注意,它安装的时候是识别不到phpstudy中的apache的。我们需要将小皮面板中的apache关掉,用管理员身份打开cmd,cd到小皮面板apache的bin目录下,输入 .\httpd.exe -k install -n apache2.4命令下载Apache。然后win+R输入services.msc进入到服务中打开Apache。这样安全狗才能正常拦截。
数据溢出
原理就是在文件名中或上传参数之间输入大量的垃圾数据,这样安全狗就有可能检测不到我们上传的脚本文件。但是不管用,安全狗升级了。文件是上传上去了,但只回显安全狗的拦截页面。
符号变异
将后面的"去掉,安全狗拦截了。下面这个符号变异的写法成功了。
数据截断
在php后面加%00.jpg然后将%00解码能绕过。将文件名中的字母换行被狗拦截了。
多写一些filename被拦截了。下面这种往filename里面塞其他参数的方式成功了。
fuzz绕过
下载一个字典,地址:https://github.com/c0ny1/upload-fuzz-dic-builder。burpsuite抓到数据包右键sent to intruder,positions选中文件名标记一下
payloads中的load找到刚下好的字典加进来,开始攻击。