掌桥专利:专业的专利平台
掌桥专利
首页

一种基于Nginx插件的API防篡改与防重放的系统和方法

文献发布时间:2024-04-18 19:52:40


一种基于Nginx插件的API防篡改与防重放的系统和方法

技术领域

本发明涉及一种网络安全技术领域,具体涉及一种基于Nginx插件的API防篡改与防重放的系统和方法。

背景技术

现有的用于网络安全的安全方案或者产品采用的加签认证的方式,很容易在前端暴露密钥,同时还存在以下问题。

1、目前大部分的通用漏洞披露CVE、国家信息安全漏洞共享平台CNVD的web漏洞利用都是通过poc脚本检测漏洞以及exploit脚本进行漏洞利用的,大部分的都需要借助脚本和工具发送请求,因此采用脚本和工具大大增加了漏洞攻击风险;

2、只能防御攻击者在内网或者广域网上进行的抓包重放;

3、很多单独针对某网站的爬虫都是通过python、golang或者java语言编写定制的,不具备浏览器的js解析能力以及hook接口能力,所以无法生成签名,因此无法抵御机器人行为;

4、密钥固定的,只要攻击者知道签名的算法,就可以伪造签名,绕过检测,无法防御攻击者在内网或者广域网上进行的抓包重放。

5、部署在广域网的web应用通过IP和端口暴露接口,攻击者可以分析参数,注入恶意代码。

中国发明专利申请号为202211464423.X,提出的《一种API接口加密签名方法》技术方案,采用MD5的方式对HTTP数据内容签名,具体的方案是对HTTP请求内容的所有参数深拷贝后,重新排列,最后使用MD5加密生成sign发送,然后由后端验证。采用MD5的方案,让攻击者完全有能力通过脚本伪造签名绕过认证,让防篡改功能失效。攻击者得知签名方案后,可以先修改参数值,然后通过脚本使用一样算法计算出修改参数后的md5值,因此,无法防止API数据篡改,也无法保证加签密钥安全性。

如果采用具体的密钥加密算法代替md5的话,又会面临一个新的问题,因为web应用服务的对象是公网上的所有用户,包括正常用户和攻击者。给用户颁发的密钥key也是对全网公布的,这意味着攻击者知道了算法,也可以使用该key加密参数从而绕过签名的认证,无法做到真正的安全。

发明内容

本发明为了克服以上技术的不足,提供了一种基于Nginx插件的API防篡改与防重放的系统和方法,采用Nginx插件实现反向代理安全网关的形式,通过JS劫持方案让浏览器具备加签认证的能力,采用JS代码混淆和动态密钥,保证密钥不会被泄露,并可有效防御防止了加密的内容会在一定时间内被破解的风险,并且可以针对大多数的网站实现即插即用。

本发明克服其技术问题所采用的技术方案是:本申请第一个方面提出了一种基于Nginx插件的API防篡改与防重放的系统,包括网络请求端、服务器端和网关Nginx的网络系统,设置于网络请求端和服务器端之间的网关Nginx至少包括反向代理模块,其特征在于,所述网关Nginx还配置劫持模块、校验模块、解密模块、密钥生成模块和钩子函数模块,所述反向代理模块用于作为安全网关将网络请求中的网络地址反向代理到服务器端的Web服务,并接收Web服务的响应包;所述劫持模块用于劫持Web服务的响应包,将劫持代码插入至响应包,从而调用钩子函数模块得到动态密钥;所述解密模块用于解密网络请求包的动态密钥并判断请求包是否收到攻击;所述校验模块用于校验请求包是否重放或篡改;所述密钥生成模块用于定时生产随机密钥并保存,以及将随机密钥写入钩子函数模块。

进一步的,所述钩子函数模块至少包括代码混淆单元和加密单元;所述代码混淆单元用于基于接收的随机密钥代码混淆为动态基础密钥;所述加密单元用于将请求报文的参数和动态基础密钥加密,并基于动态基础密钥修改请求报文,并发送请求报文至网关Nginx。

