一种基于Apache的CSRF防御模块的实现

2017-10-13 20:09王马龙
网络安全技术与应用 2017年3期
关键词:脚本漏洞时延

◆王马龙 刘 健



一种基于Apache的CSRF防御模块的实现

◆王马龙 刘 健

(四川大学计算机学院 四川 610065)

跨站请求伪造(CSRF)漏洞的存在十分广泛,而且是开放式web应用安全项目(OWASP)统计的Top 10 Web攻击列表中最具威胁的漏洞之一。目前最具代表性的两种CSRF防御工具是CSRFGuard[2]和jCSRF[3]。针对CSRFGuard会将JS动态创建的动态HTTP请求误认为是CSRF攻击;jCSRF以代理模式部署,会增大web服务器的响应时间这两大问题,本文通过重写XMLHttpRequest对象onsend的方法,向HTTP头注入CSRF防御Token,基于Apache web 服务器实现了一个CSRF防御模块mod_anticsrf,去除了代理的网络通信开销。实验结果表明,mod_anticsrf支持动态HTTP请求,且几乎不影响web服务器的响应时间。

CSRF;Apache;动态HTTP请求;性能

0 引言

跨站请求伪造(Cross-Site Request Forgery,CSRF)攻击是一种当今互联网上广泛存在的Web攻击。近几年来,CSRF在OWASP(Open Web Application Security Project)每年的十大安全漏洞中[1]始终能够稳居前列。它并不是一种新型的攻击,但是其攻击原理简单,极具破坏性。由于CSRF漏洞存在于大量的Web应用程序中,如果通过手动修改程序源代码的方式来修复漏洞,工作量将十分巨大。基于此,本文基于ApacheWeb服务器实现了一种CSRF防御模块。

1 CSRF防御工具现状

CSRFGuard[2]和jCSRF[3]都是基于一次性Token的方法实现的CSRF防御工具。CSRFGuard是由OWASP发布的CSRF防御技术。它是一个实现了 Token模式的JAVA类库[4],通过生成随机的Token,而攻击者无法构造有效请求,从而对CSRF攻击进行防御。它的缺点是:(1)只有Javaweb应用服务器能使用;(2)它使用JavaScript DOM注入Token的方法是在页面加载完后遍历页面所有元素,对“form”或“a”等元素或属性插入Token。因此,CSRFGuard比较适合处理静态页面。如果有表单在页面加载完后由JavaScript脚本动态创建,其提交的请求不能被CSRFGuard插入Token,相关页面的操作也可能因缺少Token被阻止或者可能遭受CSRF攻击。jCSRF解决了CSRFGuard的第二个缺点,并提出了一种同域和跨域CSRF防御的协议。但是jCSRF也有两个不足之处:(1)目前不支持GET方法;(2)它以HTTP代理的方式部署,会增大系统时延。

2 基于Apache的CSRF防御模块的设计与实现

2.1 基于Apache的CSRF防御模块的设计

图1 jCSRF部署图

如图1所示,jCSRF以http代理的形式部署在Web服务器的前方,用户的每次请求都必须由jCSRF转发一次,给系统带来了很大的网络时延。

为减少了浏览器与代理之间的网络IO造成的开销,本文将mod_anticsrf设计为一个可动态加载的模块,它可根据用户的配置由Apache Http服务器动态加载/卸载。它的部署模式如下图2所示:

mod_anticsrf的工作流程如图3所示:

(1)接收用户的HTTP请求;

(2)判断该请求是否为此会话的初始请求(即第一次请求),如果是,则跳转至第(3)步;否则,跳转至第(4)步;

(3)生成随机Token,构造CSRF防御js脚本,然后将js脚本注入到HTTP响应中,跳转至第(7)步;

(4)从HTTP请求中提取Token,成功则跳转至第(5)步;否则,跳转至第(6)步;

(5)判断Token是否合法,如果合法,则跳转至第(3)步;否则,跳转至第(6)步;

(6)阻断当前HTTP请求,视配置决定是否需要记录日志,跳转至第(1)步;

(7)将HTTP响应页面发送给用户,跳转至第(1)步。

图3 mod_anticsrf工作流程

2.2 基于Apache的CSRF防御模块的实现

mod_anticsrf从架构上来看主要分为两个部分。一部分是用C语言实现的Apache模块,这部分主要负责Token的构造、JS代码的注入和Token的验证;另一部分是要注入到用户响应页面的JS代码,这段JS代码负责在用户发起请求的时候将Token添加到HTTP的头部或请求体里面。在实现mod_anticsrf的过程中,主要解决以下几个技术问题:

2.2.1 Token的构造

Token的构造过程是mod_anticsrf的重要部分,为了区分攻击者和正常用户传递过来的Token,我们从用户请求中提取一个能唯一标识用户的特征来构造Token,构造过程如下:

