asp 检测更改后缀的图片_原创干货 | File Upload关于图片马的思考

4172781eff3a717eec4dd836705ca1d3.png

点击关注了解更多精彩内容!!

030bdfc0f47cd607a6374efc9940ad15.png相关背景 030bdfc0f47cd607a6374efc9940ad15.png 在一次Java代码审计中,发现某业务系统进行文件上传业务时,使用了如下的方式进行文件上传的后缀检查: 3be56fd021bad8823c59b33233a6d4b4.png

917d1eac4081b322e7d5445e3ca942ce.png

其中FileTypeUtil是hutool(Hutool是一个小而全的Java工具类库 )下的一个工具类,通过其FileTypeUtil.getType()方法获取到当前上传文件的后缀,然后进行后缀检查,若非图片类型则认为恶意上传操作。 030bdfc0f47cd607a6374efc9940ad15.png相关分析 030bdfc0f47cd607a6374efc9940ad15.png 一般来说常见的后缀名检查都是直接获取当前上传文件名,然后字符串截取对应的后缀进行比对检查。这里直接通过一个File对象即可获取,那么到底Hutool的FileTypeUtil的getType方法底层实现是怎样的,有没有可能存在不完善的机制呢,这里下载了一个Hutool的jar进行查看:

4ba22a72df8026f8978d83129ef6b233.png

直接定位FileTypeUtil的getType方法: 可以看到重载了多个getType函数,分别可以传入的参数类型为String、InputStream和File: 3f9e580c4c0df0f3d94380a66160d38c.png 查看第一个函数: 47ee1233d148775e12a167e003a9845b.png 主要将fileStreamHexHead是与fileTypeMap里的内容进行比对,fileTypeMap的内容如下: 064e73174eaa8b536d5a3b3556a2baad.png

也就是说,这个类是通过读取文件流中前N个byte值来判断文件类型,在类中我们通过Map形式将常用的文件类型做了映射,例如常用的图片、音频、视频、Office文档类型。既然是通过文件流中的前N个byte值来判断,考虑保留对应的字节内容后再加入Webshell的内容,然后在上传时成功获取到对应的byte值并且成功认为恶意的文件为图片,并且上传成功,即可绕过防御。

这里搭建一个简易的环境进行漏洞验证,简单的检测代码如下: 36bc7d85634492ec301c9a6042169317.png

同样的还是使用Hutool的FileTypeUtil的getType方法获取当前上传的文件后缀,然后进行合法性检测。

当前的效果如下: 02451698b4e39c9de2d4feb8631b8de2.png 上传恶意的jsp文件的话是拒绝上传的: b372ea5e93bf4ff421a187c7300489a2.png 因为是通过读取文件流中前N个byte值来判断文件类型,所以这里我们尝试把一张图片的后缀改成jsp也是可以上传的: c10f4600b9baf048b2c79593d0b19bad.png 那么可否绕过对应的检测机制,上传我们恶意的jsp文件呢?

这里只需要在上传文件的字节流的头部,写入对应的hex值,即可绕过对应的安全检测了,这里以bmp的hex头为例,直接在burp我们的webshell中写入对应的bmp的hex头:

e104b6cfda767da9e816016d511c65a2.png 再次重放我们的数据包,成功绕过安全检测上传webshell: d39cbacf1f25eba7311d4ad3e314159e.png 尝试访问webshell,也是可以成功解析的:

e26d6c7ff57bb10004817fa6069029c2.png

030bdfc0f47cd607a6374efc9940ad15.png拓展 030bdfc0f47cd607a6374efc9940ad15.png 除了上述场景以外,还见过不检查文件后缀,直接通过生成文件的Image对象,判断Image对象是否为null、Image对象的属性(例如像素、图片的长宽)合法性进行判断,样例代码如下: f5f32699dad7dd15f4b4cdf27adad112.png 有趣的是ImageIO.read方法的实现也是通过读取文件流中前N个byte值来进行判断的,那么可以同样可以考虑保留对应的字节内容后再加入Webshell的内容,然后在上传时成功获取到对应的元素属性,并且上传成功(这里是图片的长宽),即可绕过防御。 同样的这里也搭建环境进行尝试,正常情况上传jsp文件返回如下: 753781384a96f0ee679849d5ad881458.png 以bmp文件为例,先找一个bmp图片查看它的文件内容: 图像的部分信息如下,按照刚刚的思路,我们要找到对应元素属性的位置(这里是图片的宽和高): e1a891f2995fdcb1791149e6ea945774.png 首先是bmp头,既然要得到对应的元素属性,那么肯定要知道该文件是什么样的文件类型,所以bmp头也 很重要: 41a48b6d520d39b9d0c440d1140d727b.png 以下数据就是bmp文件头: 46fdca0279085a4ab978c05fec2ec2fa.png 以小端字节序来解读: 72902e1479db5b0276e51e11a3fd0b0d.png 再往下就是我们关键的元素信息了(图片宽、高),也就是位图信息头: b1e263e844da61f3959d441492852834.png 到这里就得到我们绕过的关键信息了,同样的以小端字节序来解读: e511fe06df1d173e4a5c96a6b8040a35.png 7d2036eeeb532f0cc469fd8baf5bb563.png 到这里就可以进行绕过的图片码的制作了: 保留想要的关键信息,以特定的方式写Webshell: e9073cd82c8479cfdb78859c3fcd103c.png 成功上传webshell: 5f5ee005602dc5dffff03e19c306c952.png 在后台也可以看到当前上传的jsp文件是可以获取到图片的“宽”和“高”的:

9f54023ffcfd3853eb19c14041b6f8eb.png

030bdfc0f47cd607a6374efc9940ad15.png思考 030bdfc0f47cd607a6374efc9940ad15.png

在文件上传时,有时候我们需要判断文件类型。可能在系统开发阶段已经考虑到了图片马的上传,于是我们需要在服务端通过读取文件的首部几个二进制位来判断常用的文件类型,但是并不是说这种方式就万无一失了,反而最简单的后缀名截断,检查在特定的场景更好用。所以在开发阶段还是应该多种方式结合,例如白名单、图片二次渲染等。

同时很多现有的api,在进行调用的时候也应该看看具体的底层实现,避免潜在的风险。 原创文章未经授权禁止转载,谢谢合作 70b42b06729fcee35b828e6f59d408fc.gif● 云众可信征稿进行时● 原创干货 | windows反弹shell小结● 原创干货 | 常见网络转发、代理工具的使用● 原创干货 | 【工具分享】AssetScan内网脆弱面分析工具

·END·

云众可信

原创·干货·一起玩

0af4310b9dfdfe0cbe4f35b2eb6bbaf0.png

微信号:yunzhongkexin好看的人才能点 1873791c1bb55f90ed552eb38b6bddc8.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值