绕过黑名单检查实现文件上传2 ——合天网安实验室学习笔记
实验链接
文件上传指将客户端数据以文件形式封装,通过网络协议发送到服务器端。在服务器端解析数据,最终在服务端硬盘上作为真实的文件保存。了解文件上传漏洞产生的原因,掌握漏洞的利用方法。
链接:http://www.hetianlab.com/expc.do?ce=1ceb7937-0fb3-40e2-91b2-a4be1f83ec2b
同系列文章:绕过黑名单检查实现文件上传1
实验简介
实验所属系列: Web安全
实验对象: 本科/专科信息安全专业
相关课程及专业: 计算机基础、PHP、计算机网络
实验类别: 实践实验类
预备知识
-
文件上传漏洞简介
通常web站点会有用户注册功能,而当用户登录之后大多数情况下会存在类似头像上传、附件上传之类的功能,这些功能点往往存在上传验证方式不严格的安全缺陷,导致攻击者通过各种手段绕过验证,上传非法文件,这是在web渗透中非常关键的突破口。
-
文件上传漏洞危害
攻击者绕过上传验证机制上传恶意文件,通过上传的web后门获得整个web业务的控制权,复杂一点的情况是结合web服务器的解析漏洞来获取权限。
-
文件上传检测流程
通常一个文件以HTTP协议进行上传时,将以POST请求发送至web服务器,web服务器收到请求并同意后,用户与web服务器将建立连接,并传输数据。
-
解析漏洞
-
IIS6.0解析漏洞
目录解析:在网站下建立名为.asp、.asa的文件夹,其目录内任何扩展名的文件都会被IIS当作asp文件来解析并执行,如创建目录aa.jsp,那么/xx.asp/xx.jpg会被解析成ASP脚本来执行;
文件解析:在IIS6.0下,分号后面的不被解析,也就是说aa.asp;.jpg会被服务器当成aa.asp文件来执行;
IIS6.0默认的可执行文件除了asp还包括asa、cer和cdx
-
IIS7.0/Nginx<8.0.3畸形解析漏洞
在默认开启Fast-CGI情况下,攻击者上传一个内容为<?PHP fputs(fopen('shell.php','w'),'<?phpeval($_POST[cmd])?>’);?>的jpg文件,然后访问xx.jpg/x.php,在这个目录下就会生成一句话木马shell.php
-
Apache解析漏洞
Apache是从右往左开始判断解析,如果为不可识别解析再往左判断,如aa.php.owf.rar文件,Apache不可识别解析‘.owf’和‘.rar’这两种后缀,会解析成.php文件。
-
-
实验室关于解析漏洞的实验
-
Apache解析漏洞
-
IIS解析漏洞在fckEditor上传攻击中的利用
-
Nginx解析安全与实战测试
-
实验目的
通过该实验了解文件上传漏洞的基础知识及如何绕过黑名单检测上传恶意文件。
实验环境
操作系统:
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
实验步骤
步骤一
任务描述:利用Windows特性,通过::$DATA绕过实现文件上传。
Windows机器下载源码文件到phpStudy的WWW目录下,在源码文件里创建一个名为upload的文件夹:
PHP版本切换至5.2.17,开启phpStudy;
写一个简单的一句话木马eval.php:
Kali机器浏览器访问http://10.1.1.100/upload-labs/index.php,选择Pass-08,点击右上角‘显示源码’,通过源码提示进行文件上传:
发现没有对后缀名进行去‘::DATA,当我们访问aa.asp::DATA’,绕过对黑名单的检测。
上传eval.php并使用burpsuite抓包,修改后缀名为.php::$DATA,点击‘go’之后查看响应内容:
成功上传文件到upload文件夹下。
Windows文件流特性绕过,上传成功后实际保存的文件名是202003092029414864.php。
使用菜刀连接webshell:
输入webshell地址http://10.1.1.100/upload-labs/upload/202003092029414864.php:
在后面的post数据输入框里输入:test=phpinfo();
点击post数据输入框后面的提交键,即可连接webshell:
步骤二
任务描述:配合解析漏洞,构造‘点+空格+点’的形式实现文件上传。
选择Pass-09,通过源码提示进行文件上传:
还是黑名单过滤,注意第15行和之前不太一样,路径拼接的是处理后的文件名,直接上传.php、.php+点、.php+空都会被当成黑名单过滤掉,因为源代码做了删除文件名末尾的点和首尾去空处理。可以配合解析漏洞,构造‘点+空格+点’的形式,绕过黑名单的检测上传恶意文件。
上传eval.php并使用burpsuite抓包,修改后缀名为.php. .(点+空格+点):
文经过处理后,会解析成eval.php.。
点击‘go’之后查看响应内容:
成功上传文件至upload文件夹,而Windows系统存在文件名特性,最终保存的文件名为eval.php。
通过菜刀连接webshell:
此处的‘test’即为@eval($_POST[‘test’]);中的‘test’;点击‘添加’:
菜刀连接成功。
步骤三
任务描述:双后缀名绕过实现文件上传。
选择Pass-10,点击右上方‘显示源码’,根据源码提示进行文件上传:
依然是黑名单限制,注意到这里将问题后缀名替换为空,我们可以利用双写绕过,进行恶意文件的上传。
上传eval.php并使用burpsuite抓包,修改后缀名为pphphp,点击‘go’之后查看文件是否上传成功:
成功上传一句话木马文件。
菜刀连接webshell:
连接成功。
漏洞修复
-
将上传的目录设置为不可执行;
-
判断文件类型:结合MIME Type、后缀检查等方式,推荐文件类型检查使用白名单的方式;
-
使用随机数改写文件名和文件路径。