一种面向PHP程序的SQL注入行为检测系统的制作方法

文档序号:16070323发布日期:2018-11-24 13:07阅读:260来源:国知局

本发明设计一种基于污点分析的对phpweb应用系统进行sql注入的行为检测模型,通过随机森林分类算法实现sql注入行为的判定,对针对web系统的sql注入攻击行为进行有效检测。

背景技术

随着互联网技术的高速发展,web应用程序在人类生活发展中起到重要的媒介和资产管理作用。然而由于开发人员安全意识不足,全球大部分网站遭受了不同程度的web攻击。据2016年中国网站安全漏洞形势分析报告,sql(structuredquerylanguage)注入攻击占据漏洞类型的44.9%,占网站卫士拦截攻击类型的39.8%。而且web应用一旦被发现sql注入漏洞,容易形成通用漏洞,威胁范围广泛,影响巨大。所以,为保护互联网信息安全,sql注入行为检测是至关重要的一个环节。php(php:hypertextpreprocessor)作为一个优秀的脚本语言,由于其开发周期短、成本低和丰富的扩展资源等优秀特性,在web技术上已成为主流。据2016年web漏洞统计,87%的漏洞对应的开发语言为php。那么,在php应用程序中,检测sql注入行为愈显重要。

面对sql注入行为进行检测的方法很多,如基于文档相似性匹配的检测方法,在最常发生sql注入的位置提取子句,建立恶意子句的哈希库。但在实际应用中发生sql注入的位置较多,难以建立起覆盖面较全的恶意子句库。以网络流量作为数据源,从网络环境中提取恶意请求较正常请求流量中有较大区别的特征检测sql注入。但该检测方法缺乏sql注入行为的针对性,容易将其他攻击行为误判为sql注入行为。

运用支持向量机分类算法检测sql注入,通过片段化的sql语法树,提取语法和语义特征建立多维特征向量,训练svm分类器。该方法的数据来源为数据库日志,由于数据库日志缺少访问者信息,因此该方法并不适用于攻击溯源。传统的基于web日志的sql注入检测技术,将日志中的访问信息作为sql注入检测凭证时,由于信息的不完整性,无法判断用户输入是否进入数据库层。对于php应用程序,污点分析技术被应用于sql注入行为检测中,分为基于不可信源和可信源进行污点分析,通过污点分析技术,能够定位sql语句中外部输入点。

在实现异常检测中,只通过检测不可信源中的攻击关键词等单一特征,并使用规则性的检测方法,存在较高误报率。同时在进行污点标记时,对每个字符都进行来源标记,这种标记方法为其后分词添加了大量不确定性;过多的污点标记和污点净化,难免对正常的业务逻辑产生影响。通常产生sql注入的外部输入点有限,若是对所有可信源进行标记将产生大量冗余操作,并使服务器负载较大。

本模型针对以上缺陷,并基于php应用程序,将污点分析和日志分析技术相结合,通过使用机器学习算法提高sql注入行为检测的有效性和准确率。



技术实现要素:

该发明是基于php扩展技术,重写php原生方法,基于污点标记技术、提取污点子树和词法特征技术,使用随机森林算法等多项先进技术的先进模型。本模型对外部输入信息进行数据整理和特征提取,并通过机器学习进行训练。从而达到对sql注入行为的高准确率检测,同时对筛选出的sql注入行为,记录其攻击载荷和攻击者信息。

该发明旨在实现如下目标:

(1)基于php扩展技术,重写php原生方法,在代码层对sql语句执行函数进行监听。

(2)系统能够收集用户请求的基本数据,有将数据分割、整理、存储以及转化为适合处理的日志文件的数据处理能力。

(3)系统使用深度优先算法、基于树状结构中两个节点所含的信息量的大小计算语义相似度的方法、n-gram模型进行污点子树特征和词法特征提取,使用随机森林算法进行模型训练。

(4)系统具备语义分析能力,通过基于抽象语法树的污点标记技术对污点标记源做语法分析。

