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

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

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

一个Web访问记录的成分是比较固定的,每个部分(方法、路径、参数、HTTP头、Cookie等)都有比较好的结构化特点。因此可以把Web攻击识别任务抽象为文本分类任务,而且这种思路应用在了安全领域,如有监督的攻击识别[1]、 XSS识别[2] 等。文本分类任务中常用的向量化手段有词袋模型(Bag of Word,BOW)、TF-IDF模型、词向量化(word2vec)等,兜哥的文章[3]已经做了详细的讲解。

经过对Web日志特点的分析,本文认为使用TF-IDF来对样本进行向量化效果更好。一是经过标准化后请求参数的值仍会有非常多的可能性,这种情况下词袋模型生成的特征向量长度会非常大,而且没法收缩;二是每个请求中参数个数有大有小,绝大多数不超过10个,这个时候词向量能表达的信息非常有限,并不能反映出参数value的异常性;三是TF-IDF可以表达出不同请求同一参数的值是否更有特异性,尤其是IDF项。

举个例子, http://ip.taobao.com/ipSearch.html?ipAddr=8.8.8.8 是一个查询IP详细信息的页面(真实存在),在某一段时间内收到了10000个请求,其中9990个请求中ipAddr参数值是符合xx.xx.xx.xx这个IP的格式的,通过0×2中提到的标准化之后,也就是9990个请求的ipAddr参数为n+.n+.n+.n+ (当然这里做了简化,数字不一定为多位)。此外有10个请求的ipAddr是形如alert('XSS')、'or '1' = '1之类的不同的攻击Payload。

经过TF-IDF向量化后,那9900个请求ipAddr=n+.n+.n+.n+这一项的TF-IDF值:

  1. TF-IDF normal = TF * IDF = 1 * log(10000/(9990+1)) = 0.001 

而出现ipAddr=alert('XSS')的请求的TF-IDF值:

  1. TF-IDF abnormal = TF * IDF = 1 * log(10000/(1+1)) = 8.517 

可以看出异常请求参数value的TF-IDF是远大于正常请求的,因此TF-IDF可以很好地反映出参数value的异常程度。

熟悉TF-IDF的同学一定有疑问了,你这TF-IDF的字典也会很大呀,如果样本量很大而且有各式各样的参数value,你的特征向量岂不是稀疏得不行了?对于这个问题,我有一个解决方案,也就是将所有的TF-IDF进一步加以处理,对参数key相同的TF-IDF项进行求和。设参数key集合为K={k1, k2, …, kn},TF-IDF字典为集合x={x1, x2, …, xm}。则每个参数key的特征值为:

  1. vn = ∑TF-IDFxn   xn∈{x | x startswith ‘kn=’} 

具体代码在vectorize/vectorizer.py中:

  1. for path, strs in path_buckets.items(): 
  2.         if not strs: 
  3.             continue 
  4.         vectorizer = TfidfVectorizer(analyzer='word', token_pattern=r"(?u)bSS+b") 
  5.         try: 
  6.             tfidf = vectorizer.fit_transform(strs) 
  7.             #putting same key's indices together 
  8.             paramindex = {} 
  9.             for kv, index in vectorizer.vocabulary.items(): 
  10.                 k = kv.split('=')[0] 
  11.                 if k in param_index.keys(): 
  12.                     param_index[k].append(index) 
  13.                 else: 
  14.                     param_index[k] = [index] 
  15.             #shrinking tfidf vectors 
  16.             tfidf_vectors = [] 
  17.             for vector in tfidf.toarray(): 
  18.                 v = [] 
  19.                 for param, index in param_index.items(): 
  20.                     v.append(np.sum(vector[index])) 
  21.                 tfidf_vectors.append(v) 
  22.             #other features 
  23.             other_vectors = [] 
  24.             for str in strs: 
  25.                 ov = [] 
  26.                 kvs = str.split(' ')[:-1] 
  27.                 lengths = np.array(list(map(lambda x: len(x), kvs))) 
  28.                 #param count 
  29.                 ov.append(len(kvs)) 
  30.                 #mean kv length 
  31.                 ov.append(np.mean(lengths)) 
  32.                 #max kv length 
  33.                 ov.append(np.max(lengths)) 
  34.                 #min kv length 
  35.                 ov.append(np.min(lengths)) 
  36.                 #kv length std 
  37.                 ov.append(np.std(lengths)) 
  38.                 other_vectors.append(ov) 
  39.             tfidf_vectors = np.array(tfidf_vectors) 
  40.             other_vectors = np.array(other_vectors) 
  41.             vectors = np.concatenate((tfidf_vectors, other_vectors), axis=1) 

(编辑:厦门网)

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

热点阅读