危害:可能直接 getshell

产生原因:一般是过滤不严谨。

对正常上传点递脚本,直接获取控制权限,或者上传一个 HTML 页面将链接发给用户进行钓鱼,用户一看 URL 是官方就放松警惕。

组合拳:文件上传+中间件解析

练习

GitHub - c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场

1.前端js验证
在浏览器关掉JS

CheckFile.png

closeJS.JPG

这种方法比较好用,还有个地方可以让它不执行JS脚本,它是提交表单是调用这个方法我们可以双击把这双引号内内容删掉,就不会触发检测了。

elements.png

也可以在本地写一个HTML表单进行提交。

2.文件MIME验证

他的验证方式是mime方式,只有匹配上了才放你通过。

MimeSourceCode.png

我们将原来的mimeContent-Type: application/octet-stream改为图片的mime就可以绕过了。

MIME

3.文件后缀验证

它这里黑名单验证,会把名字转换为小写并重新用时间+随机值命名,文件后缀无法加空格绕过。

ExtendFormat.JPG

尝试过:pht、phpt、phtml、php3、php4、php5、php6,都不解析。可能跟我的php版本有关,此时用的是5.6.27。大小写会被转换。

其他方法:

  • 验证文件内容或后缀可以上传图片一句话,制作图片马—>将shell追加到图片中去(Linux)
  • %00截断version<5.3.7
  • 中间件解析漏洞
  • 编辑器漏洞

在实战中会遇到各种奇怪的情景,这里提供一个实际场景,有一个上传点只能 Upload DLL 文件,代码直接读取文件名来决定文件存储位置,这时候你如何利用?

防御:

  1. 在服务端采用白名单校验检查扩展名与MIME。
  2. 校验图片文件头来判断是否为为真的图片。
  3. 对传过来的图片采用伪随机数命名(一般采用时间戳+伪随机数),不返回上传后的路径,就算上传成功也无法找到Shell,要是头像这种在模板上会显示这种情况也没办法。
  4. 如果是PHP可以用GD库对图片二次处理(其他语言也有对应图片处理库),就算你上传脚本渲染后图片中代码会被破坏掉无法正常解析。
  5. 限制上传文件大小,以避免服务器资源耗尽(最低成本DDOS)。
  6. 在中间件限制上传目录执行脚本权限。
  7. 可以将放置图片单独放在一台服务器,脚本在图片服务器上执行没有环境不能被解析。实在又没钱买服务器可以停掉图片目录的执行权限(未测试)。

标签: none

讨论讨论讨论!