【网络安全 --- 任意文件上传漏洞(2)】带你了解学习任意文件上传漏洞

一,环境工具准备

1-1 本篇博客所用到的工具百度网盘下载地址:

百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间icon-default.png?t=N7T8https://pan.baidu.com/s/1x_qV-4dtakCq8DOnmNetkw?pwd=8888
提取码:8888 

1-2 VMware 16.0 安装【网络安全 --- 工具安装】VMware 16.0 详细安装过程(提供资源)-CSDN博客文章浏览阅读179次,点赞9次,收藏2次。【网络安全 --- 工具安装】VMware 16.0 详细安装过程(提供资源)https://blog.csdn.net/m0_67844671/article/details/133609717?spm=1001.2014.3001.5502

1-3 Windows server 2003 安装

【网路安全 --- win2003安装】 windows server 2003 详细安装过程(提供镜像资源)_网络安全_Aini的博客-CSDN博客文章浏览阅读168次。【网路安全 --- win2003安装】 windows server 2003 详细安装过程(提供镜像资源)https://blog.csdn.net/m0_67844671/article/details/133675835?spm=1001.2014.3001.5502

1-4  pikachu靶场的安装

【网路安全 --- pikachu靶场安装】超详细的pikachu靶场安装教程(提供靶场代码及工具)_网络安全_Aini的博客-CSDN博客文章浏览阅读128次,点赞10次,收藏2次。【网路安全 --- pikachu靶场安装】超详细的pikachu靶场安装教程(提供靶场代码及工具)https://blog.csdn.net/m0_67844671/article/details/133682360?spm=1001.2014.3001.5502

1-5 Burp Suite 抓包工具准备

【网络安全 --- Burp Suite抓包工具】学网安必不可少的Burp Suite工具的安装及配置-CSDN博客文章浏览阅读116次。【网络安全 --- Burp Suite抓包工具】学网安必不可少的Burp Suite工具的安装及配置https://blog.csdn.net/m0_67844671/article/details/133843910?spm=1001.2014.3001.5502

二,任意文件上传

2-1 测试流程

只要看到有文件上传的地方都可以进行测试,都有可能存在漏洞,微信、qq、论坛等等

2-2 防御手段

 2-3 实战测试

3-1 前端js检验绕过

1-1 方式一:前端代码修改

如下上传文件是有格式要求的,只能传图片

我们上传一个非图片文件来看看效果  

发现只要不是图片格式的文件,就会报错,那这个错误哪来的呢?找到这个源代码位置:  

这是个典型的前端js校验,那么我们找到网站源代码,直接在浏览器上修改一下  

双击以后内容是可以修改的,直接删除掉这里即可 

然后上传一个非图片文件来看看效果,下面这个动作我是通过火狐来测试的,因为谷歌浏览器好像不太行,页面舒心以后那个函数有自己加上了 

我们用火狐浏览器试一下 

