加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门网 (https://www.xiamenwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

技术讨论 | 自动化Web渗透Payload提取技术

发布时间:2018-10-12 23:17:01 所属栏目:业界 来源:zhanghaoyil
导读:【新品产上线啦】51CTO播客,随时随地,碎片化学习 一、写在前面 做Web安全已经三四年了,从最初的小白到今天的初探门路,小鲜肉已经熬成了油腻大叔。Web安全是一个日新月异的朝阳领域,每天的互联网上都在发生着从未暴露的0 Day和N Day攻击。这时一个大家
副标题[/!--empirenews.page--] 【新品产上线啦】51CTO播客,随时随地,碎片化学习

一、写在前面

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

自动化Web渗透Payload提取技术

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

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

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

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

二、思路

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

具体算法步骤是:

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

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

技术讨论 | 自动化Web渗透Payload提取技术

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

三、数据集及预处理

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

http://www.isi.csic.es/dataset/ 。在本项目Github中也准备好了。

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

  1. POST http://localhost:8080/tienda1/publico/anadir.jsp HTTP/1.1 
  2. User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.8 (like Gecko) 
  3. Pragma: no-cache 
  4. Cache-control: no-cache 
  5. Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,/;q=0.5 
  6. Accept-Encoding: x-gzip, x-deflate, gzip, deflate 
  7. Accept-Charset: utf-8, utf-8;q=0.5, *;q=0.5 
  8. Accept-Language: en 
  9. Host: localhost:8080 
  10. Cookie: JSESSIONID=933185092E0B668B90676E0A2B0767AF 
  11. Content-Type: application/x-www-form-urlencoded 
  12. Connection: close 
  13. Content-Length: 68 
  14.  
  15. 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提取。

  1. def normalize(self, s, with_sub=True): 
  2.        #urldecode 
  3.        while True: 
  4.            new_s = parse.unquote(s, encoding='ascii', errors='ignore') 
  5.            if new_s == s: 
  6.                break 
  7.            else: 
  8.                s = new_s 
  9.        #normalize 
  10.        if withsub: 
  11.            s = re.sub('ufffd', 'a', s) 
  12.            s = re.sub('[a-zA-Z]', 'a', s) 
  13.            s = re.sub('d', 'n', s) 
  14.            s = re.sub('a+', 'a+', s) 
  15.            s = re.sub('n+', 'n+', s) 
  16.            s = re.sub(' ', '', s) 
  17.        return s 

四、实现

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

1. 向量化和参数异常分数

(编辑:厦门网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读