(5)系统具备sql注入行为检测能力,可以通过生成用户信息和外部输入有关的日志文件进行sql注入行为检测。

为实现上述目的,该发明采用了如下技术方案:面向php程序的外部输入和用户信息的数据处理模块,基于抽象语法树的污点标记模块,基于污点语法树的污点子树特征提取和词法特征提取模块,基于随机森林算法的sql注入行为检测模块。

数据处理模块包括数据初始化、重写php原生函数监控sql语句调用和污点标记源生成。系统这部分首先对攻击者可控点进行初始化处理,记录sql语句和攻击者身份信息hash值,将外部变量中的元素带入sql语句中进行匹配,对匹配到的内容使用攻击者hash值进行首尾标记,生成污点标记源。

基于抽象语法树的污点标记模块是对污点标记源做语法分析,以主要sql保留字作为树枝节点,对树枝节点分别描述语法规则,生成污点语法树。

基于污点语法树的污点子树特征提取和词法特征提取模块对污点语法树进行污点子树提取、污点子树宽度深度提取、以及污点子树语法相似度分析;对语法树的恶意节点进行泛化,提取节点基本特征,并计算恶意节点组合概率,从而得到词法特征。

基于随机森林算法的sql注入行为检测模块通过随机森林算法对正常样本和恶意样本进行分类训练模型,并使用十字交叉验证对其分类性能进行验证,将得到的训练模型作为检测模块,通过模块检测正常行为和攻击行为,并将攻击行为所包含的攻击者信息和攻击载荷存入数据库。

附图说明

图1是本发明的系统架构图

图2是本发明的系统整体运行流程图

图3是本发明的污点标记源生成图

具体实施方式:

该基于污点分析的sql注入行为检测系统包含四个模块:数据处理模块,污点标记模块,特征提取模块,sql注入行为检测模块。

如图1所示为系统的主要架构图,详细的介绍了sql注入行为检测系统的相关设计及部署架构。其中针对数据处理、污点标记、特征提取、sql注入行为检测几个模块的组成和功能进行了详细的图示。

数据处理模块通过内核提供的“pg(http_globals)”对攻击者可控点进行请求初始化。定义全局数组存取外部变量和外部变量来源,当攻击者可控全局变量被赋值,将信息依次存入数组中,以数组索引值对该变量进行外部标记。当传入参数带有外部标记,将标记转移给返回值,并以标记值作为索引覆盖上述数组中的值。对opcode(operationcode)中函数执行类“do_fcall”和“do_fcall_by_name”自定义处理函数。在处理函数中监控sql函数调用,当传入参数带有外部标记,记录该sql语句。从全局变量“server”中可获取攻击者请求头信息,以ip地址(internetprotocoladdress)、用户代理(user-agent))、httpcookie(cookie)、当前时间戳(timestamp))作为攻击者的标识参数,使用murmurhash算法对以上参数加密,得到识别攻击者的hash值。通过“php_log_err”接口,将上述信息存入日志文件,对于日志中的内容,以攻击者hash作为请求区分点,对日志中记录的信息进行处理。将外部变量中的元素带入sql语句中进行匹配,对匹配到的内容使用上文中的hash值进行首尾标记,作为观测点。将带观测点的sql语句作为污点标记源。

污点标记模块基于抽象语法树的污点标记技术,在构建语法树前,定义语法树的节点结构,包含节点类型,节点值和污点标记。以节点值作为污点语法树的主节点,相邻右节点为污点标记节点,相邻左节点表示节点类型。根据sql语言特性,定义分隔符将sql语句数组化,针对转义符和其他特殊字符对分隔后的数组进行合并或分割处理。根据观测点的首尾标记,对标记之间的元素设置污点标记值为1,由于包含子句的元素在语法分析阶段将被再次分词,因此,若元素包含子句,保留其观测点首尾标记,否则去掉观测点首尾标记。检测节点中的sql保留字,以保留字作为树枝节点,其后节点作为叶节点,并根据保留字选择处理分支。按相应语法规则基于深度优先原则进行解析。

