自动化Web渗透Payload提取技术

做Web安全已经三四年了,从最初的小白到今天的初探门路,小鲜肉已经熬成了油腻大叔。Web安全是一个日新月异的朝阳领域,每天的互联网上都在发生着从未暴露的0 Day和N Day攻击。这时一个大家都意识到的重要问题就浮出水面了:如何能从海量Web访问日志中把那一小撮异常请求捞出来,供安全人员分析或进行自动化实时阻断和报警?

对于这个问题,传统的方法是利用传统的WAF(无机器学习引擎),进行规则匹配。传统WAF有其存在的意义,但也有其掣肘。首先,安全从业人员都懂,基于黑名单的防御往往存在各种被绕过的风险,看看安全论坛里各式花样打狗(安全狗)秘籍就可见一斑。其次,传统WAF只能发现已知的安全攻击行为或类型,对于新出现的攻击存在更新延迟,维护上也有比较大的成本。我认为这些问题都源于一个现实——传统WAF不能对其保护的网站进行建模,因此只能基于已知规则,对各式各样的Web系统进行统一的无差别的保护。

近年来,机器学习(包括深度学习)高调闯入人们的视野,也逐步应用在了信息安全领域。基于机器学习的WAF相关论文和文章也看了一些,似乎大家都主要应用了有监督机器学习,也都提到了一个问题:有标记的攻击数据集(黑样本)难于大量获取。而一小波提出无监督异常检测思路的文章,又会遇到精确度低的问题。

针对这些问题,我决定先进行一些分解。既然直接预测整个请求是否是攻击很难做到可接受的准确率,不妨就先把异常的攻击Payload找出来。找出来后,就可以用来进行精准的攻击分析,还可以帮助优化WAF规则等。本文所述的技术最大的优势是无监督,无需先验规则即可自动提取异常Payload。

项目GitHub: https://github.com/zhanghaoyil/Hawk-I  (不断完善中,欢迎贡献代码)

0×1 思路

要把异常参数找出来,最显而易见要解决的问题就是如何量化请求中各参数的异常程度。为了最大化利用日志中蕴含的需要保护的Web系统自身的结构信息,我决定对请求按访问路径进行拆解,即分析参数value在同路径同参数Key的其他参数值中的异常程度

具体算法步骤是:

1) 基于TF-IDF对不同路径下的样本分别进行特征向量化,按参数维度对特征向量进行汇聚

2) 基于特征向量提取出样本参数在同路径同参数Key的其他参数值中异常分数AS(Anomaly Score)。

1.png

3) 设置阈值T,取出AS大于T的异常参数值作为输出。

0×2 数据集及预处理

本文使用HTTP CSIC 2010数据集。该数据集由西班牙最高科研理事会CSIC在论文Application of the Generic Feature Selection Measure in Detection of Web Attacks中作为附件给出的,是一个电子商务网站的访问日志,包含36000个正常请求和25000多个攻击请求。异常请求样本中包含SQL注入、文件遍历、CRLF注入、XSS、SSI等攻击样本。数据集下载链接: 。在本项目Github中也准备好了。

HTTP CSIC 2010数据集单个样本为如下格式:

POST :8080/tienda1/publico/anadir.jsp HTTP/1.1 User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.8 (like Gecko) Pragma: no-cache Cache-control: no-cache Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,/;q=0.5 Accept-Encoding: x-gzip, x-deflate, gzip, deflate Accept-Charset: utf-8, utf-8;q=0.5, *;q=0.5 Accept-Language: en Host: localhost:8080 Cookie: JSESSIONID=933185092E0B668B90676E0A2B0767AF Content-Type: application/x-www-form-urlencoded Connection: close Content-Length: 68 id=3&nombre=Vino+Rioja&precio=100&cantidad=55&B1=A%F1adir+al+carrito

根据观察,该数据集除路径(URI)和参数外其他Header无任何攻击Payload,具有很多冗余信息。因此对该数据集进行格式化,只保留HTTP方法、路径和参数,转为JSON格式方便后面使用。具体进行了如下预处理,具体代码见data/parse.py:

1) 去除冗余信息。

2) 执行迭代的urldecode。

3) 生成标准化的参数,将大小写字母、数字分别转换为a和n。同时保留原始参数和标准化的参数,用于最终的Payload提取。

    def normalize(self, s, with_sub=True):         #urldecode         while True:             new_s = parse.unquote(s, encoding='ascii', errors='ignore')             if new_s == s:                 break             else:                 s = new_s         #normalize         if withsub:             s = re.sub('\ufffd', 'a', s)             s = re.sub('[a-zA-Z]', 'a', s)             s = re.sub('\d', 'n', s)             s = re.sub('a+', 'a+', s)             s = re.sub('n+', 'n+', s)             s = re.sub(' ', '', s)         return s 0×3 实现

根据算法步骤,项目主要分为向量化和参数异常评估和异常Payload提取两部分。

0x3a 向量化和参数异常分数

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/64f0d605e09440d8cad668ef12921d47.html