文件上传指将客户端数据以文件形式封装,通过网络协议发送到服务器端。在服务器端解析数据,最终在服务端硬盘上作为真实的文件保存。了解文件上传漏洞产生的原因,掌握漏洞的利用方法。
链接:http://www.hetianlab.com/expc.do?ce=1d02daa2-881f-4102-83de-629637072914
同系列文章:绕过黑名单检查实现文件上传2
实验所属系列: Web安全
实验对象: 本科/专科信息安全专业
相关课程及专业: 计算机基础、PHP、计算机网络
实验类别: 实践实验类
文件上传漏洞简介
通常web站点会有用户注册功能,而当用户登录之后大多数情况下会存在类似头像上传、附件上传之类的功能,这些功能点往往存在上传验证方式不严格的安全缺陷,导致攻击者通过各种手段绕过验证,上传非法文件,这是在web渗透中非常关键的突破口。
文件上传漏洞危害
攻击者绕过上传验证机制上传恶意文件,通过上传的web后门获得整个web业务的控制权,复杂一点的情况是结合web服务器的解析漏洞来获取权限。
文件上传检测流程
通常一个文件以HTTP协议进行上传时,将以POST请求发送至web服务器,web服务器收到请求并同意后,用户与web服务器将建立连接,并传输数据。
实验目的
通过该实验了解文件上传漏洞的基础知识及演示实践。
操作系统:
Windows10:部署文件上传漏洞环境及漏洞利用;ip:10.1.1.100
辅助工具:phpStudy、Mozilla Firefox、burpsuite、菜刀
源码与工具请在实验机内下载使用:http://tools.hetianlab.com/tools/T044.zip(包里有菜刀,为避免误杀下载前请先关闭defender)
关闭defender步骤:在桌面搜索栏搜关键字 defender-> 设置-> 实时保护(关闭)即可
本次实验采用github开源项目upload-labs靶场,项目地址:https://github.com/c0ny1/upload-labs
任务描述:后缀大小写绕过实现文件上传。
下载源码文件到phpStudy的WWW目录下,在源码文件里创建一个名为upload的文件夹:
PHP版本切换至5.2.17,开启phpStudy;
浏览器访问http://10.1.1.100/upload-labs/index.php,选择Pass-05,点击右上角‘显示源码’,通过源码提示进行文件上传:
可以看出此处对后缀名为. php的文件做了限制,但是没有将后缀进行大小写统一,我们可以通过大小写绕过上传恶意文件。
在桌面写一个简单的一句话木马eval.php:
上传eval.php并用burpsuite抓包,将文件后缀改为.phP,点击‘go’之后在Response处查看响应内容:
burpsuite不会使用的同学可参考我上一篇笔记:burp暴力破解
可以看到文件已经成功上传,但是文件名已经变成了202003081530079359.phP。一些网站会对上传的文件进行文件名随机修改,以防攻击者通过原文件连接webshell,如果不通过burpsuite抓包检测很难发现这一点。
Firefox浏览器访问脚本http://10.1.1.100/upload-labs/upload/202003081530079359.phP,并开启post data:
没有找到HackBar,也是醉了。。。。
尝试用步骤二的方法连接webshell:
成功连接webshell。
任务描述:空格绕过实现文件上传。
选择Pass-06,点击右上角‘显示源码’,通过源码提示进行文件上传:
发现还是黑名单检测,但是没有对后缀名进行去空处理,可以通过在后缀名后加空进行绕过。
还是上传之前的PHP一句话木马eval.php并用burpsuite抓包,将文件后缀改为.php+空格,点击‘go’:
此时文件名变为202003081549408284.php
利用菜刀进行webshell连接:
burpsuite不会使用的同学可参考我上一篇笔记:文件上传漏洞
点这个‘+’号;
输入webshell地址:http://10.1.1.100/upload-labs/upload/202003081549408284.php
在后面那个小框框即post数据输入框里输入:test=phpinfo();
点击post数据输入框后面的提交键,即可连接webshell:
连接成功。
任务描述:利用Windows系统的文件名特性,通过点绕过实现文件上传。
选择Pass-07,通过查看源码可以发现没有对后缀名进行去‘.’处理,利用Windows系统的文件名特性,会自动去掉后缀名最后的‘.’,通过在文件名后加‘.’进行绕过。
上传eval.php并用burpsuite抓包,将文件名改为‘eval.php.’:
点击‘go’之后在Response处查看响应内容:
虽然在burpsuite里看到的是.php.文件,但是在Windows里保存的会是.php文件。
通过菜刀连接:
此处的‘test’即为@eval($_POST[‘test’]);中的‘test’,脚本类型选择PHP,点击‘添加’:
成功通过菜刀连接。
将上传的目录设置为不可执行;
判断文件类型:结合MIME Type、后缀检查等方式,推荐文件类型检查使用白名单的方式;
使用随机数改写文件名和文件路径。