首页> 中国专利> 一种基于不可执行目录的文件上传方法、系统和介质

一种基于不可执行目录的文件上传方法、系统和介质

摘要

本公开提供一种基于不可执行目录的文件上传方法、系统和介质。所述方法包括:步骤S1、基于提取的网站根目录,生成不可执行目录;步骤S2、从网站的源代码中确定第一代码,所述第一代码为所述网站对上传文件进行存储的代码;以及步骤S3、将所述第一代码改写为第二代码,所述第二代码为将所述上传文件保存到所述不可执行目录的代码。该方法通过创建不可执行目录、定位存储上传文件的代码、改写上传文件的存放路径为不可执行目录,来防御文件上传漏洞。

著录项

  • 公开/公告号CN112733157A

    专利类型发明专利

  • 公开/公告日2021-04-30

    原文格式PDF

  • 申请/专利权人 中国人民解放军国防科技大学;

    申请/专利号CN202110353219.X

  • 申请日2021-04-01

  • 分类号G06F21/57(20130101);G06F21/54(20130101);H04L29/06(20060101);H04L29/08(20060101);

  • 代理机构11215 中国和平利用军工技术协会专利中心;

  • 代理人刘光德

  • 地址 410073 湖南省长沙市开福区德雅路109号

  • 入库时间 2023-06-19 10:48:02

说明书

技术领域

本公开涉及文件上传领域,尤其是涉及一种基于不可执行目录的文件上传方法、系统和介质。

背景技术

如今,高速发展的互联网已经深入社会生活的各个方面,从根本上改变了人们的生活方式。人们的生活早已离不开网络,对网络安全也越发重视。虽然人们愈发重视网络安全,但随着移动互联网,人工智能,云计算,人工智能等新一代信息技术的快速发展,围绕着网络的服务和应用呈现出爆发式的增长,暴露出越来越多的网络安全问题,给我国的互联网发展和治理带来巨大的挑战。

文件上传功能为网站应用的一项常见功能,因为对于用户,不仅仅满足于接收到服务器提供的服务,更希望通过文件上传功能定制自己的个人空间(例如:上传视频,头像,文档等等各类型的文件)。但是文件上传功能为用户带来便利的同时,也带来了严重的网络安全隐患。黑客利用正常的“文件上传”功能上传将恶意代码植入到服务器中,即上传Webshell(Webshell为可供黑客获取任意代码执行权限的恶意代码,又称为被黑客用于对网站服务器操作的后门, Webshell可以由多种语言编写而成,如PHP,ASP,ASP.NET,JAVA,PERL,CFM,PYTHON,C等等)到服务器中,之后通过访问Webshell实现任意代码执行,达成入侵网站的目的。

国家计算机网络应急技术处理协调中心在2020年4月发布的《2019年我国互联网网络安全态势综述》中指出,在2019年我国有约8.5万个网站被植入后门,同比增长超过2.59倍。而在深信服千里目实验室发布的《2019年网络安全态势报告》中,批露了2019年黑客尝试攻击类型占比,除去占比46%的“网站扫描”这一类攻击,Webshell上传占比高达11.1%。可见,植入后门,上传Webshell是威胁网络安全的一类重要攻击手段,而文件上传漏洞则是与上传Webshell密切相关的漏洞,黑客利用文件上传漏洞上传Webshell。

文件上传漏洞成功利用条件主要有四个:(1)存在文件上传点;(2)能够上传可执行的脚本文件(比如上传PHP文件到PHP环境);(3)能够获取上传后文件的保存地址;(4)文件保存的目录需要可执行权限;需要满足以上四个条件才可以成功利用该漏洞。

目前,防御文件上传漏洞的方案有三类,一类是基于源码的文件上传漏洞检测方案,一类是基于源码的安全开发指南,一类是通过插件的方法对上传的文件内容进行检测拦截。下面将一一阐述现有的三类方案。

