深度学习之Keras检测恶意流量
Keras介绍
Keras是由 Python 编写的神经⽹络库,专注于深度学习,运⾏在 TensorFlow 或 Theano 之上。TensorFlow和Theano是当前⽐较流⾏的两⼤深度学习库,但是对初学者来说相对有些复杂。Keras 使⽤简单,结构清晰,底层计算平台可基于 TensorFlow 或 Theano 之上,功能强⼤。Keras 可运⾏于 Python 2.7 或 3.5 环境,完美结合于 GPU 和 CPU,基于 MIT licen 发布。Keras 由 Google ⼯程师François Chollet开发和维护。
安全能⼒&感知攻击
音箱维修
如何监控感知⼀个安全的应⽤边界,提升边界的安全感知能⼒尤为重要,那么常见七层流量感知能⼒⼜有哪些?
静态规则检测⽅式,来⼀条恶意流量使⽤规则进⾏命中匹配,这种⽅式见效快但也遗留下⼀些问题,举例来说,我们每年都会在类似WAF、NIDS 上增加⼤量的静态规则来识别恶意攻击,当检测规则达到⼀定数量后,后续新来的安全运营同学回溯每条规则有效性带来巨⼤成本、规则维护的不好同样也就暴露出了安全风险各种被绕过的攻击未被安全⼯程师有效识别、规则数量和检测效果上的冗余也降低了检测效率、海量的攻击误报⼜让安全运营同学头⼤,想想⼀下每天你上班看到好⼏⼗页的攻击告警等待确认时的表情 凸 (艹⽫艹) 凸。
如何使⽤多引擎的⽅式对数据交叉判断,综合权重计算形成报告,提升安全运营通过对七层恶意流量的感知能⼒同时攻击降低漏报率,其中是有很多种引擎或⽅案可以考虑的,⽐如最近⼏年流⾏的语义识别、AI 识别等等,本⽂主要说⼀下通过其中⼀种 AI ⽅式进⾏补充交叉识别恶意攻击。
常见攻击&XSS
在 Web 漏洞中常见的数量最多的漏洞应该是 XSS 了,XSS 跨站脚本 (Cross Site Script),在 Web 页⾯中,导致攻击者可以在 Web 页⾯中插⼊恶意 JavaScript 代码 (也包括 VBScript 和 ActionScript 代码等),⽤户浏览此页⾯时,会执⾏这些恶意代码,从⽽使⽤户受到攻击。
有的安全同学可能⾮常不屑,认为这是垃圾洞有些 src 确实也这么认为的看到 xss 直接忽略,说 xss
垃圾的理由很多,⽐如什么现在都上https、http-only。你是打不到我的核⼼ Cookies 的⼀样没⽤,其实想想笔者也在刚⼊⾏的时候在某 SRC ⽇夜审洞,⼀边审核⼀边骂这些都是垃圾洞没鸟⽤。等到笔者真正在进⾏渗透的时候发现⼀个垃圾 XSS 洞也可以有很多种⾼级玩法,⽐如可以⽤ XSS 嗅探内⽹,⽤XSS 获取 redis-shell、struts-shell、后渗透等。
兔子请老虎实现思路
⽤神经⽹络搭建⼀个 XSS 攻击感知器,⼀般我们说达到 3 层的神经⽹络才称为深度神经⽹络,⽽组成神经⽹络的就是感知器,本次使⽤输⼊的 XSSplayload 预测使⽤⼆分类的⽅式判断是否为 xss。
进⼊正⽂,使⽤ AI 模型达到的效果,测试结果在测试集与验证集上准确率和召回率都达到 95% 以上,预测效果:
恶意流量:/examples/jsp/jsp2/el/arch=<SCript>alert('xss')</scRIpt>
恶意流量:/iajtej82.dll?<img src='javascript:alert(cross_site_scripting.nasl);'>
恶意流量:/examples/jsp/jsp2/el/arch=<prompt>alert(/1/)</prompt>
恶意流量:/cgi-bin/index.php?gadget=glossary&action=viewterm&term=<script>alert('jaws_xss.nasl');</script>
恶意流量:/fmnveedu.htm?a=<marquee loop=1 width=0 onfinish=confirm(1)>0</marquee>
数据集结构,准备了两个⽂本⽂档,⿊⽩样本各 10+万,其中恶意样本内容如下,每⾏代表⼀个 xss 的 playload。
<script>co\u006efir\u006d`1`</script>
<ScRiPt>co\u006efir\u006d`1`</ScRiPt>
<img src=x onerror=co\u006efir\u006d`1`>
<svg/onload=co\u006efir\u006d`1`>
<iframe/src=javascript:co\u006efir\u006d%281%29>
电脑怎么截屏快捷键
<h1 onclick=co\u006efir\u006d(1)>Clickme</h1>
<a href=javascript:prompt%281%29>Clickme</a>
<a href="javascript:co\u006efir\u006d%28 1%29">Clickme</a>
<textarea autofocus onfocus=co\u006efir\u006d(1)>
<details/ontoggle=co\u006efir\u006d`1`>clickmeonchrome
<p/id=1%0Aonmoumove%0A=%0Aconfirm`1`>hoveme
<img/src=x%0Aonerror=prompt`1`>
<iframe srcdoc="<img src=x:x onerror=alert(1)>">
"><h1/ondrag=co\u006efir\u006d`1`)>DragMe</h1>
对于⽂本类的特征⼯程有很多实现的⽅式这⾥我们⽤最简单的 ord 函数将所有字符转换为 ASCII 字符进⾏向量化python ord 作⽤,对基础字符进⾏常规化操作转⼩写、去标点、将字符串拆分,这⾥的拆分其实并不需要拆分那么多,只要最⼤情况下可以保留特征即可。
def handle(lf, payload):
payload = urllib.par.unquote(payload.lower().strip())
# 数字泛化为"0"
payload = re.sub("\d+",'0', payload)
# 分词
r ='''
带门的成语(?x)[\w\.]+?\(
|\)
|"\w+?"
|'\w+?'
|\w
中国抗日军政大学|</\w+>
|<\w+>
|<\w+
|\w+=
|>
|[\w\.]+
'''
"""
原始链接
/0_0/e/data/ecmditor/infoeditor/epage/tranflash.php?a=0"><script>alert(/0/)</script>< 1
分词链接
['0_0/e/data'/ecmditor/infoeditor/epage/tranflash.php?', 'a=', '0', '>', '<script>', 'alert(', '0', ')', '</script>']西装品牌排行榜
"""
nltks = p_tokenize(payload, r)
temp =[]
for item in nltks:
if len(item)<=3or len(item)>=10:
continue
el:
for char in item:
temp.append(ord(char))电脑回收站在哪里
return temp
正常样本集参考,没有条件的同学将 URL 请求参数⾥的 key-value ⾥的 value 都提取出来每⾏⼀个放到⽂本⾥进⾏训练也可以,因为真正在预测的时候我们都是直接将 URL 中的 value 进⾏提取预测。
b1498592370545=1&v=13111002&COLLCC=3442798258&
t=check&rec=stratus&etyp=connect&zone=zibo5_cnc&url=119.188.143.32&errCnt=327&uid=d0a47beafc75e1549c7fdc23530fd959&uif=CNC|BeiJing-11 4.251.186.13&tvid=7706069409&defi=2&dlod=1&darea=1&ppapi=fal&trkip=119.188.143.32&trkon=0&ver=3.1.0.15&dur=36431783
cn_600022,cn_600516,cn_000002,cn_600519,cn_000651,cn_600887,cn_002415,cn_601288,cn_000333,
_=1498179095094&list=sh600030
q=marketStat,stdunixtime&_=1498584939540
_=1498584888937/&list=FU1804,FU0,FU1707,FU1708,FU1709,FU1710,FU1711,FU1712冬奥会结束时间
callback=_ntes_quote_callback54388229
_=1498552987540&list=hf_OIL
⾸先我们获取到所有的正常样本和恶意样本,将正常样本标记为』0′,将恶意样本标记为』1′,将数据集拼接后按 30%,70&进⾏分割,其中 30% 作测试集。这⾥因为 keras 限定 input_shape 输⼊必须是固定长度,所以将 xss 的 playload 最⼤特征限制到最⼤ 50纬,未达到 50 维的⽤ 0 补齐,超过 50 维度的截断,label ⽤ keras ⾃带的 One-Hot Encoding 编码实现⼀个 shape = (len(样本数量),2),