无回显的任意文件上传

VSole2022-11-25 11:08:35

前言

在某次攻防中,遇到了cms站一个上传点,上传正常图片会回显路径,上传其他文件提示上传失败,且没有过多信息回显,一度以为没有漏洞。

通过找源码代码审计后getshell。

测试

在某次测试过程中发现,通过泄漏的md5进入后台,在后台配置中有处“上传logo”的功能。

通过一顿测试,上传文件为图片后缀但内容非图片(文件头),会提示“上传的不是一张图片”。

如果上传图片文件, 后缀改为php等  会提示“上传失败”。只有正常图片+图片后缀 会返回图片路径。

一时陷入僵局。

一顿百度找到了源代码,那就从代码审计入手吧。

进行代码审计

首先找到上传点的入口文件。

第一行 导入命名空间“phpWeChat” 内的 Upload 类,下面是引用包含一些文件。

再往下,$action是用于下面 switch函数内做索引匹配而调用不同功能的。

$action的值是通过 GET方式获取 “action”参数的值。如果空,就用预设的imageupload

当url为 :get:url/index.php?action=imageupload  进入到“imageupload”代码块


switch($action)  {  case 'imageupload':    $originalname=preg_replace('/[^a-z0-9_]/i','',$originalname);     //过滤文件名特殊字符作用,i:不区分大小写模式    $image=Upload::imageUpload($upload_file,$originalname);      //图片落地    if(is_image($image)) { 省略}  //is_image() 获取文件后缀

其中核心的代码是$image 这一行。

通过使用命名空间中Upload类的imageUpload()方法获取并处理图片后落地,将结果返回。

返回的结果为在下一行if函数作为条件进行判断 。而具体做了什么先看imageUpload()函数做了什么,返回什么结果。

先看Upload类代码如下:

这里使用了命名空间,并在刚才的index.php文件内导入,来进行使用。

Upload类下,定义了几个静态方法,主要是图片、视频、压缩包上传,图片放大等方法

主要看下被调用的imageUpload()方法

在if中的表达式,通过文件上传变量  $_FILES 获取图片用此方法文件上传后,会被存储在服务器临时目录内,

上传成功后将满足if条件,进入if内代码。前四行依次获取上传的图片信息:文件名、临时路径、文件后缀、文件大小。

再经过两个if判断,判断是否post传入图片、判断文件是否超过限制大小。

到了209行这个关键点,会对文件进行检查。

此处的if判断内使用了getimagesize()函数,并检查结果是否为数组,结果并取反

getimagesize()函数会文件头进行检查,来判断文件是否为有效的图片类型。并返回一个包含图片信息的数组。如果上传了非图片内容,getimagesize()返回 false

所以上传非图片内容时,getimagesize()返回 false 并取反 此处会执行exit并弹框"上传的不是一张图片"

对该函数需要进行一个绕过

此时就需要一个图片马进行绕过。或是利用gif文件的头。

下面是一个正常的gif文件头。

GIF89a图形文件就是一个根据图形交换格式(GIF)89a版(1989年7 月发行)进行格式化之后的图形。在GIF89a之前还有87a版(1987年5月发行)

可构造内容,进行绕过。


GIF89a phpinfo();?>

条件满足后,代码往下执行。

前两个变量分别赋值了,将要储存到的 文件名和 目录名

文件名取客户端提交时间+随机值,目录名取当前年月日,然后make_dir创建文件夹。

到了218行,if内表达式 使用move_uploaded_file将文件从tmp临时目录移动到网站上传目录内,此时文件已经写入硬盘目录。move_uploaded_file执行成功后会返回 真值,进入if内进行图片文件尺寸放大等操作。

成功后,这时将返回一个文件路径结果

再回到index入口文件。$image结果是imageUpload()方法返回的文件路径

$image在if判断的条件内,被is_image()处理。

is_image()通过获得后缀,然后在多个图片后缀数组内进行匹配,匹配到返回真值,否则 假。

如果不为'gif','jpg','jpeg','png','bmp'内后缀,结果为假的,前台将返回上传失败提示。

但其实在服务器端,文件已经落地,返回任何信息也只是掩耳盗铃:

总结

1.文件写入目录前,文件的后缀直接使用用户提交时的文件后缀,且未对后缀或文件类型进行检查。

2.文件落地后才进行后缀检查,这时的后缀检查完全是马后炮。

3.虽然对文件有有效性进行验证,但getimagesize()函数是可通过文件头(gif文件头)绕过。

4.move_uploaded_file()函数在php5部分版本中 可以使用 “%00”截断路径名,绕过后缀。

5.文件名前缀,是取客户端提交时间戳+四位随机数,文件名可以被枚举。

上述问题造成了任意文件上传漏洞。

文件上传文件头
本作品采用《CC 协议》,转载必须注明作者和本文链接
最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件(大都数是4GB以上)的http上传,并且要求支持http断点续传。笔者在以前的博客如何实现支持大文件的高性能HTTP文件上传服务器已经介绍了实现大文件上传的一些基本概念,其实非常简单,这里在简要归纳一下,方便记忆:
通过找源码代码审计后getshell。测试在某次测试过程中发现,通过泄漏的md5进入后台,在后台配置中有处“上传logo”的功能。会提示“上传失败”。只有正常图片+图片后缀 会返回图片路径。第一行 导入命名空间“phpWeChat” 内的 Upload 类,下面是引用包含一些文件。再往下,$action是用于下面 switch函数内做索引匹配而调用不同功能的。$action的值是通过 GET方式获取 “action”参数的值。
pass=''.$pass.'' and uname=''.$uname.''';可以构造万能密码 :username填 ' or 1=1#password 填 \'SQL语句变成了'select * from auth where ?
Web安全-一句话木马
2022-07-27 06:43:56
概述在很多的渗透过程中,渗透人员会上传一句话木马到目前web服务目录继而提权获取系统权限,不论asp、php、jsp、aspx都是如此,那么一句话木马到底是什么呢?
文件上传前端JS 防护,通过抓包修改,或插件js禁用来绕过。后端黑名单上传陌生后缀 .php3 php5上传配置文件 .htaccess通过 双写 ,大小写,基于windows 特性
此文章可以说是对于想研究“文件上传漏洞”的新人是必看的内容,如果你不看此笔记,文件上传漏洞实战你能搞明白吗?内部:扫描工具探针的上传地址:后台的上传地址 3、学文件上传漏洞篇要注意哪些关键地方?
在对网站进行渗透测试过程中,经常会遇见WAF,从而导致直接封IP,无法上传文件文件上传漏洞对Web应用来说是一种非常严重的漏洞。 一般情况下,Web应用都会允许用户上传一些文件,如像、附件等信息,如果Web应用没有对用户上传文件进行有效的检查过滤,那么恶意用户就会上传一句话木马等Webshell,从而达到控制Web网站的目的。 一般服务端WAF检测原理包括 黑名单检测:一般有个专门的 b
A:在网络传输不稳定的情况下,导致文件传输不完整,可能会导致误报,除了这个之外很少有人会在上传过程中改变原有的文件类型. Q:能否绕过检测?
今天就聊聊关于上传绕过WAF的姿势,WAF简单的来说就是执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。上传绕过不算什么技术了,正所谓未知防,焉知攻,先来了解一下网站的防御措施吧!
VSole
网络安全专家