第一类方案是基于源码的文件上传漏洞检测方案,此类方案一般形成漏洞扫描器,通过对网站源码的扫描,根据文件上传漏洞的代码特征,发现其中可能存在的文件上传漏洞,并报告给开发者,开发者根据扫描器给出的信息进行排查。典型实现有:Seay源代码审计系统,RIPS源代码审计系统,UChecker等等。如图1a所示,第一类方案根据文件上传漏洞特征对源码进行扫描,返回可能存在的漏洞点,形成一个漏洞报告,最后用户根据漏洞报告进行漏洞验证。

第一类方案虽然被广大web安全研究员接受和使用,多用于进行漏洞挖掘,可以有效找出可能存在的漏洞点。但是该方案主要存在两点问题,第一个问题是此类方案只能提供可能存在的漏洞点,且误报率较高,比如认为10处可能有漏洞,但实际上只有1处存在漏洞,或根本不存在漏洞。第二个问题是此类方案需要随着程序开发技术或代码的发展,更新扫描规则,且扫描规则一般只能覆盖已发现的文件上传漏洞模式,不能通过该方案防御未知的文件上传漏洞模式。

第二类方案是基于源码的安全开发指南,此类方案根据常见的文件上传绕过限制方法,给出程序员安全开发出无文件上传漏洞代码的指南,比如在检查上传的文件内容的时候,进行文件扩展名的白名单检查,进行MIME类型的检查,进行上传路径的检查,进行文件内容的检查。此类方案是现有技术中研究较多的方案。如图1b所示,第二类方案对上传文件的内容进行检查,主要是根据接收到的上传文件数据包进行检查,分别进行Conteent-Type,文件后缀名,文件头,文件内容和文件保存路径的合法性检查,如果其中有一项不满足,则拒绝该文件的上传请求。

第二类方案也被广大web安全研究员接受和使用,多用于进行网站开发,可以防御大部分文件上传漏洞。但是该方案与第一类方案一致,无法防御未知的文件上传漏洞模式。因为一个网站是由由多个组件共同组成,虽然根据本类方案对文件的各项内容进行了详细的检查,但由于其他组件出现了漏洞,可以导致绕过检查,导致漏洞出现。比如部分网站会使用一些知名WAF,导致自己编写的上传文件检查代码被WAF直接取代,而WAF又出现了漏洞,最终导致黑客成功绕过防御,达成入侵网站的目标。另外,开发者为检查文件上传内容编写的代码,由于需要检查的内容过多,也极容易出现逻辑漏洞,可被黑客绕过防御。

第三类方案是通过插件的方法对上传的文件内容进行检测拦截。此类方案较少,一般是要求访问网站的用户在使用文件上传功能前必须安装由网站发布的安全文件上传功能插件。另外一种类似的实现是在服务器运行一个监控程序,随时监控网站目录下文件的变化情况,监控是否有新的可执行脚本文件生成,但没有拦截和检测文件内容功能。如图1c所示,第三类方案在接收到用户文件上传请求后,会检查用户是否使用了文件上传安全插件,如果没有则要求用户安装插件后进行文件上传。该插件接受到用户文件上传请求后,会进行与第二类方案一样的上传文件内容检查,最后解析执行用户的文件上传请求,其核心方法本质上与第二类方案一致。

第三类方案一般很少被使用。主要存在两个问题,第一个问题是让用户安装插件来实现文件上传漏洞的防御对用户十分不友好,少有网站会使用该方法。第二个问题与前两类方法一致,没有办法防御未知文件上传漏洞模式,也容易出现逻辑漏洞,从而被绕过防御。

发明内容

本公开提供了一种基于不可执行目录的文件上传方案,以解决上述技术问题。该方案通过创建不可执行目录、定位存储上传文件的代码、改写上传文件的存放路径为不可执行目录,阻止webshell执行,从而达成防御文件上传漏洞的效果。

本公开第一方面提供了一种基于不可执行目录的文件上传方法,所述方法包括:步骤S1、基于提取的网站根目录,生成不可执行目录;步骤S2、从网站的源代码中确定第一代码,所述第一代码为所述网站对上传文件进行存储的代码;以及步骤S3、将所述第一代码改写为第二代码,所述第二代码为将所述上传文件保存到所述不可执行目录的代码。

具体地,在所述步骤S2中:利用预先设定的文件上传点标准特征库,对所述源代码进行扫描,以获取所述网站的文件上传点;基于所述文件上传点,利用预先设定的代码点标准特征库,确定所述网站存储所述上传文件的代码点;以及从所述代码点提取所述第一代码。