2.2.2 Token的注入

在服务器端添加Token至HTTP响应页面是一种注入Token的方法,但是这样添加Token会对整个页面进行遍历,从而导致服务器的延迟增大。本文采用了在用户浏览器中通过JS脚本(anticsrf.js)的方式,动态地在用户的HTTP请求中添加Token。具体方法如下:

为值;

对于表单,遍历dom树,找到所有的

节点,然后添加一个类型为hidden的子节点,name设置为“csrfToken”,value设置为;

对于Ajax请求,需要重写XMLHttpRequest对象的onsend方法以注入请求头域“csrfToken:”,核心代码如下:

XMLHttpRequest.prototype.onsend = function(data){

// 注入请求头 "csrfToken:tokenValue"

this.setRequestHeader("csrfToken",tokenValue);

}

2.2.3 在HTTP响应中注入JS脚本

注入JS脚本的步骤如下:

找到标签,在它的前面插入对anticsrf.js的引用,即:

找到标签,在它的前面插入对anticsrf.js中的主函数insertToken的调用代码以传入生成的Token,即:

2.2.4 Token的提取和验证

当Apache接收到的HTTP请求不是当前会话的初始请求时,mod_anticsrf就要提取该请求中的Token,过程如下:

(1)在HTTP请求头中寻找csrfToken域,如果找到,说明这是一个Ajax请求,取出它的Token值,跳转至第(3)步;否则,跳转至第(5)步;

(2)在HTTP的请求参数和表单参数中寻找csrfToken域,如果找到,取出它的Token值,跳转至第(3)步;否则跳转至第(5)步;

(6)提取本次请求的源IP地址,如果,则说明请求合法,将该请求的控制权交还给Apache;否则,跳转至第(7)步;

(7)验证失败,阻断请求。

3 实验及结果分析

为测试mod_anticsrf能否支持JS动态创建的HTTP请求,本文设计了一个简单的网页:changePassword.php,这个页面模拟的是用户改密码的功能,它提交数据的方式是Ajax。从图4可以看出,页面能正常访问,不会被误认为是CSRF攻击。

图4 Ajax请求抓包

本文还针对无CSRF防御、开启mod_anticsrf和使用jCSRF三种情况进行了性能测试,测试方法为使用Apache开源性能测试工具ab向服务器发起10000次请求,并发为100rps(具体命令为:ab -n 10000 -c 100 -p post.txt http://192.168.11.120/ changePassword.php),最终比较各种情况下的总耗时。结果如图5所示:Apache在开启mod_anticsrf模块之后基本不影响系统性能,而使用jCSRF却会导致系统时延增加大约1/2。

图5性能对比图

由实验结果可以看出,由于Ajax请求头里面被成功地注入了CSRF防御Token,所以它不会被判定为CSRF攻击;而且,由于mod_anticsrf直接运行在Apache进程内,不会像jCSRF那样需要与代理之间的网络通信,所以几乎不会增加系统时延。

4 结束语

本文基于Apache实现了一种CSRF防御模块mod_anticsrf,可以避免mod_anticsrf将JS动态创建的HTTP请求误判为CSRF攻击;此外,将mod_anticsrf以动态模块的方式部署于Apache服务器中,几乎不会影响系统响应时间。现在,mod_anticsrf暂不支持jQuery等三方JS库;该模块有待改进以支持Web应用中存在XSS漏洞的情况。

[1]OWASP.“Top ten most critical web application security vulnerabilities”.http://www.owasp.org/index.php/OWASP_Top_Ten_Project,2013.

[2]Boyan Chen,Pavol Zavarsky,Ron Ruhl and Dale Lindskog A Studyof the Effectiveness of CSRF Guard. 2011 IEEE International Conferenceon Privacy,Security,Risk,and Trust,and IEEE InternationalConference on Social Computing .

[3]Riccardo Pelizzi,R. Sekar. A server- and browser- transparent CSRF defensefor web 2.0 applications[C]// ACSAC'11:Proceedings of the 27th AnnualComputer Security Applications Conference. New York:ACM,2011.

[4]OWASP.Category:OWASP CSRFGuard Project [EB/ OL].https://www.owasp.org/index.php/CSRFGuard,2016.

国家重点研发计划(2016yfb00604,2016yfb00605),国家自然科学基金项目(61572334)。

猜你喜欢
脚本漏洞时延
酒驾
漏洞
安奇奇与小cool 龙(第二回)
5G承载网部署满足uRLLC业务时延要求的研究
基于GCC-nearest时延估计的室内声源定位
快乐假期
小编的新年愿望
三明:“两票制”堵住加价漏洞
漏洞在哪儿
FRFT在水声信道时延频移联合估计中的应用