文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。 所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
–验证文件类型、后缀名、大小;
–验证文件的上传方式;
–对文件进行一定复杂的重命名;
–不要暴露文件上传后的路径;
–等等…
Unsafe Fileupload 客户端检查(client check)
F12 检查“开始上传”
删除onchange
Unsafe Fileupload MIME type
实际上这个服务端检查只检查了 html包(大概这么叫吧)里的Content-Type 属性
在burp中修改属性值。
Unsafe Fileupload getimagesize()
这是PHP判断图片文件大小和文件类型的函数,它以16进制读取文件,从16进制的前几位判断文件类型,如文件开头是8950 4e47是png格式的开头。这个开头也就是我们一般所说的文件幻数。绕过get_imagesize()函数可以通过制作图片马绕过(windows下可以通过命令形如copy /b pic.png + shell.php picshell.png来制作图片马)。也可以在木马文件头部直接加上头部如GIF89A。
这个时候就有一个问题,如果上传的文件是图片,那插入的恶意代码怎么执行呢?直接访问后缀为png格式的文件返回就是图片。这个时候可以结合文件包含的组合拳来解析恶意代码。上传图片马拿到上传位置后,结合前面说到的文件包含漏洞即可验证此部分漏洞。
用010editor打开发现 之前写的test1.txt 中的 123456 已经写入到图片了(这也是最简单的图片隐写吧)
然后成功上传图片。