靶场下载地址:
https://github.com/c0ny1/upload-labs
靶场介绍
upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共21关,每一关都包含着不同上传方式。
pass-01(前端验证)
绕过原理
Web应用系统虽然对用户上传的文件进行了校验,但是校验是通过前端javascript代码完成的。由于不法分子可以对前端javascript进行修改或者是通过抓包软件篡改上传的文件,就会导致基于js的校验很容易被绕过。
源代码解析
查看源代码,发现这是一段前端验证,定义了一个名为checkFile()的函数,用于验证文件上传字,只允许上传的文件类型只有 .jpg、.png、.gif
。
这一关一共有四个方法。
方法一:禁用JS
右键选择 检查>调试器>禁用JS
:
上传一个php文件,发现上传成功:
或者上传一句话木马,使用蚁剑连接:
查看upload目录下的upload目录,看是否有上传的文件
phpinfo.php 文件内容:
<?php phpinfo(); @eval($_POST['root']); ?>
shell.php 蚁剑一句话木马:
<?php eval($_REQUEST[root])?>
方法二:删除checkFile()函数
将checkFile()函数删除,即可上传文件:
方法三:增加.php
在源代码中增加.php,即可成功上传:
方法四:burp抓包修改后缀
将需要上传的文件后缀名修改为合法名,使用burp抓包后将后缀名修改回.php,即可成功上传:
前端验证的危害
前端验证是一种在用户输入数据提交到服务器之前,在客户端进行的验证机制。虽然前端验证有一些限制和潜在的危害,但它仍然是非常重要的。下面是一些前端验证可能面临的危害和注意事项:
安全性:前端验证只是一种辅助手段,并不能完全防止恶意用户绕过验证发送恶意数据到服务器。因此,在进行重要操作或敏感数据交互时,后端验证仍然是必不可少的。
可信度:前端验证是由客户端执行的,而客户端代码是可以被用户修改或篡改的。因此,不应该仅依赖前端验证来保证数据的完整性和一致性。
用户体验:过于严格的前端验证可能会给用户带来困惑和不便,因为它们可能会剥夺用户合理的输入选择。因此,在设计前端验证时,需要权衡安全性和用户友好性之间的平衡。
验证代码的维护:前端验证通常是在多个页面或组件中使用的,如果验证逻辑需要更新或修复,可能需要在多个地方进行修改,这可能增加维护的工作量。
总的来说,前端验证在提高用户体验和减少无效数据提交方面发挥了重要作用。但为了确保数据的安全性和完整性,前端验证应与后端验证结合使用,并且不能依赖于前端验证的结果,而应在服务器端对输入数据进行严格的验证和验证。
如何防止前端验证绕过
后端验证:始终对从客户端提交的数据进行后端验证。前端验证只是额外的一道防线,不应该依赖于它来保证数据的完整性和安全性。后端验证可以在接收到数据后,对其进行更详细和严格的验证,并对潜在的安全漏洞进行处理。
- 输入过滤和转义:在后端验证的过程中,可以使用安全的输入过滤和转义来处理用户输入。这可以防止恶意内容被注入到应用程序中,从而保护应用程序和用户的安全。
- 授权和身份验证:考虑使用授权和身份验证来限制用户对敏感操作或数据的访问。这可以确保只有经过身份验证的用户才能执行某些操作,并且只有具有适当权限的用户才能访问敏感数据。
- 安全开发实践:在应用程序的开发过程中,始终遵循安全开发实践和最佳原则。这包括对代码进行安全审查、使用最新的安全库和框架、定期更新和修复安全漏洞等。
- 教育用户:教育用户在使用应用程序时要注意安全性,例如避免点击可疑链接、不共享敏感信息等。提供应用程序的用户培训可以帮助他们了解潜在的风险,并采取适当的预防措施。
通过结合这些措施,可以提高应用程序的整体安全性,减少前端验证的风险,并从多个层面来保护应用程序和用户的安全。
pass-02(MIME验证)
源代码解析
查看源代码:
发现代码中使用如下条件语句检查文件的MIME类型是否为合法的图片类型:
if (($_FILES['upload_file']['type'] == 'image/jpeg') ||
($_FILES['upload_file']['type'] == 'image/png') ||
($_FILES['upload_file']['type'] == 'image/gif'))
这个条件语句检查$_FILES['upload_file']['type']的值是否等于image/jpeg、image/png或image/gif,这些值代表了允许上传的文件类型。
如果文件的MIME类型符合要求,则执行相应的操作,例如将临时文件移动到最终的图片路径等。
如果文件的MIME类型不符合要求,则会给$msg变量赋值错误消息,指示文件类型不正确。
绕过原理
部分Web应用系统判定文件类型是通过content-type字段,不法分子可以通过抓包,将content-type字段改为常见的图片类型,如image/gif,从而绕过校验。
burp抓包修改content-typr
上传一个合法文件,使用burp进行抓包,content-type显示image/jpg:
再上传.php文件,同样使用burp进行抓包,发现 content-type显示的是application/octet-stream:
将application/octet-stream修改为image/png,即可上传文件:
如何防止MIME绕过
验证文件的真实类型:不仅仅依靠上传请求中的MIME类型来验证文件类型,同时还需要对文件进行额外的检查,例如使用服务器端工具或库来验证文件的真实类型。
- 使用白名单:只允许上传特定的受信任文件类型,而不是依赖黑名单的方式来禁止某些文件类型。这样可以确保只有明确允许的文件类型被上传。
- 限制文件扩展名:不仅根据文件扩展名来验证文件类型,而是根据文件内容或其他可靠方法来确定文件类型。
- 对上传的文件进行严格处理:在服务器端对上传文件进行进一步的验证和过滤,例如检查文件内容是否符合预期的文件类型以及是否包含恶意内容。
通过结合这些措施,可以增加服务器端对上传文件类型的验证的可靠性,提高应用程序的安全性,从而防止MIME绕过攻击。