2024年2月19日发(作者:)
第37卷 第1 1期 VlOl-37 ・计算机工程 201 1年6月 June 201l NO.11 Computer Engineering 安全技术・ 一文章编号:1llIII卜-3428(2ol1)11—0152—ll3 文献标识码:A 中圈分类号:TP309 种利用PHP防御SQL注入攻击的方法 丁翔,仇寅,郑滔 (南京大学软件学院,南京210093) 摘要:PHP在Web应用程序开发中的广泛运用使得PHPWeb应用程序成为众多恶意攻击者的攻击对象。基于此,通过对PHP解释器和 运行时库的修改,使PHP Web应用程序无需修改便能够防御SQL注入攻击。与传统的利用动态着色方法防御漏洞不同,使用基于可信任 输入的着色机制,采用SQL方言感知的检查方法,可解决传统方法防御Web漏洞的诸多问题,提高防御的准确率,消除误报。实验结果 表明,该方法准确有效,对应用程序执行造成的负载较低。 关健词:动态着色;可信任输入;方言感知;注入攻击 Method of Preventing SQL Injection Attack Using PHP DING Xiang,QIU Yin,ZHENG Tao (Software Institute,Nanjing University,Nanjing 210093,China) ]Abstract]The wide—spread use of PHP in Web application development makes PHP Web application become the target of many malicious attackers.On the basis of this,through the modification of PHP interpreter and runtime libraries.the PI{P Web applications Call prevent SQL injection attack without the modiifcation of the original applications.Different from traditional preventing method based on dynamic tainting,this paper uses the tainting mechanism based on trusted input tainting and SQL dialect—aware check method,solves many existing problems of traditional preventing methods.As a result,this method improves the preciseness of traditional preventing method,without any false positivesExperimental .result shows that the method is precise and highly efficient,has little overhead for the PHP Web applications [Key words]dynamic tainting;trusted input;dialect—aware;injection attack DOI:1 0.3969(i issn.1 000—3428.20 1 1.1 1.052 1概述 PHP在Web应用程序的开发中得到广泛的应用。但是和 用其他语言编写的Web应用程序一样,PHPWeb应用程序也 存在诸多Web安全漏洞。在CVE的最新统计中,SQL注入 日志信息使用。(4)二次注入 l,攻击者通过向系统或数据库 注入恶意数据使得这些恶意数据在Web应用程序使用时触发 SQL注入攻击。 攻击者除了可以利用多种注入源外,攻击本身还存在着 许多类型,详细介绍见参考文献【5j。 由于SQL注入攻击点繁多,攻击手段多样,才使它具备 极强的破坏能力,同时造成防御上的难度。 漏洞数量居于所有Web安全漏洞的第1位。而存在SQL注 入漏洞的应用程序会使攻击者获取后台的数据信息,严重时 甚至能够完全控制后台数据库和底层操作系统,造成信息的 泄露和对宿主系统的破坏,因此,本文对PHP语言的增强使 3着色机制和SQL方言语法感知检查的防御方法 利用着色机制来抵御攻击的方法在防范系统漏洞(如缓 其具备SQL注入的防御能力,有着较强的现实意义。 现有的对PHP Web应用程序SQL注入漏洞的检测研究 分为两大类:一类是通过对PHP程序的静态分析来检测漏洞, 冲溢出、格式化串等)方面得到了广泛运用,因此,越来越多 的研究人员利用着色分析来防御Web应用程序中的漏洞。 如Pixy…;另一类是通过动态着色的方法来动态防御SQL注 入攻击,如CSSE121和Web Hardening[31等。静态分析误报率 高,且当被分析程序规模庞大时,扩展性不好;而传统的动 本文将以用户登录时验证用户身份的PHP代码为例描述 改进后PHP的工作过程。存在SQL注入漏洞的代码如下: <?php 态着色方法采用了基于不可信任输入的着色,存在诸多问题。 本文对传统的动态着色方法进行改进,并采用SQL方言感知 ¥con=mysqlconnect(’localhost’,’root’,‘123456’); mysqlselectdb(’test’); 的检查的方法,消除了传统方法的缺陷。 ¥username=¥一POST[’user’】; ¥passwd=¥一POST[’passwd’】; Squery=”SELECT FROM user WHERE name= 2 SQL注入攻击介绍 SQL注入攻击是指攻击者在Web应用程序的外部输入点 通过提供包含关键字、操作符等的恶意攻击输入,改变了原 来Web应用程序中所形成的SQL语句的语法结构,从而达 到攻击的目的。 …¥username. ”and passwd='’".¥passwd.…”: ¥result=mysql—query(¥query) if(¥row=mysql——fetch——assoc(¥result)){ 基金项目:国家自然科学基金资助项目(60773171);国家“863”计 划基金资助重点项目(2007AA0 1 Z448) 在一个存在漏洞的Web应用程序中,通常存在4种不同 的输入注入点:(1)用户输入,通常是通过GET和POST方法 提交的请求。(2)Web应用程序使用的cookie。(3)服务器端变 量,包括网络包头和环境变量,Web应用程序通常会在记录 作者倚介:丁翔(1985一),男,硕上研究生,主研方向:Web安 全;仇寅,硕士研究生;郑滔,教授 收稿日期:2010—1 1-04 E—mail:MG0832004@software.nju.edu.cn
第37卷第11期 丁翔,仇寅,郑滔:一种利用PHP防御SQL注入攻击的方法 153 }else I echo”invalid user”: } ?> 该段代码存在着SQL注入漏洞,例如恶意的攻击者提供 的用户名为admin’or l_1一,密码为空,此时所形成的SQL 语句为select from user where name=‘admin’or 1_-1’a一-nd passwd=”,条件永真,这样使得攻击者成功逃避了对身份的 验证。 3.1基于传统着色机制防御方法的缺陷 传统的着色分析分为3个步骤:(1)给所有非信任输入着 色;(2)跟踪应用程序中对被着色数据的使用,传递着色信息; (3)在涉及到应用程序安全的数据使用点,利用数据的着色信 息来分析是否存在攻击。 利用传统方法来准确获取SQL查询字符串的着色信息, 并依此检测攻击,依赖于3个因素:(1)对所有的非信任输入 源着色;(2)字符串操作和过滤函数能够准确传递着色信息; (3)N用字符串着色信息,采用适当的判断算法来检测攻击。 从第1个因素来分析:(1)每个Web应用程序配置各不相 同,并且与不同的外部系统交互,所以,要对所有的外部非 信任输入着色,难度很大。(2)软件需要不断维护,因此,无 法保证对所有外部输入源识别的完备性。(3)如果某些外部非 信任源被遗漏没有被着色,就会使最终形成的SQL字符串的 某些非信任部分变成可信任的,造成SQL注入攻击的漏报, 直接结果就是使SQL注入攻击成功发生,更为严重的是漏报 的情况是非常难发现的,如果测试人员不进行攻击测试,那 么漏洞就会一直隐藏。 第2个因素要求找出字符串相关操作的完整集合并以适 当的粒度表示着色信息。而现在的许多方法选取粒度不当, 对着色信息的表示不够精确 J,无法准确判断SQL字符串 各个部分的来源,影响了对攻击的判断。 从第3个因素分析,很多利用动态着色机制来防范SQL 注入攻击的方法,只是简单判断非信任字符串中是否存在 SQL关键字和操作符,没有考虑输入在SQL语句中的语法成 分,这种判断方法是不准确的,例如用户名可以为select,但 是请求并不构成SQL注入攻击,同时也有研究者利用标准的 SQL语法解析器来判断SQL语句的非信任部分是否存在 SQL关键字和操作符,提高了判断的准确度。但是考虑到很 多数据库厂商在支持SQL标准的同时还有自己的扩充,所 以,如果利用具体数据库的Parser,可以防范对特定数据库 的攻击。 3.2基于可信任输入源的着色机制 针对Web应用程序的特点,即Web应用程序提交给数 据库前所形成的SQL语句的SQL关键字和操作符都来自于 程序中的硬编码字符串,本文使用新的基于可信任源的着色 机制,标记程序中的所有可信任字符串。和非信任输入源性 相比,Web应用程序中的可信任输入源在对大多数情况下是 唯一的,不会发生变化,这样对可信任输入进行着色,有效 地减少了需要着色的字符串的数量。另外,因为可信任输入 源集合的完备性,所以不会造成对可信任输入源的遗漏,解 决了漏报的问题。 在具体实现中,本文修改了PHP的词法分析部分。PHP 的字符串常量有3种表示方式:单,双引号字符串和heredoc。 PHP词法分析器在遇到双引号和heredoc时会自动对常量和 变量部分做分离处理。词法分析器在识别常量字符串后,会 调用zend—scan—escape—string函数(zend/zend—scan—language.1) 用PHP中内核中表示不同变量的zval(见3.3节)来对常量进 行分装供语法分析器使用。因此,这个函数内部,对常量字 符串zval结构添加了着色信息,完成了对可信任输入的自动 着色。 对应于第3节的示例代码,经过着色之后,示例代码中 的黑体字符串都将被标识为来自可信任输入源。 3.3准确的着色信息传递机制 准确的传递着色信息需要解决2个问题:(1)准确的表示 着色信息;(2)找出字符串相关操作的完整集合。 准确是指能够准确地区分SQL语句中的可信任和不可 信任部分,如语句“ 量 星 !!里 Q ! 旦里 星 1—an—d旦三 ‘b’”中的下划线部分是可信任的,来源于源代码中的常 量字符串,而其他部分来源于不可信任源、外部输入。因此, 在表示着色信息时,使用了和被着色字符串等长的着色字符 串来表示每个字符的着色信息。在PHP的实现中,PHP提供 的各种类型的变量都是由zvalue—value类型的变量实现,其 中的str成员用来存储字符串变来的那个,所以,在str结构 中添加了char*类型的sec—mark字段来存储着色信息,字符 ‘1’表示字符来源不可信任源,‘0’则表示来源于源代码中 的常量字符串。合适的粒度保证了着色信息的准确性。 PHPWeb应用程序中的SQL字符串是通过程序中的常量 字符串和外部获取的字符串通过一系列字符串操作形成的, 例如:连接,取子串,大小写转换,正则表达式匹配。这就 需要对PHP中所有字符串操作实现着色信息传递功能。本文 将PHP字符串操作的集合分为3个部分:(1)PHP内嵌的字符 串操作,如‘.’操作符。对应这些操作,本文修改了解释器 中字符串连接操作码的实现函数。(2)PHP标准的字符串操作 函数,如implode、explode、substr、字符串替换、正则表达 式匹配等。(3)常用过滤函数,如addslash、htmlentities等。 对于(2)和(3)的操作,找出它们的实现函数(大部分存在于 PHP的标准扩展中),并根据每个函数的作用和功能,添加了 对着色信息的操作。 对应于示例代码,改进后的PHP运行时能够传递着色信 息对¥query变量进行着色。此时¥query变量附带的着色信息 表明select from user where name=‘admin’or 1=1一and passwd=”中的黑体部分来源于可信任输入源,而其他部分来 源于非可信输入源。 另外,本文为程序开发人员实现了3个PHP函数对字符 串着色信息进行查询和更改:php—setTaint设置字符串为完全 可信任的;php—clearTaint清除可信任字符串的着色信息; php—getTaint返回字符串的着色信息。这3个函数主要的作用 是为了解决3.2节中提到的某些应用程序需要额外信任输入 源的情况。 3.4 SQL方言语法感知的检查 SQL方言语法感知指在PHP将SQL语句提交到数据库 之前,针对特定数据库的SQL的语法,通过对SQL语句语 法结构的分析,结合该语句字符串附带的着色信息,判断语 句是否构成SQL注入攻击。在传统利用动态着色机制防御 SQL注入攻击的方法中,攻击的判断方法分为2类:(1)不允 许SQL语句中出现非信任输入。这种方法依赖于在着色信息 传递过程,通过对非信任输入的过滤,使输入变成可信任的。 可事实是,许多Web应用程序对数据的过滤不准确或者存在
154 计算机工程 2011年6月5日 着错误,这就造成了采用这种方法会出现很多漏报。(2)考虑 非信任的输入在SQL语句中的语法成分,不允许非信任输入 出现在SQL语句的关键字或者操作符部分。这种方法准确率 高,但是现在的大部分方法都只考虑了标准的SQL语法,没 查,测试结果表明PHPBB运行在修改后的PHP上时,正常 的访问请求没有受到影响,没有误报的情况。 4.3运行负载测试 选取5组测试测试修改后的PHP对应用程序的负载: Tl测试用例涉及许多数据库读写操作,T2测试用例不 有考虑到许多SQL注入攻击利用了某些特定数据库不同于 标准的扩展。 基于以上分析,SQL方言语法感知的检查利用不同数据 库各自的SQL语法解析器来对SQL语句进行分析,要求SQL 仅涉及许多数据库读操作,还会用到许多字符串操作。T1一 cgi、T2一cgi表示T1和T2中Apache以CGI的方式调用PHP。 T1一ood、T2一rcgi表示T1和T2中PHP作为Apache的模块被 调用。T3一CLI运行PHP 5.2.3中附带的标准测试用例,这些 测试用例运行时不需Web服务器,并且不涉及很多I/O操作。 对上述的5组测试,以2种配置进行了测试:(1)使用未 语句中的关键字或者操作符都必须来源于可信任输入,有效 地提高了对许多针对特定数据库攻击的防御能力。现阶段的 实现中只在PHP程序和MySQL数据交互时对SQL语句进行 了检查。PHP中和MySQL交互的模块是以扩展(extension) 修改的PHP;(2)使用增强后的PHP。图1是在2种不同配置 下的程序运行时间。图2中的T3一CLI表明对于不包含大量 I/O操作的程序,增加的运行时负载在13%左右;对于包含 许多与数据库交互操作的应用程序,如T1一cgi和T1一mod, 增加的负载在26%左右;而对于那些既包含大量数据库交互, 的方式实现的,所以在向MySQL提交查询的函数php—mysql— doquery—general中插入了检查函数is—valid—sql—string。该函 数利用修改后的MySQL语法解析器所返回的信息,结合SQL 字符串的着色信息,检查SQL语句中的关键字和操作符等是 否来自于可信任输入,如果是,则将语句提交到数据库,完 成本次请求,否则判定发生了SQL注入攻击,并将攻击记录 到El志文件,终止本次请求。 对应于SQL注入漏洞的示例代码,¥query变量代表的 又包含大量字符串操作的应用程序,增加的负载在36%左右。 SQL语句词法分析的结果(除去空格)为TK_SELECTTK— STAR TKFROM TKID TK——_WHERE TK_ID TK—EQ TK— STRING TKOR TKINTEGER TKEQ TK—INTEGER,下戈0 ∞uv星鲁 心 0 线部分是根据¥query变量的可信任着色信息所标注的,而 TKOR作为SQL关键字却来自于不可信任的输入,据此可 判断此次请求为一次SQL注入攻击。 4实验评估 本次实验的配置为Intel ̄CorOM 2CPU 1.80 GHz, 1.79 GHz,2 GB RAM,DELL OPTILEX 745。运行的操作系统 是Ubuntu9.1 0(Linux—kernel 2.6.3 1—1 7)。 T1一cgi T1一rood T2一cgi T2一mod 运行模式 图1 Web应用程序访问时间 4O O 4.1回归性测试 因为修改了PHP5.2.3的解释器和运行时库,所以通过回 归测试保证修改后的PHP不会影响PHP其他正常功能。 PHP5.2.3中总共包含3 345个测试用例,另外添加了 22个测试用例测试着色和着色传递机制和SQL方言感知的 检查。表1是修改后的PHP的测试结果。被跳过的测试属于 -0。。 o 鑫2U_U 墓 PHP的一些非常用扩展,不属于核心和常用功能。 表1修改后的PHP5.2.3测试用倒运行结果 测试结果 Tests Skipped RStswarned 1 stsfailed 餐-o—o 0.O TI—cgi T1--mod T2一cgi T2--mod T3一CL 测试用例数占总用例数的百分比,(%)占执行用例的百分比/(%) 1 398 0 24 41 5 O O O.7 ・ O O 1 2 运行模式 1 E :!璺 : : : : 图2程序运行时负载增加的百分比 失败的测试在未修改的PHP中本身就无法通过,是该版 本存在的问题。表1表明对PHP源代码的修改,在给PHP 添加了着色机制和SQL语法感知的检查时并没有影响到它 的其他功能。 总的来说,修改后的PHP对不同类型的应用程序造成的 负载不完全相同,但是对于Web应用程序,平均30%的负载, 相对于网络延迟,只是非常小的一部分,因此,30%负载可 以说是较小的,对于用户来说,也是完全能够接受的。 4.2增强后的PHP防御能力测试 本文选取了被广泛使用的开源论坛解决方案PHP BB作 为防御能力和运行负载测试的测试对象。在PHP BB的早期 版本中,存在着许多注入漏洞。本文的实验选取了PHP BB2.0.0,在BugTraq数据库中PHP BB2.0.0总共存在7个SQL 注入漏洞。使用攻击程序攻击PHP BB程序,所有的攻击都 被成功拦截(可以在攻击日志文件中看到带有攻击的SQL字 符串)。 5结束语 本文采用基于可信任输入的动态着色机制,利用SQL语 法感知的检查实现了对PHP的安全增强,使PHP Web应用 程序自动具备了对SQL注入的防御能力,不需要程序员对程 序做出任何更改。XSS攻击 在原理上和SQL注入攻击有相 似之处,因此利用本文实现的可信任着色框架,添加相应检 查,还可以实现对XSS攻击的防御,因此本文实现的着色框 架具有通用性。 另外,通过人工评审,对PHP BB的正常功能进行了检 (下转第157页)
第37卷第11期 冯丽萍,王鸿斌,冯素琴:基于生物学原理的计算机网络病毒传播模型 157 图2和图3表明,当R>1时,病毒对网络中节点的感 点数增加,同时已恢复的节点数明显减少,这是不希望的结 染不会被彻底清除,而是最终稳定在正平衡点。当R≤1时, 果。因此,对已恢复的节点,应尽量采取保护措施,使其不 病毒在网络中的传播可以得到有效控制,而且已恢复的节点 易被病毒感染。 数明显减少,但是易感染的节点数明显高于R>1时的情况, 以上模拟结果表明,通过降低 或提高 的值可以改变 这是因为本文假设新接入的节点都为易感染节点所致。 Rl的取值,从而有效控制网络中病毒的传播。根据这一结论, (3)取A=0.08, =0.03, =0.08, :0.06, =0.01, 网络管理员可以采取安装防火墙,杀毒软件等措施来尽力保 计算得R=1.19。得到的模拟结果如图4所示。 证网络的安全性。 5结束语 . 一一…本文的目标是建立一个计算机网络病毒传播模型,根据 一一一一……] 该模型找出现实中可行的控制病毒在网络中流行的方法。通 萋 过理论分析与数值模拟发现,该模型的全局动力学行为取决 } , 于基本再生数R1的取值。为了有效控制病毒的传播,就要尽 力减小R值,这一行为可以通过减小 和增大 的值来实 兰三二≥ 三 曼 I 现。同时,网络管理员合理地管理网络中节点的流入、流出 对病毒传播也会起到控制作用。下一步的工作是进一步考虑 影响网络病毒传播的复杂因素,使模型更能反映现实情况。 图4 A=0.08时的病毒传播情况 从图4可以看出,降低A的值会使网络中节点状态变化 参考文献 幅度减小,易感染的节点数明显减少。 [1]Perdisci R,Lanzi A,Lee Classiifcafion of Packed Executables (4)取A=0.08, =0.03, =0.08, =0.06, =0.6, ofr Accurate Computer Virus Detection[J].Pattern Recognition 计算得R=1.19。得到的模拟结果如图5所示。 Letters,2008,29(14):1941—1946. 1.4 [2]Yuan Hua,Chen Guoqing.Network Viurs—epidemic Model with 】.2 hte Point-to—group Information Propagation[J].Applied Mathe- 1 0 matics and Computation,2008,206(1):357—367. 籁 [3] 李哲,封汉颍.一类改进的计算机病毒传播模型【J].徼计算 墨0.8 机信息,2008,24(1 2):64—66. 0 0.6 【4] 李晓丽,王丽娜.网络中的计算机病毒传播模型【JJ.计算机工 04 程,2005,31(18):153—155. 0.2 【5】唐新亭,张小峰,杨洪勇.基于免疫学习的Web服务突现模 0 0 型[JJ.计算机工程,2010,36(9):173—175, 0 5O 1O0 l 50 200 250 300 350 400 450 500 UTC [6】 马知恩,周义仓.传染病动力学的数学建模与研究【M].北京: 匿5 =0.6时的病毒传播情况 科学出版社,2004. 编辑索书志 对比图4、图5,发现增大 的值会使网络中被感染的节 (上接第154页) 参考文献 [5]Halfond W G Viegas J,Orso A.A Classiifcation of SQL Injection 【1】Jovanovic N,Kruegel C,Kirda E.Pixy:A Static Analysis Tool for Attacks and Countermeasures[C]//Proceedings of IEEE Detecting Web Application Vulnerabilities(Short Paper)[C1,/ International Symposium on Secure Software Engineering. Proceedings of IEEE Symposium on Security and Privacy. McLean,USA:[s.n.】,2006:12—23. Oakland,USA:[s.n.],2006:258—263. 【6]Haldar Chandra D,Franz M.Dynamic Taint Propagation for 【2]Pietrazek L Berghe C V Defending Against Injection Attacks Java[C]//Proceedings of the 21st Annual Computer Security Through Context—sensitive String Evaluation[C]//Proceedings of Applications Conference.Tucson,USA:【s.n.】,2005:303—31I. the 8th International Symposium on Recent Advances in Intrusion 【7】Martin M,Livshits B,Lam M S.Finding Application Errors and Detection.Seattle,USA:[s.n.】,2005: 124—140. Security Flaws Using PQL:A Program Query Language[C]# 【3】Nguyen—Tuong A,Guarnieri S,Greene D,et a1.Automatically rPoceedings of the 20th Annual ACM SIGPLAN Conference on Hardening Web Applications Using Precise Tainting Informa— Object Oriented rPogramming System Languages and Applications tion[C]//Proceedings of the 20th 1FIP International Information San Diego,USA:[s.n.】,2005:365-383. Security Conference.Makuhari,Japan:[s.n.】,2005:372—382. 【8】沈寿忠,张玉清.基于爬虫的XSS漏洞检测工具设计与实现[J]. 【4】Ollmann G Second—order Code I ̄ection Attacks[EB/OL]. 计算机工程,2009,35(21):151—154. (2004—04—20).http://www.nextgenss.corn/papers. 编辑索书志
发布者:admin,转转请注明出处:http://www.yc00.com/news/1708311590a1550308.html
评论列表(0条)