一、文件上传漏洞介绍文件上传是由于程序员未对上传的文件做严格的校验和过滤然后导致用户可以越过其本身的权限来向服务器上传一个可以执行的动态脚本文件常见的文件上传由上传图片上传附件上传头像等如果说过滤不严格恶意用户利用文件上传漏洞上传有害的可以执行脚本文件到服务器中上传webshell可以获取服务器的权限或进一步危害服务器二、文件上传漏洞的危害通过一个非法上传的恶意文件例如上传一个webshell上传 webshell 后门 很方便地查看服务器信息查看目录执行系统命令三、文件上传漏洞的原理核心原因在于服务器对用户上传的文件处理不当未能进行充分、有效的安全验证和限制四、webshell写法我们通过文件上传漏洞上传一个webshell来获取服务器的信息查看目录执行命令等操作那webshell如何去写常见的就是一句话木马例如script languagephpEval($_POST[a]);/script我们来分析一下这个木马它是利用早期PHP支持的特殊标签格式进行伪装其核心是利用eval()函数执行通过POST请求传入的任意代码从而实现远程控制服务器的目的。其中eval()函数这是PHP中一个极其强大但也极其危险的函数。它的作用是将传入的字符串作为PHP代码来执行。攻击者通过控制这个字符串的内容就可以在服务器上执行任意PHP代码$_POST[a]超全局变量这是PHP用于接收HTTP POST请求中名为a的表单数据或参数的变量。这意味着攻击者可以通过向包含这段木马的网页发送一个HTTP POST请求并在请求体中携带一个名为a的参数例如aecho hello world;或asystem(whoami);来控制eval()函数实际执行的代码内容一句话木马的核心原理利用服务器端语言执行动态传入的代码操作步骤我们通过burp抓包后通过修改文件的后缀名例如.php,.phtml等将一句话木马插入数据包中点击sent然后渲染一下发现上传成功在本地浏览器查看一下这个文件发现文件是自己插入的文字或者php界面那就是上传成功了然后打开webshell管理工具打开蚁剑添加这个文件地址例如ip/upload/1.php然后我们尝试连接如果连接成功那么我们就可以通过蚁剑来获取对方文件目录在上面执行命令操作然而我们实际操作练习当中会有不同的情况那么webshell就会变得多样有着不同的写法第一种情况后缀名限制与绕过可以使用大小写绕过例如Php尝试特殊后缀.phtml,.phar,.php3,.php4,.php5等历史遗留后缀如果服务器配置允许解析它们为PHP。或者尝试双写和重复后缀尝试file.php.jpg或file.php.php如果服务器仅检查最后一个后缀或存在逻辑漏洞尝试其他脚本语言如果服务器支持ASP、JSP等编写相应语言的Webshell第二种情况内容类型 (MIME Type) 检查服务器检查上传头部的文件类型Content-Type或者image/jpegWebshell 编写方法伪造MIME类型在Burp Suite等工具中拦截上传请求将Content-Type修改为允许的类型如image/jpeg即使文件内容实际是PHP代码编写图片马将Webshell代码嵌入到真实的图片文件中使用文件拼接方式生成一个新文件文件头部是图片数据尾部是PHP代码。如果服务器只检查文件头部的魔数Magic Bytes可能被当作图片接受但当访问该文件时尾部的PHP代码会被执行第三种情况文件内容检测服务器不仅检查后缀和MIME还会扫描文件内容是否包含危险关键词如?php,eval,system1、我们可以进行代码混淆:使用base64_decode包裹执行代码2、十六进制编码:直接拼接十六进制字符串3、字符串拼接/反转/异或将敏感函数名或关键词拆分成多个部分在运行时拼接或运算还原4、利用动态函数调用如$_GET[f]($_GET[c]);通过参数传递函数名和命令第四种情况文件重命名服务器在上传后自动重命名文件如使用时间戳随机数用户无法控制最终文件名条件竞争如果上传后文件会短暂保留原始名或者重命名操作不是原子的可以编写脚本快速、连续地访问上传目录下的潜在文件名如shell.php,upload.php在文件被重命名或删除前执行它路径/文件名注入尝试在文件名中包含目录遍历字符如../或特殊字符试图控制文件保存的部分路径或影响重命名逻辑较少成功利用文件包含如果存在另一个文件包含漏洞如LFI并且知道上传文件的存储路径模式可以尝试结合文件包含来执行被重命名的Webshell文件第五种情况文件大小限制服务器限制了上传文件的最大尺寸编写极其精简的Webshell最经典的是一句话木马?php eval($_POST[cmd]);?或更短的?$_GET[1]?通过 ?1whoami 执行命令我们需要注意环境适应性方法是否成功高度依赖于目标服务器配置PHP版本、模块、中间件、权限五、文件上传的防御思路防御的核心就是在服务器端实施严格、多层、互补的安全检查1、使用白名单限制允许上传的文件扩展名。 (比黑名单更可靠)2、在服务器端检查文件真实的类型Magic Number / 文件头。3、对文件内容进行检测或过滤如检查图片是否包含恶意代码。4、对上传的文件进行重命名使用随机字符串。5、对图片等文件进行二次渲染最彻底但成本较高。6、限制上传文件的大小。7、及时更新服务器软件修复已知的解析漏洞六、修复方案在网站中需要存在上传模块需要做好权限认证不能让匿名用户可访问。文件上传目录设置为禁止脚本文件执行。这样设置即使被上传后门的动态脚本也不能解析导致攻击者放弃这个攻击途径设置上传白名单白名单只允许图片上传如除了jpg png gif 其他文件均不允许上传上传的后缀名一定要设置成图片格式如 jpg png gif