特征提取模块中将特征分为污点子树特征和词法特征两类。对于污点子树特征提取:基于深度优先算法(depth-first-search,dfs)遍历语法树,从头节点开始,搜索污点标记节点,将最先搜索到的污点节点作为污点子树头节点,语法树中的边表示节点与节点之前的嵌套关系,当边同时连接两个污点节点时,将被连接节点加入相应污点子树。最终生成污点子树集中包含了所有污点子树和节点信息。将污点子树子节点最大层数作为其深度,并计算整个污点子树集的平均深度作为结构特征之一;将污点子树中每层节点数量的最大值作为宽度,并计算污点子树集中子树的平均宽度作为结构特征之一。由于正常请求中外部输入值的数值性和赋值规范性,在生成的污点子树集中,每个子树的头节点语义相似度较高,而异常请求生成的污点子树集中,由于某些子树中出现嵌套,其头节点为各类关键字,因此语义相似度较低。基于上述区别,对污点子树集中的子树头节点计算语义相似度作为特征。计算公式如下:

对于词法特征提取:模块先做恶意节点泛化,通过词性可得出污点子树中为关键字、运算符、sql函数的节点。从sql语法规则中提取出985个关键词作为恶意节点内容。将出现表中关键词的节点作为恶意节点并做泛化处理。对于不在表中的特殊字符,如“(”等,保留其原始形式,将其他字符串归一为常量。同时选择恶意节点所占比和节点总数作为基本特征。当出现单个恶意节点时,并不能体现语句是否是sql注入行为。例如“unionselected1”。所以对恶意节点组合出现概率进行计算。对泛化后的节点删除内部常量,以父节点和左节点作为前序节点,组合为只有关键词组成的表达式。该表达式满足内部某关键词状态只与前一关键词状态有关。该表达式作为一个序列具有马尔科夫性质。模块采用n-gram模型建立恶意节点组合的概率模型,用以计算恶意节点组合概率。为避免概率为0导致样本数据稀疏,使用回退算法(katzbackoff)对数据进行平滑处理。将结果作为恶意节点组合概率特征。

在sql注入行为检测模块中,先从sql注入攻击工具中提取各类sql注入的攻击

载荷(payload),以其为样本,基于n-gram模型建立恶意节点组合的概率模型;获得训练样本的污点语法树后,根据恶意节点表,计算节点基本特征;将污点节点序列化,计算恶意节点组合概率;提取污点子树,计算污点子树基本特征,对于非单一元素子树集,计算其子树语义相似度;利用随机森林算法对正常样本和恶意样本进行分类训练,并使用十字交叉验证对其分类性能进行验证。将得到的随机森林分类模型作为异常检测模型。通过该模型进行sql注入行为检测,并将恶意行为的攻击载荷和用户信息存入数据库。

图2所示系统的整体运行流程图,详细介绍了系统整体的运行逻辑。外部输入进入php应用程序,在php代码编译时,通过php扩展获取包含外部输入的sql语句,外部变量和攻击者请求头信息,并将上述信息按格式存入日志文件。从日志文件中读取sql语句和外部变量,生成污点标记源,经过污点标记后,生成污点语法树。基于污点语法树,提取污点子树和词法两类特征,选择随机森林算法对sql注入行为和正常行为进行分类训练,得出异常检测模型。最后再通过异常检测模型判断新的外部输入是否具有sql注入行为。

图3是污点标记源生成图,从全局变量“server”中可获取攻击者请求头信息,以ip地址(internetprotocoladdress)、用户代理(user-agent))、httpcookie(cookie)、当前时间戳(timestamp))作为攻击者的标识参数,使用murmurhash算法对以上参数加密,得到识别攻击者的hash值。将上述信息存入日志文件。再以攻击者hash作为请求区分点,对日志中记录的信息进行处理。将外部变量中的元素带入sql语句中进行匹配,对匹配到的内容使用上文中的hash值进行首尾标记,作为观测点。将带观测点的sql语句作为污点标记源。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1