具体地,在所述步骤S3中:利用预先设定的代码模式集,确定所述第一代码为已知代码;从所述预先设定的代码模式集中确定与所述第一代码对应的代码模式;以及利用所述代码模式改写所述第一代码。

具体地,在所述步骤S3中:利用预先设定的代码模式集,确定所述第一代码为未知代码;由用户改写所述第一代码;以及提取所述第一代码的代码特征,将所述代码特征作为新的代码模式存储至所述预先设定的代码模式集。

本公开第二方面提供了一种基于不可执行目录的文件上传系统,所述系统包括:生成模块,被配置为,基于提取的网站根目录,生成不可执行目录;确定模块,被配置为,从网站的源代码中确定第一代码,所述第一代码为所述网站对上传文件进行存储的代码;以及改写模块,被配置为,将所述第一代码改写为第二代码,所述第二代码为将所述上传文件保存到所述不可执行目录的代码。

具体地,所述确定模块具体被配置为:利用预先设定的文件上传点标准特征库,对所述源代码进行扫描,以获取所述网站的文件上传点;基于所述文件上传点,利用预先设定的代码点标准特征库,确定所述网站存储所述上传文件的代码点;以及从所述代码点提取所述第一代码。

具体地,所述改写模块具体被配置为:利用预先设定的代码模式集,确定所述第一代码为已知代码;从所述预先设定的代码模式集中确定与所述第一代码对应的代码模式;以及利用所述代码模式改写所述第一代码。

具体地,所述改写模块具体被配置为:利用预先设定的代码模式集,确定所述第一代码为未知代码;由用户改写所述第一代码;以及提取所述第一代码的代码特征,将所述代码特征作为新的代码模式存储至所述预先设定的代码模式集。

本公开第三方面提供了一种存储有指令的非暂时性计算机可读介质,当所述指令由处理器执行时,执行根据本公开第一方面的基于不可执行目录的文件上传方法中的步骤。

综上,本方案通过创建不可执行目录、定位存储上传文件的代码、改写上传文件的存放路径为不可执行目录,阻止webshell执行,从而达成防御文件上传漏洞的效果。

附图说明

为了更清楚地说明本公开具体实施方式或现有技术中的技术方案下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本公开的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1a为根据本公开比较例的第一类防御文件上传漏洞方案的示意图;

图1b为根据本公开比较例的第二类防御文件上传漏洞方案的示意图;

图1c为根据本公开比较例的第三类防御文件上传漏洞方案的示意图;

图2为根据本公开实施例的基于不可执行目录的文件上传方法的流程图;

图3a为根据本公开实施例的具体示例的流程图;

图3b为根据本公开实施例的具体示例中样例文件改写前后的对比图;

图4为根据本公开实施例的基于不可执行目录的文件上传系统的结构图。

具体实施方式

下面将结合附图对本公开的技术方案进行清楚、完整地描述,显然,所描述的实施例是本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。

注意,下文出现的英文缩写术语在此提供对应的英文全称、中文译文以及中文专业术语的详细解释。

目录:指计算机文件夹。

不可执行目录:指目录权限被设置为不可执行的目录。

黑客:指从事恶意破解商业软件、恶意入侵他人网站、通过自身掌握的黑客技术进行违法犯罪活动的人。

任意代码执行:指黑客在目标计算机或目标服务器中执行任意命令或代码的能力,一般认为拥有任意代码执行的能力标志着对目标服务器的入侵基本完成。

Webshell:可供黑客获取任意代码执行权限的恶意代码,又称为被黑客用于对网站服务器操作的后门, Webshell可以由多种语言编写而成,如PHP,ASP,ASP.NET,JAVA,PERL,CFM,PYTHON,C等等。

入侵网站:指黑客为获得目标网站服务器的命令执行权限所做的一系列违法犯罪行为。

网站扫描:指黑客或程序员对目标网站信息的相关获取行为,一般认为黑客对网站扫描是入侵网站前的踩点活动。

