WAF规则的自动探测与发现技术研究
2018-01-15张琦翟健宏
张琦+翟健宏
摘要: 关键词: 中图分类号: 文献标志码: A文章编号: 2095-2163(2017)06-0103-06
Abstract: This paper designs a tool, that is able to autodetect WAF (Web Application Firewall) rules. The tool could get the WAF rules after the user offers the website and the target parameter. The tool is divided into three modules: WAF Discovery Module, Payloads Sending Module, Rules Retrieval Module. The tool adds regular expression matching function. And it uses shortest element detected first strategy and dichotomy to improve the performance. This paper uses multithreading and alleviates the network delay problem. Meanwhile, the paper also designes the good payload databases. It could make the detection more effective and accurate. The payload databases could always be inserted with new items.
0引言
随着IT技术的不断发展和进步,互联网已经走进了千家万户,成为人们生活中必不可少的一部分。截至2015年12月底,国内网站数量已达426.7万个[1]。在网站数量不断增长的同时,网络安全态势也逐渐变得十分严峻。根据360互联网安全中心与2017年2月12日发布的《2016年中国互联网安全报告》,国内扫描出的存在漏洞的网站已达91.7万个,占网站数量的21.4%,其中存在高危漏洞的网站有14.0万个,占网站数量的3.3%。保护网站应用的安全,是每一家互联网企业和其他网站建设机构不可推卸的首要任务与基础职责。
一般的网络防火墙能够对服务器进行一定的防护,但是却并不擅长应用层面的安全防护。由此,网站应用防火墙(WAF,Web Application Firewall),则应运而生。WAF的主要功能是保护Web应用不受到恶意攻击,并通过对网站的请求和响应开展高效的分析和统计,能够对网站攻击事件提供及时的报警、甚至停止响应,以保护网站服务器的安全。
大部分的WAF通过对请求或者响应内容进行特征匹配[2],如果在请求中匹配到恶意字符串或者在响应中匹配到敏感信息,则视此次请求为非法请求,可以停止响应,实现服务器的保护功能。优秀的WAF产品能够设计出良好的特征库,检测出大部分的恶意攻击;同时也能够拥有较低的误报率,保证网站的正常功能需求。
因此,本文研究设计了一款WAF规则自动发现的脚本应用,能够探测出网站配置的WAF规则以及没有配置的规则,从而可以有针对性地优化网站WAF的配置,提升自我安全防护。
1WAF规则的自动探测设计
1.1WAF的表现形式
既然要探测WAF规则配置,就需要知道WAF的一般响应形式。研究中人工收集了54个网站的WAF响应,大致可分为4类,对其内容阐释如下:
1)HTTP响应码不是200(19/54)。正常的HTTP请求响应码是200[3],通常引发了WAF禁止的请求响应码就会变成403 Forbidden、302跳转、501服务器错误、404 Not Found等等异常响应码,实例之一即如图1所示。这在本次样本中共占19个。
2)明显的WAF提示(16/54)。 除了一些异常响应码,还会有很多网站会展现与正常响应截然不同的响应内容,是比较明显的WAF提示,示意则如图2所示。这在本次样本中共占16个。
3)停止响应(14/54)。很多网站在认为遭遇了攻击时就会直接停止攻击者的响应,以保护自身网站的安全,具体可如图3所示。这样的网站在本次样本中共占14个。
4)自定义响应(5/54)。还有少数网站也会给出一定的提示,或者给出一定的响应特征表示此请求已被WAF禁止,但是响应特征不明显,因而很难提取。这样的网站在本次样本中共占5个。
综合以上研究论述后,可得分析结论如下:
1)网站和网站之间的WAF响应相对独立,没有确定的WAF特征等,所以需要对每一个网站单独处理。
2)前3种WAF响应通过相似度匹配可以较好地分离出来,准确率较高,且在本次WAF样本中占据了很大比例。
3)对于自定义WAF响应,表现形式并不突出,分离难度较高,这样的响应需要通过人工输入正则匹配特征的方式来处理。
1.2整體架构
本文设计的WAF规则自动探测工具并不仅仅局限于狭义的WAF产品,也可以是代码层级的网站防护。通过输入一个url和目标参数,利用工具将可自动探测目标网址WAF的规则配置。
由图4可知,输入URL参数以及PARAM参数即可运行工具,同时也有一些其他的输入。其中,-h参数显示帮助信息;-d参数表示使用POST方法进行探测;-cookie参数可以定制发送的cookie;-header参数可以定制请求头;-test参数涉及的是测试使用;-t参数可以配置程序使用的线程数;-r参数可以配置响应结果的正则匹配。endprint
整个工具分为3个模块:网站过滤检测模块、攻击向量生成模块、过滤规则生成模块。程序运行流程则如图5所示。
参照图5,可得程序运行的步骤推演论述如下:
1)解析用户输入。
2)发送两次原始请求,以确定平均响应时间以及相同请求的响应相似度,作为最高相似度。
3)按照几种不同类型的参数发送请求,得到响应结果,并对响应结果计算相似度,根据相似度对响应结果进行分类。
4)若仅有一个类别,则未探测到WAF的存在,程序退出;若有多种类别,则继续进行下一步。
5)对不同种类的恶意参数进行大量的尝试,并把响应结果归类。
6)根据归类情况整理得到WAF禁止的字符串列表。
7)输出WAF禁止的字符串列表,即为WAF规则,程序结束。
在程序运行过程中,第1步属于前期准备阶段;第2~4步属于网站过滤检测模块;第5步属于攻击向量生成模块;第6~7步属于过滤规则生成模块。下面将详细介绍研究中各重点模块的设计方法。
由图6可见,响应相似度的计算流程可对应表述为:
响应的相似度首先根据是否有响应来计算,如果两个响应均没有响应或停止响应,则相似度为1;如果两个响应中一个有正常响应、另一个没有,则相似度为0;如果两个响应中均有正常响应,则继续查看两个响应的响应码,如果两个响应的响应码均不为200且相同,则相似度为1;如果两个响应的响应码不同,则相似度为0;如果两个响应的响应码均为200,则计算响应内容的字符串相似度,作为响应的相似度。
计算字符串相似度的时候调用的是python的difflib库,当字符串较长时,计算时间也趋于可观,比如30 k数据的内容在研究选用的PC机上需要计算3 min左右。另外,部分网站的响应特征不明显,虽然相似度较高,却并非同一类型,比如图7、图8的网站。
可以看出,整个网页触发WAF规则的响应结果与正常响应结果仅仅是一句话的差别,因而在分类这两种请求的时候带来的困难也越发突显。
为了解决上述两个问题,工具增加了正则匹配的功能。在输入中输入-r参数,输入一个正则表达式,在计算字符串相似度的时候,首先会对字符串调用正则匹配,将匹配出来的结果再计算字符串相似度。如此,臻至完美地解决了上述问题。对其研究释义可得内容为:
首先,当响应结果内容数据量较大时,通过人工选择关键部分进行正则匹配,可以优势提升计算效率,不再被无效的字符串相似度计算时间而困扰;另外也可以通过人工选择关键部分,将有效部分筛选出来,方便机器计算相似度并归类,不再为海量数据中找不到关键点而困扰。
得到相似度之后,通过相似度大小的比较,得到两个请求是否为同一类。工具设置了全局变量ACCEPTABLE_DIFF_RATIO,为0.05,如果两个响应的相似度差别小于0.05,则视为同类请求;否则不为一类。研究可得,相似度差别的数学公式为:相似度差别=STANDARD_RATIO – SIMILARITY[i][j],(1)其中,STANDARD_RATIO是在发送原始请求时确定的最高相似度,SIMILARITY[i][j]为第i个请求与第j个请求的相似度值。
将五种请求归类后,同一类别的请求只留一个响应结果保存在RESPONSES全局变量中。最后RESPONSES中保留了基础类别响应的标准。如果只有一种类别,说明该网站没有探测到不同类型的响应,即没有探测到WAF响应,输出“Didnt find WAF Product”,程序停止。如果有多种类别,再继续运行程序进入下一个模块—攻击向量生成模块。
1.4攻击向量生成模块
攻击向量生成模块是本工具的关键模块,需要设计出良好的攻击向量,对目标网站进行大量的恶意请求尝试,才能够比较完整地触发WAF响应,从而得到WAF规则。研究攻击向量的时候可以通过两种角度去设计实现[4],即攻击者的角度和防御者的角度。所谓从攻击者的角度是指在渗透测试的过程中可能会用到部分的恶意字符串以及攻击向量[3],包括一些关键的渗透步骤探测;从防御者的角度是指无论攻击者使用什么手段,一些关键的系统功能函数以及关键字是禁止使用的。这两种角度虽然立足于不同方向,但是却有共同的部分,那就是渗透测试的手段。
为此,根据如上原则,设计了两个攻击向量集合,分别各自保存在special.xml和payload.xml文件中,之所以保存在xml文件中是为了程序能够方便读取,同时还可以不断地扩充攻击向量集合,使集合更加完备。其中,special.xml中是恶意单个字符集合,使用url编码过的集合,在使用时需要先对其进行url解码再使用。而payload.xml是其他攻击手段恶意关键字集合,包含的攻击类型有COMMON、SQL、XSS、LFI和PHP。每一种攻击类型包含不同的攻击句子,句子中拆分出单个关键字,在一个攻击句子中关键字类型相近且可以相互组合,比如SQL注入攻击中语句为:
-- or union select if as between from where group by having limit into outfile procedure
对应内容中,关键字拆分为--、or、union、select、if、as、between、from、where、group、by、having、limit、into、outfile、procedure,針对这个攻击level设计指数bound等于3,意思是在这个句子中最高的关键字组合数为3,表示可能由三个关键字才能触发WAF响应,比如select from where就是很多WAF规则中的组合。优化合理地设计bound指数,可以对WAF规则进行高效探测,bound设计得过高,虽然检测结果将更加精准,但是也会导致请求数目剧增,影响检测效率;bound设计得过低,则检测结果不准确,无法找到真正触发WAF的关键字组合。endprint
在攻击向量的设计过程后,就可以通过最小元素优先检测法对目标网址的WAF规则进行探测了。遍历每个攻击类型的所有level,针对每个level首先发送整个句子作为参数,如果得到的响应结果类型与原始请求并不相同,则视为其中存在WAF规则禁止的字符串;再组合关键字进行探测。因为一个level的句子中可能存在不同的WAF规则组合,比如上述SQL注入攻击语句可能同时存在select from以及union select两种组合,因此要尽可能地对每一种关键字组合都加以尝试才能够确定每一种WAF规则;但是如果全排列所有关键字请求,数量又太大,因此要按照bound参数进行组合。从一个关键字组合到两个关键字组合,一直到bound数目的关键字组合停止,这个顺序称之为最小元素优先检测法。因为如果先进行少数关键字组合且检测成功,可以将这部分关键字剪枝,从而减少请求数。比如检测到select关键字被WAF禁止,则将无需再检测select from以及union select组合。
然而探测出的关键字未必是最精确的WAF规则配置,比如ord()、floor()关键字,可能其中真正有效部分是or。但是在一个最小元素关键字中,可以基本认为其中只包含一个WAF规则,因为在设计关键字的时候就是根据经验按照一个WAF规则来操作处理的,故而仍然需要对关键字进行更为精确的检测,在这里研究使用了二分法[5]。
二分法中,研究给定一个字符串A,并找出其中的WAF规则,且WAF规则可能不是连续的字符串,所以需要逐个探测字符串中的有效字符。算法不断地确定有效字符中最右字符来运行,如图9所示,先对目标字符串A二分为A1、A2,检测A1是否会被WAF禁止:如果成功,则证明最右字符在A1中;如果失败,则证明最右字符在A2中;对相应部分字符串再次二分,在新产生的左部要与其左面的字符串A中的其他部分结合进行探测,比如A2分为A21和A22,A21需要结合A1为A1A21进行探测:如果成功,则最右字符在A21中;如果失败,则最右字符在A22中;以此类推,直至精确到一个字符。然后将这个字符加入到结果集中,再递归探测其左面部分中的最右字符,请求时将结果集中的字符衔接到最右面即可。
该算法的复杂度为nlogn,n为关键字长度。同时还有另一种可能需要用到二分法,当句子遭到了WAF禁止后,说明句子中有部分字符串是在WAF规则中,然而若关键字设计不当或者bound值过低,可能发生所有关键字组合都不会被WAF禁止的情况,这时就可以使用二分法直接探测句子中的有效部分,在其中精确地找到一种WAF规则即可。
一般情况下,工具需要发送几千个请求。平均来说,网站的响应时间大约在1~2 s左右,然而也可能会存在响应较慢的网站,响应时间在4 s以上;这样计算,平均运行一次程序需要1 h,如果响应在4 s以上,更会使运行时间达到数小时之久,效率极低。因此,这里采用了多线程技术,极具实效地提升检测效率[6]。
由于按照流程,需要先检测句子,若句子被WAF禁止再组合关键字去请求,若组合关键字被WAF禁止再用二分法精确查找WAF规则,所以不同网站的请求内容并不完全相同,需要根据情况智能判断。因此本工具在组合关键字处加入了多线程处理,每次得到一个组合关键字列表后,由各个线程分别到列表中逐个提取关键字进行查询,所有线程共享一个偏移变量tmp_share_offset,每次根据变量值取关键字查询并将偏移增加1,运行了一个关键字查询后将调用偏移变量再次读取,直至偏移大于列表长度线程退出。
多线程很容易发生的就是竞争问题,如果线程A和线程B同时读取tmp_share_offset,或者线程A读取之后还未将tmp_share_offset增加便被线程B读取了,导致大量线程读取相同的关键字,还有可能造成关键字的遗漏,所以研究中即引用了互斥锁技术[7]。每当读取或修改共享变量的时候就将变量锁住,禁止其他线程读取使用,其他线程若需要使用共享变量只能选择等待,直到共享变量使用完毕、且互斥锁释放后才可以使用,如此,便真正地解决了竞争问题。
综上论述可知,攻击向量生成模块即是本次研究的目标关键模块,其中用到了渗透技术、最小元素优先检测法、二分法、多线程、互斥锁等多种核心技术思想。
1.5過滤规则生成模块
攻击向量检测完毕后,会将结果汇总至动态列表ALL_BANNED_EFFECTIVE_VECTOR中,再将列表中的所有WAF规则输出到文件中。研究至此,程序的主体便全面结束。
1.6SQLMAP的使用
目前针对WAF的研究并未充分展开,工具也较有限。本文在项目确立之前即研究发现了著名的渗透测试软件SQLMAP也有WAF探测模块[8],而且也是WAF研究中可堪称效果优良的一款工具。然而,SQLMAP是要找出WAF所对应的产品名称,找到的方法是根据WAF响应特征和预备WAF产品知识库进行匹配得知,不过,由于不能够探测出代码级的WAF或是自定义WAF,却只能找出生产WAF的厂商,因而相对而言其探测能力仍有所欠缺。
本文并没有深入辨识及确认WAF厂商,注重的是对WAF规则的探测发现研究。但是关于同一厂商的WAF产品规则是否会大致相同的问题讨论,本工具则是将SQLMAP的WAF探测功能整合到最后一部分,得到WAF产品名称后输出到结果文件中,这样就可以在探测大量网站之后得到同一厂商WAF产品规则配置概况,同时也丰富了本次研究针对WAF工具的实际应用功能。
2测试结果
研究中使用本工具对10家网站进行了WAF规则探测,平均响应时间为1.2 s;平均检测网站规则数23个,最高检测规则68个;平均请求数1 455个,最大请求数3 370个;平均运行时间6 min 50 s,最长运行时间20 min 36 s。详细数据如表1所示。endprint
由表1可知,部分网站的WAF规则探测效果较好,比如www.esri.com探测出68条WAF规则,但是部分网站的探测效果一般,例如,iask.sina.com.cn的最少,仅仅探测出九条WAF规则。从运行时间角度来说,通常请求数越大运行时间越长,但均没有超过0.5 h,大部分规则较少的在5 min之内就能够结束运行。
能够看出其网站WAF规则涉及到多种攻击手法,关键字包括SQL注入函数、SQL注入数据库表名、XSS函数、XSS标签、PHP注入关键字、PHP注入函数等等。
3结束语
本文设计的WAF规则自动探测工具可以较好地黑盒探测出任意网站的WAF规则,在其中做了较多的优化和提升。使用正则匹配解决了难以从相似结果中提取不同种类响应的问题,使用最小元素优先检测法和二分法提升了探测效率,使用多线程使探测速度更为可观,也从多种攻击手段设计了攻击向量,同时工具仍支持继续增加攻击向量库,使探测更加精准高效。然而工具也存在部分不足,比如有时探测出的WAF规则较少,攻击向量库仍有待进一步的拓展改进。今后将继续完善攻击向量库,同时增加攻击向量的变种探测能力,使探测出的规则更加完整,贴近设计。
参考文献:
[1] 国家网信办. 《中国互联网站发展状况及其安全报告(2015)》发布[J]. 保密科学技术,2015(3):73.
[2] PRANDL S, LAZARESCU M, PHAM D S. A study of Web application firewall solutions[C]//International Conference on Information Systems Security. Switzerland:Springer International Publishing, 2015: 501-510.
[3] FIELDING R, GETTYS J, MOGUL J, et al. Hypertext transfer protocol-HTTP/1.1[R]. California:HTTP Working Group,1999.
[4] RELAN K, SINGHAL V. Pentest Ninja: XSS and SQLi takeover tool[C]//Proceedings of the Second International Conference on Information and Communication Technology for Competitive Strategies. Udaipur, India: ACM, 2016: 1-2.
[5] 王海濤, 朱洪. 改进的二分法查找[J]. 计算机工程, 2006, 32(10): 60-62,118.
[6] 骆斌, 费翔林. 多线程技术的研究与应用[J]. 计算机研究与发展, 2000, 37(4): 407-412.
[7] KLEIMAN S, SHAH D, SMAALDERS B. Programming with threads[M]. Calif :Sun Soft Press, 1996.
[8] Damele B, Stampar M. Sqlmap[EB/OL].[2012].http: //sqlmap. Org.endprint