夺站技巧|文件上传——不常见中常见的一个绕过知识 – 作者:老哥和学习额

一. 引言

所谓常见的文件上传的绕过知识,有老旧的解析漏洞,黑名单绕过,js前端绕过,空字节等等,但凭我的经历,我觉得这种类型的文件上传,几乎绝种了,碰到了,也只是运气好,或者网站太老了。

我碰到的文件上传基本上是,后台检查文件名后缀,完事后上传还要用随机数代替原有文件名,搞你心态

今天我要分享一个“不常见”的文件上传绕过方法。

PS:本文仅用于技术研究与讨论,严禁用于非法用途,违者后果自负

二. 附加背景

大概一个月前,一位警察朋友发来了一个果聊诈骗网站(因为是违法的网站,就不给他打码了,网站封面就不放了,少儿不宜)

1620725168_609a4db041aff61c19819.png!small?1620725189945

目标是弱口令,admin admin

警察朋友进入后台后搞不定,就让我试试,我成功文件上传。

1620725652_609a4f94a0e3a0785c0c2.png!small?1620725667239

1620725606_609a4f66a7566a26c713f.png!small?1620725621162

可惜当时,我因为太晚了,就没打算在那天写文章,也忘记对文件上传的数据包进行截图了。导致现在写这文章,网站已经被警方关闭了,我没法用原貌图了,下面的图,我用的是网图,尽可能还原当时的样子。

1620726066_609a5132bb10ee1c9e68f.png!small?1620726081444

三. 文件上传绕过正文

测试环境:

1,基于thinkphp改的后台管理系统

2,admin账号是超级管理员权限,后台最高权限账号

在进入后台登录的地址,登了admin后,进入后台管理系统,在管理网站选项上,有那么个地方

1620727232_609a55c018b0a893b6610.png!small?1620727246581

注意,别这里的上传类型有.php,你就真的傻乎乎的以为你可以直接上传个php文件。

这个干什么用的,在我具体操作中再解释

我当时上传文件的地方很简单,就是头像上传,上传时还有行小字,“只允许.jpg,.gif,.png”

1620728020_609a58d424b0f50015b08.png!small?1620728034772

上传图片,抓包

1621217703_60a1d1a7166c48451c23c.png!small?1621217703639

改后缀名,theone.php上传,

返回上传失败,文件后缀名违法

1620745833_609a9e696faa2bc01a343.png!small?1620745848732

改后缀名,theone.jpg.gif上传,

返回上传成功,文件名为<random1>.jpg

1620794305_609b5bc167e680a2c0d65.png!small?1620794320458

改后缀名,theone.php.jpg上传,

返回上传成功,文件名为<random2>.php

1620794325_609b5bd56398d254518d0.png!small?1620794340358

文件上传绕过成功,进行蚁剑连接,这张连接了webshell的图是我的实例图了,不是网图了

1620746344_609aa068b18846646386f.png!small?1620746359888

四. 文件上传绕过的分析

我们先学习简单的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: 老哥和学习额

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论