源码分析及思路
我们首先还是先来看一下源码
第一行先对content-type进行了检查,可通过抓包绕过
第二行 如果save name(保存名称)为空,就使用原本的文件名称,如果不为空就使用保存名称
第三行if判断语句,判断文件名是不是数组 如果不是数组,就用点给分开分成数组。就阻止了后缀加点或加空格的绕过方式
第四行是获取数组最后一位的值
第五行是白名单限制,if判断是否符合白名单
第六行拼接 是数组第一个元素+‘.‘+数组元素个数减一位的元素(例如数组有三个元素,那么就选择第二位元素进行拼接)
漏洞就存在于第六行代码之中,例如下图所示,在数组下标为0,1,8的位置存入数据,其他位置都为空,那么数组元素就为三。按照第六行代码的拼接原理,应该是数组下标为2的进行拼接,但又因为是空(null)就会合成php类型的文件,从而产生了绕过方式
(该图转载自B站up主天欣skyx)
实验过程
上传一句话木马文件,并用burp进行抓包,保存名称可不做修改
先修改content-type为 image/jpeg
对这些部分进行修改,黄色标出的部分由复制得到。forward进行文件上传
可成功上传
获得url后使用蚁剑连接