本申请第二个方面提出了一种基于Nginx插件的API防篡改与防重放的方法,应用于上述基于Nginx插件的API防篡改与防重放的系统,包括以下步骤:网关Nginx接收并转发网络请求端的访问请求至服务器端,并接收服务器端响应于访问请求的返回响应包;网关Nginx插入调用钩子函数的劫持代码至返回响应包,并将劫持后的返回响应包返回至网络请求端;网络请求端基于接收的返回响应包执行劫持代码从而为API接口注册钩子函数;若网络请求端发送请求报文调用API接口,则基于钩子函数的动态基础密钥加密得到动态密钥,以及基于动态密钥修改请求报文。网关Nginx基于接收的请求报文解析得到动态密钥,并使用对称密钥进行解密;网关Nginx检验请求报文重放和篡改,并将校验通过后的请求报文转发至服务器端。

进一步的,所述动态基础密钥为随机时间随机生成的随机密钥与原始钩子函数经过代码混淆生成的密钥。

进一步的,所述基于钩子函数的动态基础密钥加密得到动态密钥,具体包括:基于钩子函数提取请求报文中的参数至参数数组;转换参数数组的内容为字节并进行排列,并基于检验算法计算参数数组的第一检验值;基于钩子函数的动态基础密钥加密基于第一检验值拼接钩子函数生成的时间戳,从而得到动态密钥。

进一步的,所述基于动态密钥修改请求包,具体包括:将动态密钥通过headers的方式附加到请求报文,从而得到修改后的请求报文。

进一步的,所述网关Nginx基于接收的请求报文解析得到动态密钥,具体包括:网关Nginx基于接收的请求报文的headers解析得到动态密钥,若接收的请求报文没有headers字段或无法解析得到动态密钥,则判断请求报文受到攻击则拦截。

进一步的,校验请求报文重放具体包括:钩子函数生成的时间戳与系统的时间戳进行比对,若两个时间戳的时间差超过预设时间阈值,则确定请求报文发生重放攻击,否则确定请求报文未发生重放攻击并进行篡改校验。

进一步的,校验请求报文篡改具体包括:基于钩子函数提取请求报文中的参数至参数数组,转换参数数组的内容为字节并进行排列,并基于检验算法参数计算参数数组的第二校验值,比较第二校验值和第一校验值,如果不相等,则认为请求报文收到了攻击并拦截。

进一步的,还包括动态基础密钥更新,具体包括:网关Nginx配置定时脚本随机生成基础密钥,并将基础密钥保存至网关Nginx的配置文件中,同时将基础密钥写入钩子函数中;钩子函数将代码混淆为动态基础密钥;重启网关Nginx从而基于动态基础密钥更新对称密钥。

本发明的有益效果是:

1、引入Nginx与Nginx插件作为网关的技术,利用Nginx自身反向代理、修改响应包劫持网页、http检测流程插件实现防篡改防重放。

2、采用js代码混淆和动态密钥的技术,帮助浏览器每次加密数据时,保证密钥不会被泄露,攻击者不会根据算法和密钥构造出签名的值,从而绕过检测;

3、保证了正常流量只能由浏览器发出的,因此阻止了几乎所有的工具和脚本,从而可以有效防御漏洞利用攻击;

4、有效防止由各种语言编写的爬虫工具,保障了web服务器的安全性;

5、既可以保护单独部署的web应用,也可以利用Nginx的LB能力部署在web服务器集群上,作为WAF或者流量代理网关。

6、防止中间人截获数据包重放,而且其包含对API参数值的加签认证方案能防止黑客通过正向代理截获原始数据包并改包重放的场景,可以杜绝绝大部分的web服务漏洞利用。

7、基于Nginx反向代理功能,将流量转发到后端受保护的服务器,配合Nginx自带的负载均衡功能,且防重放防篡改的安全能力以Nginx插件的形式实现,使得该安全能力以Nginx为载体形成一种安全消息网关,适用于各种场景的web服务包括传统web服务器集群场景、云原生微服务场景等。

附图说明

图1为本发明实施例的一种基于Nginx插件的API防篡改与防重放的系统示意图。

图2为本发明实施例网关Nginx的架构示意图;

图3为本发明实施例的一种基于Nginx插件的API防篡改与防重放的方法流程图;

图4为本发明实施例的一种基于Nginx插件的API防篡改与防重放的方法的应用示例。

具体实施方式

为了进一步理解本发明,首先对本发明提到的部分术语进行解释:

Nginx:高性能http和反向代理的轻量型服务器,占用内存少,并发能力强,强可扩展性,可以动态加载自定义的插件。

