任意(不安全)文件下载和上传
文章目录
- 一、任意文件下载
- 1)漏洞介绍
- 2)利用方式
- ##举例:
- 3)漏洞修复
- 二、 任意文件上传
- 1)概述
- 2)测试流程
- 3)实战测试
- 3.1 客户端检测绕过(javascript 检测)
- 3.2服务端验证绕过 (MIME 类型检测)
- 4)代码注入绕过--getimagesize()
- 5)路径/扩展名绕过
- 5.1 白名单
- 5.2 黑名单
- 6)中间件解析漏洞绕过
- 7)安全防范
一、任意文件下载
1)漏洞介绍
** 一些网站由于业务需求,往往需要提供文件查看或文件下载功能,但若对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载任意敏感文件,这就是文件查看与下载漏洞。**
2)利用方式
一般链接形式:download.php?path=down.php?file=data.php?file=download.php?filename=或者包含参数:&Src=&Inputfile=&Filepath=&Path=&Data=**//当我们浏览网页时,经常见到此类链接形式和参数,可能就存在漏洞**
2.1当遇到一个任意文件下载时,我们的一般利用思路:
1)下载常规的配置文件,例如: ssh,weblogic,ftp,mysql等相关配置
2)下载各种.log文件,从中寻找一些后台地址,文件上传点之类的地方,如果运气好的话会获得一些前辈们的后门。
3)下载web业务文件进行白盒审计,利用漏洞进一步攻入服务器。
尝试读取/root/.bash_history看自己是否具有root权限。如果没有的话。我们只能按部就班的利用…/来回跳转读取一些.ssh下的配置信息文件,读取mysql下的.bash_history文件。来查看是否记录了一些可以利用的相关信息。然后逐个下载我们需要审计的代码文件,但是下载的时候变得很繁琐,我们只能尝试去猜解目录,然后下载一些中间件的记录日志进行分析。
2.2如果我们遇到的是java+oracle环境:
可以先下载/WEB-INF/classes/applicationContext.xml 文件,这里面记载的是web服务器的相应配置,然后下载/WEB-INF/classes/xxx/xxx/ccc.class对文件进行反编译,然后搜索文件中的upload关键字看是否存在一些api接口,如果存在的话我们可以本地构造上传页面用api接口将我们的文件传输进服务器
2.3如果具有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参数
##举例:
复制文字图片链接,粘贴到网址栏,可以看到在最后有下载路径和文件名称,这时可以在“=”后面,使用“…/…/”返回到指定上级路径,进行敏感文件的下载。
在这里,我们返回到了pikachu的根目录,在根目录下下载了index.php这个页面的源码文件。
3)漏洞修复
(1)过滤".",使用户在url中不能回溯上级目录
(2)正则严格判断用户输入参数的格式
(3)php.ini配置open_basedir限定文件访问范围
我们打开pikachu的下载配置文件:
<?php$PIKA_ROOT_DIR = "../../";include_once $PIKA_ROOT_DIR."inc/function.php";header("Content-type:text/html;charset=utf-8");// $file_name="cookie.jpg";$file_path="download/{$_GET['filename']}"; //这里!!!//用以解决中文不能显示出来的问题 $file_path=iconv("utf-8","gb2312",$file_path);//首先要判断给定的文件存在与否if(!file_exists($file_path)){ skip("你要下载的文件不存在,请重新下载", 'unsafe_down.php'); return ;}$fp=fopen($file_path,"rb");$file_size=filesize($file_path);//下载文件需要用到的头ob_clean();//输出前一定要clean一下,否则图片打不开Header("Content-type: application/octet-stream");Header("Accept-Ranges: bytes");Header("Accept-Length:".$file_size);Header("Content-Disposition: attachment; filename=".basename($file_path));$buffer=1024;$file_count=0;//向浏览器返回数据//循环读取文件流,然后返回到浏览器feof确认是否到EOFwhile(!feof($fp) && $file_count<$file_size){ $file_con=fread($fp,$buffer); $file_count+=$buffer; echo $file_con;}fclose($fp);?>
仔细看,在GET这个参数没有定义filename的匹配规则,同时,filename可以设定为绝对路径,这样就只能在指定目录文件中进行下载。
二、 任意文件上传
1)概述
** 大多数网站都有文件上传的接口,但如果在后台开发时并没有对上传的文件进行安全考虑或采用了有缺陷的措施,导致攻击者可以通过一些手段绕过安全措施从而上传一些恶意文件,从而通过该恶意文件的访问来控制整个后台
2)测试流程
3)实战测试
3.1 客户端检测绕过(javascript 检测)
首先观察到提示只允许上传图片文件,那么前端的查看代码,当页面发生改变时,会调用这个checkFileExt函数来检查上传的是不是图片,我们只需要在前端将checkFileExt函数删除,就能上传一个一个非图片文件。
3.2服务端验证绕过 (MIME 类型检测)
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。
常见的MIME类型(通用型):
超文本标记语言文本 .html text/html
xml文档 .xml text/xml
XHTML文档 .xhtml application/xhtml+xml
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
PDF文档 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG图像 .png image/png
GIF图形 .gif image/gif
JPEG图形 .jpeg,.jpg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
任意的二进制数据 application/octet-stream
通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。
第一个参数是表单的 input name,第二个下标可以是 “name”, “type”, “size”, “tmp_name” 或 “error”。就像这样:
$_FILES[“file”][“name”] - 被上传文件的名称
$_FILES[“file”][“type”] - 被上传文件的类型
$_FILES[“file”][“size”] - 被上传文件的大小,以字节计
$_FILES[“file”][“tmp_name”] - 存储在服务器的文件的临时副本的名称
$_FILES[“file”][“error”] - 由文件上传导致的错误代码
详细可参考:http://www.w3school.com.cn/php/php_file_upload.asp
分析代码逻辑:首先会获取到前端的提交请求,然后定义了一个数组(定义图片上传指定类型),然后通过upload_sick函数对上传的文件进行一定的检查。
分析upload_sick函数(定义在uploadfunction.php文件里面)存在漏洞的的原因是因为 $ _FILES() 这个全局的方法是通过浏览器http头去获取的content-type,content-type是前端用户可以控制的。容易被绕过。
上传一张正常的符合标准的图片,对其content-type进行抓包操作。可见正常上传符合要求的图片中数据包中content-type为image/png对比符合条件,而php文件则不符合条件返回文件类型错误。
4)代码注入绕过–getimagesize()
getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息,如果用这个涵数来获取类型,从而判断是否是图片的话,会存在问题。
语法格式:
array getimagesize ( string KaTeX parse error: Expected 'EOF', got '&' at position 19: …ename [, array &̲imageinfo ] )
getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。
文件包含漏洞之文件上传漏洞利用
方法一:直接伪造头部GIF89A
方法二:CMD方法,copy /b test.png+1.php muma.png
https://blog.csdn.net/Ro_kin/article/details/75578711
方法三:直接使用工具增加备注写入一句话木马。
5)路径/扩展名绕过
5.1 白名单
0x00截断或test.asp%00.jpg
MIME绕过https://blog.csdn.net/weixin_43915842/article/details/90111207
5.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):: D A T A 绕 过 是 W i n d o w s 下 N T F S 文 件 系 统 的 一 个 特 性 , 即 N T F S 文 件 系 统 的 存 储 数 据 流 的 一 个 属 性 D A T A 时 , 就 是 请 求 a . a s p 本 身 的 数 据 , 如 果 a . a s p 还 包 含 了 其 他 的 数 据 流 , 比 如 a . a s p : l a k e 2. a s p , 请 求 a . a s p : l a k e 2. a s p : : DATA绕过 是Windows下NTFS文件系统的一个特性,即NTFS文件系统的存储数据流的一个属性 DATA 时,就是请求 a.asp 本身的数据,如果a.asp 还包含了其他的数据流,比如 a.asp:lake2.asp,请求 a.asp:lake2.asp:: DATA绕过是Windows下NTFS文件系统的一个特性,即NTFS文件系统的存储数据流的一个属性DATA时,就是请求a.asp本身的数据,如果a.asp还包含了其他的数据流,比如a.asp:lake2.asp,请求a.asp:lake2.asp::DATA,则是请求a.asp中的流数据lake2.asp的流数据内容。
6)中间件解析漏洞绕过
IIS解析漏洞
Apache解析漏洞
.htaccess
配置文件LoadModule rewrite_module modules/mod_rewrite.so前的注释去掉,寻找关键词:AllowOverride,并把后面的参数从None全部改成All
Nginx解析漏洞
.htaccess文件解析
本地文件包含解析
7)安全防范
针对文件上传漏洞的特点和必须具备的三个条件,我们阻断任何一个条件就可以达到组织文件上传攻击的目的:
1、最有效的,将文件上传目录直接设置为不可执行,对于Linux而言,撤销其目录的’x’权限;实际中很多大型网站的上传应用都会放置在独立的存储上作为静态文件处理,一是方便使用缓存加速降低能耗,二是杜绝了脚本执行的可能性;
2、文件类型检查:强烈推荐白名单方式,结合MIME Type、后缀检查等方式(即只允许允许的文件类型进行上传);此外对于图片的处理可以使用压缩函数或resize函数,处理图片的同时破坏其包含的HTML代码;
3、使用随机数改写文件名和文件路径,使得用户不能轻易访问自己上传的文件;
4、单独设置文件服务器的域名;