这是一个老版本的很方便的火狐浏览器,发现可以上传别的文件了(这个老板火狐我放在工具文件里了,百度网盘下载即可

 

然后发现xx.txt文件上传没问题了。然后我们上传一个木马上去,找到木马文件所在位置 (也是在工具文件里

打开webshell.php 以后看到了密码wghostk 

点击选择webshell.php 

点击上传以后,提示上传成功,而且把路径也告诉你了

http://192.168.31.159/pikachu/vul/unsafeupload/uploads/webshell.php
 

效果:密码就是刚才nodepad++打开的wenshell.php文件里面显示的密码  

成功拿下了目标服务器,因为这个界面有很多功能可以下载上传文件,打开命令框,等 

获取到了webshell对系统进行控制。

其实前端js校验绕过的话,还可以通过burp抓包,修改包的形式进行绕过

1-2 方式二:抓包

Burp suite抓包工具的下载安装详细教程我已经出了博客,并在文章开头环境工具准备里给了,可以参考安装

1.先将webshell.php改一下扩展名,比如叫做webshell.jpg,为了能够上传昂,这里我复制了一份,然后把扩展名改了

2.pikachu中上传一个webshell.jpg图片,然后抓包,看效果

选了我们改过后缀名的木马文件

开启抓包

抓包,以下就是我们抓到的包

然后将文件名称改为webshell.php,然后放包,就上传成功了。  

回来看浏览器就提示上传成功,并给出了路径,一样的方法可以自己访问一下,看看能不能getshell,还是可以getshell的

3-2 服务端检验绕过 

2-1 MIME类型检查

每个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

我们随便上传一个非图片文件,然后点击开始上传,抓到这个包,放到重发器,然后发送这个包,看响应结果,发现报错了

然后抓包 ,放到重发器以后,放包,关闭拦截

其实我们看代码,就会发现,它是通过Content-Type这个请求分段数据部分的请求头信息来进行文件类型判断的,这个请求头的值是固定的,根据你上传的文件类型,自动添加的请求头的值。看代码能看到,它只支持图片格式。  

接下来进行绕过,其实就修改一下这个请求头的值即可,改为: image/png  

看后台代码就可以发现,他是对它是通过Content-Type这个请求分段数据部分的请求头信息来进行文件类型判断的

上传文件简单分析

## 通过使用 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文件则不符合条件返回文件类型错误。
2-2 代码注入绕过--getimagesize()  

getimagesize() 是php的一个函数,用于获取图像大小及相关信息,成功返回一个数组,失败则返回FALSE 并产生一条 E_WARNING 级的错误信息,如果用这个涵数来获取类型,从而判断是否是图片的话,会存在问题。其实这个函数比较难绕过,也就是比较安全的一个函数,绕过它三种方法,但是利用起来还需要一个前提条件,就是对方站点还要有一个文件包含漏洞,才能绕过它,或者修改文件数据的头部数据

函数用法:

语法格式:
array getimagesize ( string $filename [, array &$imageinfo ] )
getimagesize() 
    ## 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。

注意如果报了如下图错误,就是我们php版本的问题

 ## 从php5.3 ,当对使用date()等函数时,如果timezone设置不正确,在每一次调用时间函数时,都会产生E_NOTICE 或者 E_WARNING 信息。知道了问题的根源,解决的方法有三种,任选一种即可。

## 一、在页头使用date_default_timezone_set()设置 date_default_timezone_set('PRC');
## 二、在页头使用ini_set('date.timezone','Asia/Shanghai’);
## 三、修改php.ini。打开php5.ini查找date.timezone 去掉前面的分号修改成为:date.timezone = PRC

## 注意:上述设置都是针对中国大陆来设置的,同时PRC也可以用Asia/Shanghai,Asia/Chongqing,Asia/Urumqi来代替

phpstudy解决起来比较简单,切换版本即可  

如果没有报错就是PHP版本没问题,然后再回来,点击开始上传,就提示你格式不对了,就是不让你上传除了图片以外的内容 

按照之前的方式肯定是不能绕过了,那如何绕过呢?

文件包含漏洞之文件上传漏洞利用,这句话的意思是,我们将木马做成图片格式,也就是图片携带木马,这种情况,利用上传漏洞来攻击。看方法

方法一:直接伪造头部GIF89A
方法二:CMD方法,copy /b test.png+1.php muma.png
方法三:直接使用工具增加备注写入一句话木马。

方法一:直接伪造头部GIF89A

什么是文件头?

我用Notepad++打开了一个png图片,第一行就是文件头

我用Notepad++打开了一个gif图片,GIF89a就是文件头

GIF89A是gif图片格式的数据开头。每种类型的文件,文件数据的开头都是不同的,相同的文件类型,打开之后,文件数据肯定是相同的,比如我们通过记事本以16进制的形式打开几个图片看看效果:

而getimagesize() 函数除了检查了文件扩展名,还会检查文件数据,当我们上传了一个非图片文件,然后通过burp改了数据包,改为了图片格式的后缀名,发送包之后,报错了,所以如果php开发人员使用了这个函数,那么我们攻击时,要考虑这个事情。但是,这个函数不是将文件内容全部检查一遍,它检查的就是文件数据中的前面标识文件格式的数据。  

那我们就抓包,加个文件头试一试 

正常情况提示不是图片,不要欺骗我

注意下面图片,我加了个gif图片的文件头,就成功绕过去了

方法二:copy方法  

CMD方法: copy /b aini.jpg+1.php muma.jpg

上面这句话意思就是打开cmd窗口,把test.png图片很一个1.PHP木马文件进行混合输出到muma.png

在这个目录里,按住shift鼠标右击,就可以看到在终端中打开这个字

里面1.php写的是一句话木马,aini.jpg是正常的图片

在这个文件夹下按住shift,鼠标右击就可以看到打开终端

成功把一个图片和一句话木马混在一起了

然后我们选择muma.jpg

上传成功了

这个图片马就上传成功了,可以用蚁剑 或菜刀工具连接看看,但是没办法直接进行连接的,这就需要借助于另外一个漏洞,文件包含漏洞,在下面的第三个方法讲了如何配合文件包含漏洞去利用图片马

方法三:直接使用工具增加备注写入一句话木马 

这是通过工具给图片等文件数据加入木马程序数据,但是和方法二不同的就是,方法二是将木马程序放到了文件数据的结尾,这个工具是将木马程序放到文件数据的随机位置,它可以绕过二次渲染。这个二次渲染我们后面会讲。

点击ok,就这样吧一句话木马插入到了图片中 

用记事本或者notepad++打开以后能找到隐藏的一句话木马

这种方式比前面两个方式都好一些,算是最好手段了。

那么将含有木马程序的图片上传到目标服务器上,比如我将这个test.jpg文件

点击开始上传 ,就上传成功了,而且文件保存路径都有了

能够当作木马执行吗?默认情况下肯定是不行的,这样我们先访问一下我们上传到服务器上的图片网址,看效果  

192.168.31.159/pikachu/vul/unsafeupload/uploads/2023/10/26/192197653a05b8aba95044439313.jpg

针对这个路径,我们可以通过注入的方式来找到我们的木马文件所在路径,从而触发我们的图片中的木马程序 ,相当于有一个文件包含漏洞,通过文件包含触发我们的木马 

http://192.168.0.15/pikachu/vul/fileinclude/fi_local.php?filename=file1.php&submit=%E6%8F%90%E4%BA%A4

## file1.php所在目录:

C:\phpStudy\PHPTutorial\WWW\pikachu\vul\fileinclude\include

 通过它来找到我们的图片文件,通过../去查找,

../../ 以后就回到了vul目录

../../unsafeupload/uploads/2023/10/26/192197653a05b8aba95044439313.jpg

URL修改以后回车,就看到图片信息了,就已经触发了我们木马

它需要结合另外一个漏洞才能将任意文件当作脚本来执行,比如图片带木马的文件,如果要执行,需要配置文件包含漏洞,这个漏洞我们后面讲。这个getimagesize()函数虽然能够对文件格式做和好的限制,但是我们通过文件包含漏洞也就是文件中包含木马的方式也能进行攻击渗透。菜刀连接  

打开我们的菜刀工具

链接就是文件包含的链接

http://192.168.31.159/pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2023/10/26/192197653a05b8aba95044439313.jpg&submit=%E6%8F%90%E4%BA%A4   

密码是我们之前用工具插入图片马的时候的密码

http://192.168.31.159/pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2023/10/26/192197653a05b8aba95044439313.jpg&submit=%E6%8F%90%E4%BA%A4

都输入好了以后点击左下角的编辑,然后双击列表里的第一个链接就可也连上了 

 这就是getshell的效果

下一篇博客是文件上传绕过,靶场练习 

猜你喜欢

转载自blog.csdn.net/m0_67844671/article/details/134036922