WAF:WEB应用型防火墙(web application firewall),通过执行一系列针对http和https的安全策略来专门为Web应用提供防护。

API:应用程序编程接口,是一些预先定义的函数,给用户或开发者提供访问应用程序的能力,本申请中特指REST API,是基于http/https协议的接口。

LB:负载均衡(load balance),建立在网络结构上,能够将流量均匀分摊到多个操作单元执行,如web服务、ftp服务。

AES:高级加密标准,是一种区块加密标准,采用对称密钥。

JS hijack:JavaScript劫持技术,通过将一段JS代码插入到网页中实现相应的功能。

JS混淆:是一种对JavaScript代码的保护技术,通过加密方式,使代码不可读,从人的角度来说无法理解混淆后的代码,但浏览器仍可正常执行。

钩子函数:就是处理拦截在软件组件之间传递的函数调用或事件或消息的代码,本质上就是用以处理系统消息的程序,通过系统调用,把它挂入系统中。

重放攻击:Replay Attacks,又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。重放攻击在任何网络通信过程中都可能发生,是黑客常用的攻击方式之一。

为了便于本领域人员更好的理解本发明,下面结合附图和具体实施例对本发明做进一步详细说明,下述仅是示例性的不限定本发明的保护范围。

如图1所示,为本发明实施例所述的基于Nginx插件的API防篡改与防重放的系统框图,包括网络请求端、服务器端和网关Nginx的网络系统,其中,网关Nginx包括反向代理模块、劫持模块、校验模块、解密模块、密钥生成模块和钩子函数模块。其中,网关Nginx的原理框图如图2所示。图2中所示的客户端即为网络请求端。

在本发明的一个实施例中,网络请求段通过网络发送报文至网关Nginx,网关Nginx的反向代理模块根据URL以及LB反向代理到指定的后端web服务,具体的反向代理模块用于作为安全网关将网络请求中的网络地址反向代理到后端的Web服务,并接收Web服务的响应包;劫持模块用于劫持Web服务的响应包,将劫持代码插入至响应包,从而调用钩子函数模块得到动态密钥;解密模块用于解密网络请求包的动态密钥并判断请求包是否收到攻击。校验模块用于校验请求包是否重放或篡改,密钥生成模块用于定时生产随机密钥并保存,以及将随机密钥写入钩子函数模块。

通过对Nginx的反向代理能力和加载自定义插件的功能构建一个消息安全网关,通过JS劫持让浏览器能够对由浏览器自身发送的各种请求进行签名,并且由网关Nginx进行签名。保证了正常流量只能由浏览器发出的,阻止了几乎所有的工具和脚本。通用性好,既可以保护单独部署的web应用,也可以利用Nginx的LB能力部署在web服务器集群上,作为WAF或者流量代理网关。

钩子函数模块包括代码混淆单元和加密单元,其中,代码混淆单元用于基于接收的随机密钥代码混淆为动态基础密钥,具体可采用JS混淆方式。加密单元用于将请求报文的参数和动态基础密钥加密,并基于动态基础密钥修改请求报文,并发送请求报文至网关Nginx。

本发明的另一个实施例,基于上述的系统的基于Nginx插件的API防篡改与防重放的方法流程图如图3所示,以图4所示的具体实例,对本发明的基于Nginx插件的API防篡改与防重放的方法进行分步骤说明如下。

S1,网关Nginx接收并转发网络请求端的访问请求至服务器端,并接收服务器端响应于访问请求的返回响应包。

在本发明的一个实施例中,网络请求端包括图4中所示的用户以及浏览器,用户在浏览器中输入网址http://www.a.com/index.html访问这个网址的首页。浏览器根据用户的输入www.a.com发送GET/index.html...的http报文至网关Nginx。网关Nginx配置的反向代理模块根据URL以及LB反向代理到指定的后端web服务即网站。网站收到了网关Nginx的反向代理模块转发的请求,则返回html格式的响应给网关Nginx。

S2,网关Nginx插入调用钩子函数的劫持代码至返回响应包,并将劫持后的返回响应包返回至网络请求端。

网关Nginx首先判断收到的返回响应包的格式,如果格式满足条件,则向响应包中插入劫持代码。

在本发明的一个实施例中,首先判断返回响应包的格式是否为html格式,如果为html格式,则进行JS劫持,向返回响应包的首部或者尾部插入js代码。

在本发明的一个实施例中,js代码里包含