Web安全之机器学习入门 第2章-第5章学习笔记
第2章 打造机器学习工具箱
本章重点介绍Python语言在机器学习领域的优势和应用,包括几个重点库: NumPy、SciPy、NTLK、Scikit-Leam的简介、环境依赖以及安装,最后介绍TensorFlow的简介及安装。为后续的学习准备好工具箱。
2.1 Python在机器学习领域的优势
2.1.1 Numpy
NumPy包括:
•一个强大的N维数组对象Array;
•比较成熟的(广播)函数库;
•用于整合C/C++和Fortran代码的工具包;
•实用的线性代数、傅里叶变换和随机数生成函数。
NumPy提供了许多高级的数值编程工具,如:矩阵数据类型、矢量 处理,以及精密的运算库,专为进行严格的数字处理。
1.安装方法
pip install --user numpy
2.用法示例
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
c = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]])
print(b)
print(c)
print(c.dtype)
print(a.shape)
print(c.shape)
'''
输出
[5 6 7 8]
[[ 1 2 3 4]
[ 4 5 6 7]
[ 7 8 9 10]]
int32
(4,)
(3, 4)
'''
import numpy as np
a = np.arange(10)
print(a[5])
print(a[3:5]) # [a[3],a[5])
print(a[:5])
a[2:4] = 100, 101
print(a)
print(a[1:-1:2])
print(a[::-1])
print(a[5:1:-2])
b = a[3:7]
print(b)
b[2] = -10
print(b)
print(a)
'''
输出
5
[3 4]
[0 1 2 3 4]
[ 0 1 100 101 4 5 6 7 8 9]
[ 1 101 5 7]
[ 9 8 7 6 5 4 101 100 1 0]
[ 5 101]
[101 4 5 6]
[101 4 -10 6]
[ 0 1 100 101 4 -10 6 7 8 9]
'''
import numpy as np
a = np.arange(12).reshape(2, 3, 2)
b = np.arange(12, 24).reshape(2, 2, 3)
print(a)
print(b)
c = np.dot(a, b)
print(c[0, :, 0, :])
print(np.dot(a[0], b[0]))
'''
[[[ 0 1]
[ 2 3]
[ 4 5]]
[[ 6 7]
[ 8 9]
[10 11]]]
[[[12 13 14]
[15 16 17]]
[[18 19 20]
[21 22 23]]]
[[ 15 16 17]
[ 69 74 79]
[123 132 141]]
[[ 15 16 17]
[ 69 74 79]
[123 132 141]]
'''
dot
inner
outer
2.1.2 SciPy
SciPy是一款方便、易于使用、专为科学和工程设计的Python工具包。它包括统计、优化、整合、线性代数模块、傅里叶变换、信号和图像处理、常微分方程求解器等等。
安装方法:
pip install --user numpy scipy matplotlib iPython jupyter pandas sympy nose
2.1.3 NLTK
NLTK在NLP领域中是最常使用的一个Python库,包括图形演示和示例数据,其提供的教程解释了工具包支持的语言处理任务背后的基本概念。
安装程序如下:
pip install -U nltk
加载数据如下:
import nltk
nltk.download()
2.1.4 Scikit-Learn
Scikit-Leam是基于Python的机器学习模块,基于BSD开源许可证。
这个项目最早于2007年发起,目前也是由社区自愿者进行维护的。 Scikit-Learn官方网站上可以找到相关的Scikit-Learn的资源、模块下载、 文档、例程等等。Scikit-Learn的基本功能主要分为6个部分:分类,回归,聚类,数据降维,模型选择,数据预处理。
依赖的环境:
•Python (>=2.6 or >=3.3)
•NumPy (>=1.6.1)
•SciPy (>=0.9)
安装方法:
pip install -U scikit-learn
2.2 TensorFlow简介与环境搭建
TensorFlow是一个采用数据流图、用于数值计算的开源软件库。
安装方法如下:
仅使用CPU的版本
$ pip install https:
//storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_6
开启GPU支持的版本(安装该版本的前提是己经安装了 CUDA sdk)
$ pip install https:
//storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.5.0-cp27-none-linux_x86_6
我们推荐使用virtualenv创建一个隔离的容器来安装TensorFlow,这
样做能使排查安装问题变得更容易。
首先,安装所有必备工具:
在 Linux 上:
$ sudo apt-get install python-pip python-dev python-virtualenv
#在Mac上:
$ sudo easy_install pip
# 如果还没有安装 pip
$ sudo pip install --upgrade virtualenv
接下来,建立一个全新的virtualenv环境。为了将环境建在 〜/tensoflow目录下,执行:
$ virtualenv --system-site-packages ~/tensorflow $ cd ~/tensorflow
然后,激活virtualenv:
$ source bin/activate # 如果使用 bash
$ source bin/activate.csh # 如果使用 csh
(tensorflow)$ #终端提示符应该发生变化
在virtualenv内,安装TensorFlow:
(tensorflow)$ pip install -U TensorFlow
当使用完TensorFlow:
(tensorflow)$ deactivate # 停用 virtualenv
第3章 机器学习概述
3.1机器学习基本概念
1.有监督学习
2.无监督学习
3.准确率与召回率
3.2数据集
3.2.1 KDD99数据
KDD是知识发现与数据挖掘(Knowledge Discovery and Data Mining)的简称,KDD CUP是由ACM组织的年度竞赛。
KDD 99数据集就是KDD竞赛在1999年举行时采用的数据集。
3.2.2 HTTP DATASET CSIC 2010
HTTP DATASET CSIC 2010包含大量标注过的针对Web服务的 36000个正常请求以及25000个攻击请求,攻击类型包括sql注入、缓冲区溢出、信息泄露、文件包含、xss等,被广泛用于WAF类产品的功能评测。
3.2.3 SEA数据集
SEA数据集涵盖70多个UNIX系统用户的行为日志,这些数据来自 于UNIX系统acct机制记录的用户使用的命令。
3.2.4 ADFA-LD 数据集
ADFA-LD数据集是澳大利亚国防学院对外发布的一套主机级入侵检测系统的数据集合,被广泛应用于入侵检测类产品的测试。该数据集包括Linux和Windows,记录了系统调用数据,Gideon Creech是这个项目的负责人,项目主页为:https://www.unsw.adfa.edu.au。
3.2.5 Alexa域名数据
Alexa是一家专门发布网站世界排名的网站。
3.2.6 Scikit-Learn 数据集
Scikit-Leam自带的数据集合也十分经典,其中最常见的是iris数据集。
3.2.7 MNIST 数据集
MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图 片。
3.2.8 Movie Review Data
Movie Review Data数据集包含1000条正面的评论和1000条负面评论,被广泛应用于文本分类,尤其是恶意评论识别方面。
3.2.9 SpamBase 数据集
SpamBase是入门级的垃圾邮件分类训练集。
3.2.10 Enron 数据集
机器学习领域使用Enron公司的归档邮件来研究文档分类、词性标注、垃圾邮件识别等,由于Enron的邮件都是真实环境下的真实邮件,非常具有实际意义。
3.3特征提取
机器学习中,特征提取被认为是个体力活,有人形象地称为“特征工程”,可见其工作量之大。特征提取中数字型和文本型特征的提取最为常见。
3.3.1数字型特征提取
数字型特征可以直接作为特征,但是对于一个多维的特征,某一个特征的取值范围特别大,很可能导致其他特征对结果的影响被忽略,这时候我们需要对数字型特征进行预处理,常见的预处理方式有以下几种。
-
标准化
-
正则化
-
归一化
3.3.2文本型特征提取
文本型数据提取特征相对数字型要复杂很多,本质上是做单词切分,不同的单词当作一个新的特征。
文本特征提取有两个非常重要的模型。
•词集模型:单词构成的集合,集合中每个元素都只有一个,即词集中的每个单词都只有一个。
•词袋模型:如果一个单词在文档中出现不止一次,并统计其出现的次数(频数)。
两者本质上的区别,词袋是在词集的基础上增加了频率的维度:词集只关注有和没有,词袋还要关注有几个。
假设我们要对一篇文章进行特征化,最常见的方式就是词袋。
3.3.3数据读取
平时处理数据时,CSV是最常见的格式,文件的每行记录一个向 量,其中最后一列为标记。TensorFlow提供了非常便捷的方式从CSV文 件中读取数据集。
加载对应的函数库:
import tensorflow as tf
import numpy as np
从CSV文件中读取数据:
training_set = tf.contrib.learn.datasets.base.load_csv_with_header(
filename=" iris_training.csv",
target_dtype=np.int,
features_dtype=np.float32)
feature_columns = [tf.contrib.layers.real_valued_column('"', dimension=4)]
其中各个参数定义为:
•filename,文件名;
•target_dtype,标记数据类型;
•features_dtype,特征数据类型。
访问数据集合的特征以及标记的方式为:
x=training_set.data
y=training_set.target
3.4效果验证
效果验证是机器学习非常重要的一个环节,最常使用的是交叉验证。
第4章 Web安全基础
本章将梳理一下常见的Web安全问题,为后续的机器学习应用打好基础。包括:XSS攻击的概念、危害、分类、常见的攻击方式、攻击载荷以及特殊的攻击变种和XSS平台等,SQL注入攻击的常见自动化攻击工具以及近年典型的几起SQL注入攻击事件,WebShell的危害、功能以及常见类型,僵尸网络的概念、形成、危害以及近几年典型的僵尸网络攻击事件。强烈建议读者借此机会重温相关基础知识。
4.1 XSS攻击概述
XSS (Cross Site Scripting,跨站脚本攻击),为不和CSS (Cascading Style Sheets,层叠样式表)的缩写混淆,故将跨站脚本攻击缩写为XSS。XSS是一种经常出现在Web应用中的计算机安全漏洞,它允许恶意Web用户将代码植入到提供给其他用户使用的页面中。 比如,这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制,例如同源策略。
XSS的危害:
•盗取各类用户账号,如机器登录账号、用户网银账号、各类管理员账号;
•控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力;
•盗窃企业重要的具有商业价值的资料;
•非法转账;
•强制发送电子邮件;
•网站挂马;
•控制受害者机器向其他网站发起攻击。
4.1.1 XSS的分类
- 反射型XSS
反射型XSS也被称为非持久性XSS,是现在最常见的一种XSS漏洞。XSS的Payload—般写在URL中,之后设法让被害者点击这个链接。
假设后端代码为:
<?php
$username = $_GET['username'];
echo $username;
?>
XSS攻击对应链接为:
http://xi.baidu.com?username=<script>alert(/xss/)</script>
- 存储型XSS
存储型XSS又称为持久型XSS,存储型XSS是最危险的一种跨站脚本。存储型XSS被服务器端接收并存储,当用户访问该网页时,这段 XSS代码被读出来响应给浏览器。反射型XSS与DOM型XSS都必须依靠用户手动触发,而存储型XSS却不需要。
3.D0M 型 XSS
DOM的全称为Document Object Model,即文档对象模型。基于DOM型的XSS是不需要与服务器交互的,它只发生在客户端处理数据阶段。简单理解DOM XSS就是出现在JavaScript代码中的XSS漏洞。
假设存在DOM XSS漏洞的前端代码如下:
<script>
var temp = document.URL;
var index = document.URL.indexOf("content=")+4;
var par = temp.substring(index);
document.write(decodeURI(par));
</script>
如果输入如下链接就会产生XSS漏洞:
http://xi.baidu.com?content=<script>alert(/xss/)</script>
这种利用也需要受害者点击链接来触发,DOM型XSS是前端代码中存在了漏洞,而反射型XSS是后端代码中存在了漏洞。反射型和存储型 XSS是服务器端代码漏洞造成的,Payload在响应页面中,在DOM型XSS中,Payload不在服务器发出的HTTP响应页面中,当客户端脚本运 行时(渲染页面时),Payload才会加载到脚本中执行。
4.1.2 XSS特殊攻击方式
目前已经出现了利用js的特性进行特殊编码变形绕过防御的手段, 举例如下。
1.Jsfuck
Jsfuck可以针对常见的js函数、语法进行编码转换:
False => ![]
True => !![]
Nan => +[![]]
0 => +[]
1 =>+!+[]
2 => !+[]+!+[]
10 => [+!+[]]+[+[]]
Array => []
Number => +[]
String => []+[]
Boolean => ![]
Function => [][''filtern]
Eval => [][nfiltern][nconstructorn]( code )()
Window => [][nfiltern][nconstructorn](nreturn this")()
2.Aaencode
js加密工具aaencode把js转为文字表情符号。
4.1.3 XSS平台简介
目前市面上有大量的XSS平台,自动生成js攻击载荷,大大减小了攻击难度,主要步骤如下:
•注册XSS平台账户;
•获得XSS攻击代码,主要功能是获取用户cookie、ua、ip等信息:
•结合XSS漏洞构造恶意链接:
恶意代码将注入到回显页面中,当用户访问该页面时,恶意代码将执行,受害者在testdomain.com下的cookie将被获取,黑客随即可获得受害者在这个域下的权限。比较常见的做法是通过钓鱼邮件、 im消息等方式诱骗受害者点击。
4.1.4近年典型XSS攻击事件分析
1.雅虎邮箱XSS漏洞
2.WordPress插件Jetpack存储型XSS漏洞
4.2 SQL注入概述
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
4.2.3 SQL常见工具
1.sqlmap
sqlmap是一款用来检测与利用SQL注入漏洞的免费开源工具,它有一个非常棒的特性,即对检测与利用的自动化处理(数据库指纹、访问底层文件系统、执行命令)。读者可以通过位于SourceForge的官方网站 下载sqlmap源码: http://sourceforge.net/projects/sqlmap/。
2.HAVIJ
HAVIJ是一款自动化的SQL注入工具,它能够帮助渗透测试人员发现和利用Web应用程序的SQL注入漏洞。
4.3 WebShell 概述
WebShell就是以ASP、PHP、JSP或者CGI等网页文件形式存在的一种命令执行环境,也可以将其称为一种网页后门。黑客在入侵了一个网站后,通常会将ASP或PHP后门文件与网站服务器Web目录下正常的网页文件混在一起,然后就可以使用浏览器来访问ASP或者PHP后门,得到一个命令执行环境,从而达到控制网站服务器的目的。
顾名思义,“Web”的含义显然是需要服务器开放Web服 务,“shell”的含义是取得对服务器某种程度上的操作权限。由于 WebShell大多是以动态脚本的形式出现,也有人称之为“网站的后门工具”。
4.3.1 WebShell 功能
简单总结一下,WebShell通常具备以下功能:
•环境探针;
•资源管理;
•文件编辑;
•执行OS命令;
•读取注册表;
•创建Socket;
•调用系统组件。
4.4僵尸网络概述
僵尸网络(Botnet)是指采用一种或多种传播手段,使大量主机感染bot程序(僵尸程序)病毒,从而在控制者和被感染主机之间所形成 的一个可一对多控制的网络。攻击者通过各种途径传播僵尸程序感染互联网上的大量主机,而被感染的主机通过一个控制信道接收攻击者的指令,组成一个僵尸网络。之所以用僵尸网络这个名字,是为了更形象地让人们认识到这类危害的特点:众多的计算机在不知不觉中如同中国古老传说中的僵尸群一样被人驱赶和指挥着,成为被人利用的一种工具。
僵尸网络是互联网上受到黑客集中控制的一群计算机,往往被黑客 用来发起大规模的网络攻击,如分布式拒绝服务攻击(DDoS)、海量垃圾邮件等,同时黑客控制的这些计算机所保存的信息,譬如银行帐户的密码与社会安全号码等也都可被黑客随意“取用”。因此,不论是对网络安全运行还是对用户数据安全的保护来说,僵尸网络都是极具威胁的隐患。僵尸网络的威胁也因此成为目前国际上十分关注的一个问题。
4.4.1僵尸网络的危害
-
拒绝服务攻击
-
发送垃圾邮件
-
窃取秘密
-
滥用资源
-
僵尸网络挖矿
第5章K近邻算法
K近邻算法是我们介绍的第一个机器学习算法,同时它也是机器学习领域大名鼎鼎的分类算法之一,虽然它原理非常简单,但是在非常多的领域有着广泛的应用。本章将介绍K近邻算法的基本概念,并给出基本的使用方式,介绍如何使用K近邻基于不同的特征提取方式来检测异常操作,如何使用K近邻检测Rootkit,如何使用K近邻检测WebShell 等。
5.1 K近邻算法概述
K近邻(K-Nearest Neighbor,KNN)算法是机器学习领域使用最广泛的算法之一,所谓KNN,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的K个邻居来代表。KNN算法的核心思想是:如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策时,只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法在类别决策时, 只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别,因此对于类域交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
KNN常用的算法为:
•Brute Force;
•K-D Tree;
•Ball Tree。
import numpy as np
from sklearn.neighbors import NearestNeighbors
x = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(x)
distances, indices = nbrs.kneighbors(x)
print(indices)
print(distances)
print(nbrs.kneighbors_graph(x).toarray())
# KNN用于监督学习
X = [[0], [1], [2], [3]]
Y = [0, 0, 1, 1]
from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X, Y)
print(neigh.predict([[1.1]]))
print(neigh.predict_proba([[0.9]]))