文件上传:网站上供用户上传文件的一项功能或服务,可以上传图像,视频,文档等,可以上传的文件类型由网站开发者预设。

文件上传漏洞:网站的文件上传功能存在缺陷,使得黑客可以上传超出网站开发者预设的文件类型的文件,特指黑客可以绕过限制,上传Webshell文件,并且黑客能够正常连接Webshell,获取任意代码执行权限。

文件上传漏洞模式:指构成文件上传漏洞的利用条件、路径或模式。比如一种文件上传漏洞模式可以这样描述,(1)存在文件上传点;(2)可以绕过网站对文件后缀名的检测;(3)可以获取文件上传后的保存的路径。

WAF:全称为Web Application Firewall,即web应用防火墙。一般通过向网站代码中插入WAF代码或网站中转流量实现防御效果。

网站源码:能够构成一个网站的原始代码,通常可以由多种语言编写而成,如PHP,ASP,ASP.NET,PYTHON,HTML等。

文件上传点:执行文件上传操作的函数入口,如move_uploaded_file ()等函数。

文件上传点特征库:不同模式的文件上传点构成的特征库。

存储上传文件代码点:执行保存上传文件的代码段,如$upload_file = fopen($filename, "w")。

存储上传文件代码点特征库:不同模式的存储上传文件代码点构成的特征库。

CMS:全程Content Management System,即内容管理系统,一般是成套的web网站源代码。开发者可以直接使用CMS的代码,实现快速搭建网站的效果,随后再根据不同的需求对代码进行二次开发。应用广泛的CMS有Wordpress,织梦CMS,帝国CMS等等。

本公开第一方面提供了一种基于不可执行目录的文件上传方法。图2为根据本公开实施例的基于不可执行目录的文件上传方法的流程图;如图2所示,所述方法包括:步骤S1、基于提取的网站根目录,生成不可执行目录;步骤S2、从所述网站的源代码中确定第一代码,所述第一代码为所述网站对上传文件进行存储的代码;以及步骤S3、将所述第一代码改写为第二代码,所述第二代码为将所述上传文件保存到所述不可执行目录的代码。

图3为根据本公开实施例的基于DGF建立控制流图的架构示意图;如图3所示,输入为待分析的目标程序,目标程序可以是已知源代码的程序,也可以是不能获得源代码的二进制程序,经过本方法分析后最终输出程序的带有间接跳转的控制流图。该方案包括三个步骤:步骤S1、静态分析构建iCFG的过程,步骤S2、基于DGF生成测试用例的过程,以及步骤S3、程序插桩记录间接跳转的过程。

在步骤S1,基于提取的网站根目录,生成不可执行目录。

在一些实施例中,首先提取网站的根目录,以apache中间件为例,采用命令cat /usr/local/apache/conf/httpd.conf | grep "DocumentRoot"可提取出网站根目录,如/data/www/default/。

然后采用命令:

cd /data/www/default/

mkdir file_upload

vim file_upload/.htaccess,htaaccess内容填入php_flag engine off

至此,在网站的根目录中建立了一个PHP不可执行目录file_upload 。

在步骤S2,从所述网站的源代码中确定第一代码,所述第一代码为所述网站对上传文件进行存储的代码。

在一些实施例中,首先利用预先设定的(或者预先收集的)文件上传点标准特征库,如将函数move_uploaded_file认定为上传点函数,以模式匹配的方式对所述源代码文件进行扫描;随后基于所述文件上传点,当扫描匹配到函数move_uploaded_file时,确定所述网站存储所述上传文件的代码点;以及从所述代码点提取所述第一代码,即对被上传到服务器的文件内容进行存储的代码,例如:

$file_path = "save/upload" //定义上传文件存储目录

move_uploaded_file($filename,$file_path) //执行上传文件的存储

在步骤S3,将所述第一代码改写为第二代码,所述第二代码为将所述上传文件保存到所述不可执行目录的代码。

在一些实施例中,首先利用预先设定的代码模式集,确定所述第一代码为已知代码;随后从所述预先设定的代码模式集中确定与所述第一代码对应的代码模式;以及利用所述代码模式改写所述第一代码。例如,根据收集的待改写点的代码模式,进行代码改写;在第一代码$file_path = "save/upload"的下一行插入一行新代码:

$file_path ="www/file_upload/" + $filename

即可将上传目录变量$file_path的值强制转变为不可执行目录,将被上传的文件强制保存到不可执行目录。

在另一些实施例中,首先利用预先设定的代码模式集,确定所述第一代码为未知代码;随后由用户改写所述第一代码;以及提取所述第一代码的代码特征,将所述代码特征作为新的代码模式存储至所述预先设定的代码模式集。

具体示例

某公司计划使用织梦CMS搭建公司官方网站,使用版本为DedeCMSv5.7SP2,现需要针对织梦CMS进行文件上传漏洞的加固。官网开发程序员在使用传统方法进行加固时,出现加固代码量大,无法保证对未知文件上传漏洞的防御效果。因此通过应用本公开第一方面的技术方案,在网站根目录创建一个不可执行目录,并识别出存储上传文件待改写点。捕获待存储文件路径变量,最后在待改写点前插入相应改写代码。官网开发程序员节省了大量的手动加固时间,获得了较好的加固效果。

图3a为根据本公开实施例的具体示例的流程图;如图3a所示,首先在网站根目录创建一个不可执行目录file_upload;通过模式匹配识别出文件上传点路径为/src/include/dialog/select_images_post.php,存储上传文件待改写点为move_uploaded_file($imgfile, $fullfilename);解析得到存储文件路径变量名$fullfilename;随后在在待改写点前插入改写代码,将捕获到的变量赋值为不可执行目录,$fullfilename ="www/file_upload/" + $imgfile;最后完成加固。样例文件/src/include/dialog/select_images_post.php改写前后对比如图3b所示。

综上,本公开第一方面提供的方案,主要有三点技术效果,(1)提高对未知上传漏洞模式的防御能力;本公开可以在对上传文件内容检查不完全,无法防御未知文件上传漏洞模式的情况下,提高对未知上传漏洞模式的防御能力,通过禁止文件目录的可执行权限,实现有效防御。(2)节约开发成本,文件上传漏洞防御加固成本;本公开可以节约程序开发人员的开发成本,文件上传漏洞防御加固成本,开发人员可以使用开源的文件上传功能代码,不需要人为加固文件上传功能的检查代码,只需要采用本公开第一方面的方法进行加固。(3)本公开可以加快文件上传漏洞防御处理速度。

本公开第二方面提供了一种基于不可执行目录的文件上传系统,所述系统400包括:生成模块401,被配置为,基于提取的网站根目录,生成不可执行目录;确定模块402,被配置为,从所述网站的源代码中确定第一代码,所述第一代码为所述网站对上传文件进行存储的代码;以及改写模块403,被配置为,将所述第一代码改写为第二代码,所述第二代码为将所述上传文件保存到所述不可执行目录的代码。

具体地,所述确定模块402具体被配置为:利用预先设定的文件上传点标准特征库,对所述源代码进行扫描,以获取所述网站的文件上传点;基于所述文件上传点,利用预先设定的代码点标准特征库,确定所述网站存储所述上传文件的代码点;以及从所述代码点提取所述第一代码。

具体地,所述改写模块403具体被配置为:利用预先设定的代码模式集,确定所述第一代码为已知代码;从所述预先设定的代码模式集中确定与所述第一代码对应的代码模式;以及利用所述代码模式改写所述第一代码。

具体地,所述改写模块403具体被配置为:利用预先设定的代码模式集,确定所述第一代码为未知代码;由用户改写所述第一代码;以及提取所述第一代码的代码特征,将所述代码特征作为新的代码模式存储至所述预先设定的代码模式集。

本公开第三方面提供了一种存储有指令的非暂时性计算机可读介质,当所述指令由处理器执行时,执行根据本公开第一方面的基于不可执行目录的文件上传方法中的步骤。

综上,本方案通过创建不可执行目录、定位存储上传文件的代码、改写上传文件的存放路径为不可执行目录,阻止webshell执行,从而达成防御文件上传漏洞的效果。

最后应说明的是:以上各实施例仅用以说明本公开的技术方案,而非对其限制;尽管参照前述各实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本公开各实施例技术方案的范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号