河北时时彩开奖结果走势图 www.nw9nn.com.cn *本文原创作者:fishyyh,本文属FreeBuf原创奖励计划,未经许可禁止转载
本文结合自然语言处理技术,采用卷积神经网络算法训练SQL注入检测模型,主要包括文本处理、提取文本向量和训练检测模型三个部分。由于本人是初学者,也是通过前辈们的文章来学习这方面的知识,很多地方可能理解不够充分,请大家及时纠正。
实验过程中的数据集主要分为三组训练集(用于训练检测模型的数据)、验证集(训练过程中验证模型的准确率)、测试集(测试训练完成后模型的准确率)。
训练集中正常样本24500条,SQL注入攻击样本25527条,XSS攻击样本25112条;验证集中正常样本10000条,SQL注入攻击样本10000条,XSS攻击样本10000条;测试中正常样本4000条,SQL注入攻击样本4000条,XSS攻击样本4000条。
正常样本数据格式如下:
code%3Dzs_000001%2Czs_399001%2Czs_399006%26cb%3Dfortune_hq_cn%26_%3D1498591852632
SQL注入样本数据格式如下:
-9500%22%20WHERE%206669%3D6669%20OR%20NOT%20%284237%3D6337%29
XSS注入样本数据格式如下:
site_id%3Dmedicare%22%3E%3Cscript%3Ealert%281337%29%3C/script%3E%2Casdf
训练过程中使用的数据基本都经过了URL编码,有的可能经过过了多重编码,因此需进行URL循环解码,并且为了减少数字和其他无关因素对数据样本的影响对数据进行范化处理,将数字替换为0,超链接替换为//u。代码如下:
def URLDECODE(payload):
payload=payload.lower()
while True:
test=payload
payload=unquote(payload)
if test==payload:
break
else:
continue
#数字泛化为"0"
payload,num=re.subn(r'\d+',"0",payload)
#替换url为”//u
payload,num=re.subn(r'(http|https)://[a-zA-Z0-9\[email protected]&/#!#\?]+', "//u", payload)
#分词
r = '''
(?x)[\w\.]+?\(
|\)
|"\w+?"
|'\w+?'
|//\w
|</\w+>
|<\w+>
|<\w+
|\w+=
|>
|[\w\.]+
'''
return nltk.regexp_tokenize(payload, r)
未处理的数据样本如下:
1)))%252bAND%252b8941%25253d8941%252bAND
/yk10/?page=54%20LIMIT%201%2C1%20UNION%20ALL%20SELECT%22C%20NULL%2C%20NULL%23
处理后数据样本如下:
['0', ')', ')', ')', 'and', '0=', '0', 'and']
['yk0', 'page=','0', 'limit', '0', '0', 'union', 'all', 'select', 'null', 'null', 'null']
Word2Vec是Google在2013年开源的一款将自然语言转化为计算机可以理解特征向量的工具。Word2Vec主要有CBOW(Continuous Bag-Of-Words)和Skip-Gram两种。CBOW模型训练过程是输入某一个词上下文相关的词对应的词向量,输出是这个词的词向量;而Skip-Gram与之相反,输入特定一个词的词向量,输出该特定词的上下文词向量。
将分词处理完的数据作为文本向量的训练数据,训练得到词向量模型,通过此模型,可将单词转化为计算机所能理解的向量,如单词select经过转化后如下:
[ 5.525984 -2.4446 -0.9985928 -1.6910793 1.8828514 2.8958166
0.90518814 -1.3623474 -1.8427371 0.5957503 -3.9347208 1.4152565
-0.0354603 -7.432402 -0.68348515 -4.0790896]
训练词向量模型的代码如下:
def train_word2vec():
sentences=MySentences(datadir)
cores=multiprocessing.cpu_count()
if os.path.exists(model_dir):
print ("Find cache file %s" % model_dir)
model=Word2Vec.load(model_dir)
else:
model=Word2Vec(size=max_features, window=5, min_count=10, iter=10, workers=cores)
model.build_vocab(sentences)
model.train(sentences, total_examples=model.corpus_count, epochs=model.iter)
model.save(model_dir)
print("save model complete!")
卷积神经网络结构如图所示,由三个卷积层、三个池化层组成,最后连接全连接层:
实现代码如下:
def train_cnn():
forline in open("./file/INPUT_SHAPE"):
input_shape=int(line)
print(input_shape)
INPUT_SHAPE=(input_shape,16)
forline in open("./file/len"):
lens=int(line)
print(lens)
data_size=ceil(lens//(BATCH_SIZE*NB_EPOCH))
print(data_size)
forline in open("./file/valid_len"):
valid_lens=int(line)
print(valid_lens)
valid_size=ceil(valid_lens//(BATCH_SIZE*NB_EPOCH))
print(valid_size)
model= CNN.build(input_shape=INPUT_SHAPE, classes=3)
print('1')
model.compile(loss="categorical_crossentropy",optimizer=OPTIMIZER,
metrics=["accuracy"])
print('2')
call=TensorBoard(log_dir=log_dir+"cnn",write_grads=True)
checkpoint= ModelCheckpoint(filepath='bestcnn',monitor='val_acc',mode='auto',save_best_only='True')
next_batch=data_generator(BATCH_SIZE,input_shape,"./file/x_train")
next_valid_batch=data_generator(BATCH_SIZE,input_shape,"./file/x_valid")
model.fit_generator(batch_generator(next_batch,data_size),steps_per_epoch=data_size,
epochs=NB_EPOCH,callbacks=[call,checkpoint],validation_data=batch_generator(next_valid_batch,data_size),
nb_val_samples=valid_size)
print('3')
model.save('cnn')
print("modelsave complete!")
对测试集的4000个SQL注入攻击样本进行测试结果如下,准确率为0.97,误报率0.03
对测试集的4000个XSS攻击样本进行测试结果如下,准确率0.98,误报率0.02
对测试集的4000个正常进行测试结果如下,准确率0.98,误报率0.02
首先将三组数据集进行分词范化处理,并通过训练得到词向量模型。然后将训练集通过词向量模型转化为向量,使用卷积神经网络训练检测模型。最后使用注入检测模型对测试集数据进行检测是否存在攻击。
//www.nw9nn.com.cn/news/142069.html
https://www.cnblogs.com/bonelee/p/7978729.html
刘焱. Web安全之深度学习实战 [M]. 机械工业出版社,2017.
https://github.com/fishyyh/CNN-SQL.git
*本文原创作者:fishyyh,本文属FreeBuf原创奖励计划,未经许可禁止转载
关注我们 分享每日精选文章
7月 深圳
【报名中】2018 SOC&EDR应用建设高峰论坛8月
【报名中】移动互联网黑产技术剖析7月
【报名中】玩转Nmap渗透测试神器6月
【已结束】Web漏洞挖掘“奇淫技巧”总结
已有 36 条评论
建模暴力了点,小数据集下不如用传统机器学习比如svm这种效果好
@ Stardustsky? 事实上,svm需要自己去提取特征,这一部分已经让一大部分人望而却步了,而且想达到同样的准确率,特征提取的数据要非常多。
@ Stardustsky? 泛化能力差。测试集上面九十几,实际拿出去跑才七十几。跟训练集有很大关系
能不用py这种垃圾代码吗, 卷积神经之类的以局部点勾勒全局权值的算法,非常烧资源,(CPU和内存), 却用py这类脚本来写,效率非常低,纯烧钱的, 国内那几家公司都被电脑才刚入门的"高手"骗惨了,工资上,和硬件投入上,烧钱烧不起了,最后取消掉AI研发线了
@ [email protected] 看看numpy,tensorflow之类的源码用啥写的,python的库在里面到底是什么作用。
@ 路人k? 是你们太差了,我20+年的电脑经验了, 第一年学C到现在超过20年(现在我不经常用C,C++,C,C++开发速度太慢,编译速度太慢,语法上,过份的精炼,语言本身的坑很多,多语言联合开发后,很容易记错打错,这些语言几十年了,更新的东西都是像Apple升级那样,越升越慢的,而不是提升开发效率的,所以不得已才使用C,C++), py在所有语言里算是垃圾的了,只不过一群小白在用,现在小白多,所以才…任何事,人多了,假的也变真了, py的库,低层很多是C或其它原生编译文件,但是,调用过程中,是py的,频繁的数据交换,非常占IO,同时交换数据这过程,也是要脚本去内存复制的, 所以,效率还是非常低的
特别是像神经网络这类,海量的循环量, 全部是数据交换,,相对来说,真正计算部分计算量可能反而要小了
@ [email protected] 你可真牛B哦。嘴炮党
@ 360 典型的路人, 没有经验,才会这样说别人, 老人都会,但是,现在过份…的情况下,大家活的都很累,所有创新的心,都被岁月磨平了,剩下还有这心的,无奈还要打拼,为了下吨饭,为了一家人饭,为了做个好髅蚁, 另外,君子不dang!!!!!!!, 麻烦你们说别人时, 不要把这个字放在上面, 这是侮辱人!!!
@ [email protected] 事实上cnn虽然是局部敏感,但是cnn还有个特征是权值共享的呀,从作者的代码来看,作者使用的深度学习框架为keras,keras的后端无论是tensorflow还是theano,都是将图编译后再执行的。而且作者使用的网络层数只有三层,远远达不到你所谓的非常烧资源的地步,所以我认为公司砍掉ai研发并不一定是因为烧钱太多,也有可能是因为像你这样的所谓的比入门牛逼的高手给逼的了
@ test 烧资源,是所有的都烧, 不管用了什么??? 本文中的资源也有限, "安全类"应用,通常不太会有一台完整的真机环境给你使用, 在VPS情况下,通常是1-2核左右,性能是非常差的,而且还会几倍甚至几十倍的多卖情况的, 抛开vps和本文应用, 在其它行业里,几乎所有的神经代码,都是py的, 国人,只会调用别人写好的代码,这些代码,大多数是py的,少量是py包的dll, 效率低下不说,根本没有学到任何技能, 也没有任何教学意义, 一般算法类的东西,除数据用除指针这种初浅常识外(很多小白指针概念意义等都不清晰),非??悸茄妨康?内存IO寻址量,拷贝量,高度数据量是否放在一起,以保证缓冲命中率等,都是认真考虑的, 连stdcall/pascal/fastcall/cdecl/等都是要根据这个API的调用堆栈消耗进行选择的, 这些认真考虑后, 就算纯代码,不使用汇编优化,不使用编译器优化,不使用特定CPU指令优化等, 都能保证算法效率很高(这些优化,太费时间,不同平台设置不同,还会有兼容性问题,所以能使用通用性代码达到高效率,尽量通用性代码)
跑题太远了, 不扯了,
@ abc 你要知道框架的出现是为了快速的构建模型,你说的这些东西,如果不是一个资深的c/c++程序员需要多少年才能掌握。尤其对于深度学习这种目前处于研究性质的领域,实现成本有多高呢?至于你说的vps等线上环境限制,可以在模型训练好之后使用deep learning for java去调用,当然也可以通过使用caffe 2去生成线上代码,你所谓的各种优化是在模型训练完成之后,线上环境需要考虑的,这篇文章更多的是考虑的是这个问题如何使用深度学习去对sql注入建模。所以你貌似完全没有搞清楚这篇文章是做什么。
@ test 如果用折腾SQL,那么没必要使用py ,只需要讲原理就可以,一般讲原理的,都是伪代码的,不需要跑的起来,只需要明白原理就可以,特别是安全类的,不应该直接给出可用的代码,被新人拿去做坏事,, 至于一些机器效率的,这只是一个普通程序员必须掌握的,至少我从摸电脑学五笔,到会这些东西,花了2年时间(纯自觉,没有任何人教,当年环境根本没有网络这东西,ISDN网,112kbps,10台电脑共用,电信开的"网吧",16多块一个小时的年代,根本不可能上的起网,不像现在这些资源随便一搜一堆的),用py,因为太过丁白,不努力学习基础,只想着黑客速成,或是读书时不好好学,毕业后,找个高大上的单位,骗工资(扯远了…), 研究性质? 如果是研究,就不应该发到这个网上来 这不是物理,医学等行业, 弄出一个理论或方法,需要其它各式各样的条件成熟才能使用, 计算机类的,离直接使用更近一些的,非常草根(吊丝,民工)的行业了, 你提到java, java是个变态产物,主要是后台有钱,不然早就像Flash那样倒闭了, Java,ZIP一就叫编译,甚至连注释都在里面, 后来混谣一下,实际根本没有变,到了安卓时代,字节码一下,但是本质还是没变,这个字节码结构上还是开发者代码结构,所以运行效率非常低, 他原本可以在不同平台上,第一次运行时,生成一份真编译文件,这样开发和运行都能保证效率,可是老外太懒了, 安卓系统同样的情况, GG从一路人那里买来安卓的代码,但是那路人也就凭一时拼命,做出来,后面,因为技术太差,GG也只是拿这个去资本运动,而不是真的要做好做强, 所以现在安卓硬件配置明显比IOS高很多,但还是不流畅. 以前B/C/pascal/fox等老人快做古了,没有精力去创新了,而新人技术底子太差,没有能力去创建一门像样的语言, 所以py,java之流,这么懒… 扯远了, 我扯这些只是希望你清楚py,java等这些的本质原因, 然后明白 ,一个教学,或是论文类的文章,应该提供的是伪代码,这样读者面对大量代码时,不淹没在辅助的代码里,更容易看明白原理本身.知道原理后,可以非常轻松的用不同语言去实现,这样保证效率, 如果真用于XX时,也能保证可行性(大多数肉鸡,特别是win根本不可能装有py的,而py官方只提供GUI的setup,你需要拿到RDP权限,py还有版本兼容性问题等, linux下,使用时,需要有root权限才能安装东西, 相对,如果是一个exe/elf/bash脚本等,那就方便的多了,初级权限即可)
@ abc 不提供代码,谁知道你是不是在瞎扯淡呢,不能复现的文章多了去了,给出代码才是对自己研究的自信。但是你说来说去都是从语言本身去反驳,这有什么意义么?此外,python的安装,win我不太清楚,但是linux下是完全不需要root用户的,你都没有试验过,你怎么能直接这么说呢?
@ abc 看的出来你真的是自学的,而且你讲的有条有理,思维缜密;呸!我编不下去了,你写这么一大堆的文字扯了半天,什么都没扯明白!
你说烧资源,还 cpu 。What the fuck did you say ? 机器学习,人工只能 他们需要的是 并行运算,所以烧不到 CPU!
大哥拜托搞搞清楚 不要觉得 看过两本书就啥都晓得了,机器学习、人工智能 使用 python 是由客观原因的。 这个领域本身就不是成熟的领域,有很多的未知,这叫做科研、研发 地地道道的研发。人工智能一旦有重大突破那就是科技革命。所以 我们可爱的 工程师 在编程上肯定是要选择敏捷的来提高工作效率。 你说 Android 买了个 GC 所以 XXXX,Java 回收机制了解下? 瞎叨叨,你要是真有本事、真牛逼 py 的 tps 统计数据给我门看下,GC 回收 把数据拿出来。
你说 Java 编译后的字节码结构还是开发者的代码结构,所以效率非常低。 What the fuck did you say ? Java 编译后确实大体上还是 开发者的代码结构,但是中间的优化和预处理 适合你 闹着玩儿的吗?强引用和弱引用是 装X用的?
还有就是你提到权限这个问题 居然和方便扯上关系了,你别笑破了 Linus 的肚皮吧。兄弟,别怪我嘴下不留情;因为读了你的文章我不舒服,所以没忍住。我认为你有必要调整下
@ test windows的安装包是msi的,系统的msi依赖库低了,我估计连安装程序都跑不上进心来而装msi依赖库,是需要.net环境的,拿到一个桌面,你还需要热心给用户打补丁,装一堆东西.. 装完后,还要去系统卸载项,开始菜单等好多地方,删掉菜单项,在远程cmd重定向模式下运行时(哪怕你是"SYSTEM"级用户权限比admin还高,但可能py的库编译问题,或调用问题,根本不能运行py代码,就算能运行,这么一堆折腾下来, 估计 你的做案证据再怎么清理也清理不干净了, 如果是一个exe那就简单多了 , linux,普通登录用户,没有root时,一些内容装的用户的home目录中,但是还有一些非登录用户呢,黑客类的,前面提初级用户,自然是指最低级仅仅能运行程序级别,比如php,nginx,mysql之类的非登录用户,同样linux,在用户电脑中安装这些东西 还要清理, 这一点也不像是黑客做风
不提供代码,但是伪代码,是可以表明的, 任何一个干程序的人, 如果连这代码的功效如何都没数,那估计他是做黑产(伸手党)的吧
@ abc 呵呵
@ [email protected] 用cpu难怪烧掉,估计连人工智能的小白水平都没有达到,稍微有点常识都知道使用GPU
@ sumiting 这里用词GPU,CPU有区别吗, 你这是故意找茬!!!! 我第一份opencl代码到现在没几天就要10年了, 前面有人提到numpy等是DLL的由py调用, 那么,py代码块间数据流转,py和dll的数据流转,都是CPU的,不可能是GPU的,哪怕都是指针调用,每个参数只有4/8字节,但量大后,时间浪费非??晒?,一些py库,通用算法???所以不是给张图,让他自己去提取特征这样争对性算法的DLL. 每个特征形成,都需要不同参数,不同循环结合, 最终参数交换量非常大,因为是脚本语言,他还要维护一个脚本指令的内存表,等等, 科普一下: CPU是顺序执行, GPU是并行单元,每个单元的非常小,内存量和代码量都非常小,但总体并行量可以非常大,你可以一次性给他几万个任务(类似线程)一起执行,每个任务,GPU在大量循环时效率非常低(因为循环时要保证寄存器值),所以,原有代码要全部重写,改装成gpu, 这样类似cnn这些,本身是局部,抽象成全局的, GPU重写代码时,比较省心, 实际运行时,一口气把大块数据提交给GPU,而不是像CPU那样等用到哪个数据才递给CPU,全海量基础数据计算完了,最后由CPU或是GPU总结工作,GPU和CPU之间表面看带宽pcie的,但实际数据交换很费时间的(现在新卡新驱动,交换速度有没有加快到内存级别不知道,我开发那时, 100M数据提交给显卡, 几百ms,几个字节的小数据量提交也比较费, 感觉是每次提交都要有个基础时间,太久没弄opencl,现在接口友好性上有没有大改进,不清楚)
@ [email protected] emmm那你挺棒的
@ [email protected] py在开发上所需投入的时间成本要低不用py开发你倒是说说要用什么?
我觉得吧吐吐槽,开开玩笑,匿名无所谓,但是真的要撕逼的话还是别匿名了吧,不然一堆人在这匿名撕逼,谁是谁都不知道,说不定都是一个人的小号呢。仅个人观点。
不要误会,我不是针对谁,我只想说楼上的各位都是垃圾,要想吐槽请秀出你们的代码,no code you show jb?
666
666
666
作者只是阐明了一下自己的观点。。。一种思路而已,不过各位大神认真的态度,是极好的
笑死人不偿命哦,作为菜鸡看这种装逼还是很有意思的
训练集的数据从哪里来?
@ JasonHei? 客观原因? 真正的客观原因是老外只是业余随便写写,所以用了py,而国内去拿这去当高负荷任务去使用, 招人是HR部门,,国内除了一些老板亲自打拼的公司,大多数公司靠上头资助,或是资本运作等,仅有那么几个懂技术的无权招人,这才是py之类大行行道的客观原因!! 脚本语言(py,java等),CPU时间消耗是普通程序的100倍1000倍或更多, 同样的工作,真编译的,100万硬件投资就够了,可是用py等,1亿都不够,事实上像BD等,投资几十亿,几百亿吧,最后这个项目还是烧不起钱,废弃了(废弃到什么程度不清楚, 有新闻报导过,后来又出来辟谣,不过辟谣的内容太不真,所以,,,) 你们这些人,只考虑小成果,不考虑全局成本投入,项目最终是否能可行等,只管拿工资,太不负责任了点, 同样是字节码, VB,C#就比java高效多(VB明显快于C#),在开发过程中,类型不确定,这对开发有一定的帮助,但是,现在很多字节码,在打包后,还是不定类型, 仅仅是把语言关键字,替换成编号,运行时,根据编号去处理原有逻辑,效果上,就是省去了字符串解析过程+代码压缩, 里面按你说的有优化, 这么点算优化还拿到台面上来说, 你不怕linus之类的笑话? smali文件就是java字节码的明文格式, 根本没有购资格称"优化"的东西, java回收机制, 哪个程序没有回收机制? 没看过java运行器的代码,但这种回收机制随便想想出来的效率就和java不远了, 不同类型的弄个列表 ,每个项目有个权值, 和计数器, 不用了,权值低了就free掉,这种常规代码,需要拿出来说事?
@ [email protected] 说c/c++高效的,先把这篇文章用c/c++完整复现出来再说吧
其实有些专门研究算法的老外,还是用python写,然后提高性能,转成c或是c++再实现一遍。
@ test 楼上, 这是教育片! 幼稚啊,八成还在读书,闲的慌,才会这样说话, 上了班后你就会知道, 一年下来也没有几天上是可以好好的睡一下的, 不管是给自己加班还是给别人加班, 自己接私活等 这种垃圾代码, 99%的程序员, 是不会去写一遍的 ,更不会去重写的, 自己不要用, 也没有放github供别人学习的意义
感觉这个abc是某人训练的一个互怼AI聊天机器人
FileNotFoundError: [Errno 2] No such file or directory: ‘file/word2model’
这是什么原因,求教
@ 独行者444? 应该先创建file文件夹,然后先运行word.py进行预处理
@ 独行者444? 你看一下是不是因为没创建file,还是说没先运行word.py进行预处理