一. 引言
所谓常见的文件上传的绕过知识,有老旧的解析漏洞,黑名单绕过,js前端绕过,空字节等等,但凭我的经历,我觉得这种类型的文件上传,几乎绝种了,碰到了,也只是运气好,或者网站太老了。
我碰到的文件上传基本上是,后台检查文件名后缀,完事后上传还要用随机数代替原有文件名,搞你心态
今天我要分享一个“不常见”的文件上传绕过方法。
PS:本文仅用于技术研究与讨论,严禁用于非法用途,违者后果自负
二. 附加背景
大概一个月前,一位警察朋友发来了一个果聊诈骗网站(因为是违法的网站,就不给他打码了,网站封面就不放了,少儿不宜)
目标是弱口令,admin admin
警察朋友进入后台后搞不定,就让我试试,我成功文件上传。
可惜当时,我因为太晚了,就没打算在那天写文章,也忘记对文件上传的数据包进行截图了。导致现在写这文章,网站已经被警方关闭了,我没法用原貌图了,下面的图,我用的是网图,尽可能还原当时的样子。
三. 文件上传绕过正文
测试环境:
1,基于thinkphp改的后台管理系统
2,admin账号是超级管理员权限,后台最高权限账号
在进入后台登录的地址,登了admin后,进入后台管理系统,在管理网站选项上,有那么个地方
注意,别这里的上传类型有.php,你就真的傻乎乎的以为你可以直接上传个php文件。
这个干什么用的,在我具体操作中再解释
我当时上传文件的地方很简单,就是头像上传,上传时还有行小字,“只允许.jpg,.gif,.png”
上传图片,抓包
改后缀名,theone.php上传,
返回上传失败,文件后缀名违法
改后缀名,theone.jpg.gif上传,
返回上传成功,文件名为<random1>.jpg
改后缀名,theone.php.jpg上传,
返回上传成功,文件名为<random2>.php
文件上传绕过成功,进行蚁剑连接,这张连接了webshell的图是我的实例图了,不是网图了
四. 文件上传绕过的分析
我们先学习简单的php代码获取文件名,这段代码是唯一的
上传文件名: $_FILES["file"]["name"]
获取文件后缀名,这段代码是不唯一的,也就是说有多种写法
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp); // 获取文件后缀名
注意,这里重点就要来了
explode函数用“.”将整个函数分割
再用end()获取最后的一块,作为后缀名
这段的逻辑是对的,
但是,如果开发人员没有考虑到,文件名有两个‘.’呢?
那么他获取的后缀名的代码将是
$temp = explode(".", $_FILES["file"]["name"]);
$extension = $temp[1]; // 获取文件后缀名
而使用thinkphp这样的开发模板,
负责上传文件的程序是不需要你写的,是内置的,你只需要调用接口就行了
tp也有自己的上传安全检测功能,也就是前文说到的
“注意,别这里的上传类型有.php,你就真的傻乎乎的以为你可以直接上传个php文件。“
所以你在后台添加了.php,这个文件检测就基本废了
但网站的程序员会自己编写上传安全检测,检测合法后,就会转到tp的内置文件上传处理。
那么有意思的就来了,
检测文件后缀名安全的代码和上传文件的代码是两个不同的人写的
在处理我的文件名theone.php.jpg时,
检测安全的代码,用的是end()
取的是.jpg作为后缀名,在白名单匹配,放行
负责上传文件的代码,用的是$temp[1]
取的是.php作为后缀名,也在模板自己的白名单匹配,放行
最终上传的文件为.php
五. 对这样漏洞的反思
这是一个典型的分开开发,不协调,导致的绕过漏洞
同时我们要明白在用别人模板的时候,要明白别人的接口的数据处理,或者模板提供商要有所提醒。
来源:freebuf.com 2021-05-12 12:51:06 by: 老哥和学习额
请登录后发表评论
注册