黄碧玲
摘 要: 网站注入式攻击成为Web应用系统的严重安全隐患。通过该类型攻击,攻击者能非法获得对Web应用程序数据库无限制的访问权限,进而得到企业和网络用户的机密信息,如银行账号、交易数据等,给网络用户和企业造成了巨大损失。通过对注入式攻击途径、动机、流程及原理的分析,结合目前普遍采用的攻击测试方法,提出一些防范方法和措施。采用这些方法和措施可极大限度地减少网站注入攻击的可能性,保护数据库的安全。
关键词: 注入式攻击; 攻击原理; 攻击防范; 网络安全
中图分类号:TP309.2 文献标志码:A 文章编号:1006-8228(2013)08-22-03
0 引言
网站注入是动态网页经常存在的一种漏洞(这些漏洞并非Window、IIS、SQL Server或者其他底层代码的漏洞,而是在这些平台上运行的由程序员自行编写的代码中的漏洞),攻击者利用这种漏洞可以通过SQL语句直接访问数据库,因而对系统的安全产生很大隐患。随着B/S模式应用开发的发展,相当一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在着安全隐患。本文通过对注入式攻击途径、动机、流程及原理的分析,结合目前普遍采用的攻击测试方法,提出一些防范方法和措施。这些防范方法可极大程度地减少网站注入攻击的可能性,保护数据库的安全。
1 网站注入攻击途径、流程及原理分析
1.1 SQL注入攻击的途径
用户通过一定的途径将自己的输入提交给Web应用程序,因而SQL注入也就有其相应的攻击途径。恶意用户一般通过客户端输入、Server变量以及Cookie三种[1]基本的方式进行畸形SQL语句查询的提交,从而达到进行SQL注入的最终目的。
通过用户输入注入 在客户端页面上的输入是用户和Web应用程序最主要的交互方式,用户输入主要通过HTTP的GET和POST请求提交。Web应用程序通过访问这些请求变量并引用包含在这些变量中的用户输入值(变量值),然后使用这些用户输入值,动态地生成SQL查询语句,提交给后台数据库。恶意用户则通过精心构造用户输入值进行SQL注入。
通过Server变量注入 Server变量是包含在HTTP、网络header和环境变量中的变量。浏览器请求和服务端的响应都包含headers。Headers提供有关请求和响应的附加信息,包括浏览器生成请求和服务端响应过程的信息。恶意用户就可能通过伪造HTTP和headers的值操纵数据库,生成攻击。
通过Cookie注入 Cookie是Web应用程序产生的包含状态信息的文件,存储在客户端并由客户端完全控制。因此恶意用户可以任意处理Cookie内容,若Web应用程序用Cookie的内容动态构造SQL查询,那么恶意用户就可以使用Cookie的内容构造SQL查询,并将攻击嵌入Cookie提交。
1.2 网站注入攻击的分类
使用注释符(- -,#) 使用注释通常可以使攻击者绕过验证。SQL在查询中支持注释,如,- -、#等。通过注入注释符,恶意用户或者攻击者可以毫不费力的截断SQL查询语句。
重言式攻击 该类型攻击是为绕过验证、识别可注入的参数或者提取数据。这种攻击的目的是在条件句中注入代码,使该条件句恒真。攻击者利用查询条件中的可注入字段,将条件转换为重言式,使数据库返回所有相关行。这类攻击的结果依赖于攻击对象在应用程序中的作用,最常见的是绕过验证和提取数据。
不合法/逻辑错误查询(SQL注入攻击发现技术) 其攻击动机是识别可攻击参数、识别数据库的类型和版本等信息或提取数据等。该类型的攻击其实是攻击的一个预备步骤,用于为其他类型的攻击收集信息,包括数据库的类型和结构。语法错误可以识别可注入参数,类型转换错误可以推导某列的数据类型或者取得数据,逻辑错误可以返回导致错误的表和列的名字。从这些错误信息中得到的信息为其他攻击方法收集了必要的攻击信息。
Union查询攻击 Union查询动机是绕过验证或者提取数据。攻击者在查询语句中注入Union SELECT语句,并且因为用户控制“SELECT语句”的内容,攻击者可以得到想要的信息。
附带查询攻击 该类型攻击是为提取数据、添加和修改数据、实现拒绝服务或者执行远程命令。该类型的攻击并不改变原有查询,而是在原有查询后插入新的查询语句。数据库配置如果允许执行多个查询语句,那么攻击者将能在原有查询后插入任何SQL命令,包括存储过程(系统或用户自定义的),因而这种攻击能造成巨大危害。
利用存储过程攻击 数据库厂商用一些标准存储过程来扩展数据库的功能并允许其与系统交互,或者用户会自定义一些存储过程。通过其他类型攻击搜集到数据库的相关信息(数据库类型)后,就可以构造执行存储过程的命令。而人们以为用存储过程写程序就能避免注入攻击漏洞,这样的说法是错误的。
推断 可以识别可注入参数、提取数据或确定数据库模式。该种类型的攻击利用网站对用户输入的返回信息,推导数据库模式和可注入参数。该类型的攻击所构造的查询执行后得到的答案有两种:真或假。
替换编码 该种攻击主要是为逃避检测。通过替换编码修改注入文本,以达到逃避系统已有检测机制(如编码防御或自动防御技术)的目的,经常与其他类型攻击结合使用。
1.3 网站注入攻击的流程
网站注入攻击主要是通过构建特殊的输入,这些输入往往是网站语法的一些组合。这些输入将作为参数传入Web应用程序。通过执行网站语句而执行攻击者想要的操作。其主要步骤分为:识别可注入参数→识别数据库类型和版本→确定数据库模式→提取数据→添加和修改数据→实现拒绝服务→逃避检测→绕过验证→执行命令[2]。
一般流程都可归纳如下。
⑴ 寻找SQL注入点:在含有传递参数的动态网页中,判断是否存在SQL注入漏洞。
⑵ 判断数据库的类型:对于不同的数据库管理系统其攻击方式也不同。
⑶ 如果是Access数据库:通过探测数据库表名和列名,并探测列值(字段值)了解数据库的相关信息。该攻击实施的动机是确定数据库的模式,主要通过不合法/逻辑错误查询和推断的攻击方法实现。在得到数据库的相关信息(确定数据库模式)之后,就可以扩张权限。
⑷ 如果是MS SQL Server数据库系统:首先要判断存在注入点的数据库是否支持多句查询、子查询、数据库用户账号、数据库用户权限等。如果用户权限为sh,且数据库中存在xp--cmdshll存储过程,则可以直接转⑹。如果用户权限不是sh,则接下来可以有两种方法扩张权限:一种是步骤⑶中给出的确定数据库相关信息;另一种是利用系统表Sysobjeets得到数据库表名和列名,通过不合法/逻辑错误查询和推断方法确定字段值。
⑸ 扩张权限:通过步骤⑶、⑷确定了数据库模式之后就可以扩张权限。
⑹ 实施真正的攻击:拥有相应的权限,就可以实施攻击。攻击包括添加管理员账号、开放3389远程终端服务、通过后台的上传功能上传网页木马实施对服务器的控制等。
1.4 网站注入的实现原理
根据网站注入的原理不同,网站注入方式分为三类:常规注入、字典猜解注入和盲注入[3]。
常规注入 常规注入方法是根据攻击者恶意构造的SQL语句返回的错误信息的内容获取有用的信息。在实施真正的攻击之前需要收集数据库的相关信息,并以文字的形式分类对这些攻击的依据和所能得到的信息等方面进行分析。通过攻击者恶意构造的SQL语句返回的错误信息的内容获取了数据库用户的名字。运用同样的原理,可以判断网站是否存在漏洞,以及数据库的类型、用户权限、表名、列名和字段名。
字典猜解注入 当前管理员和多数网络用户的安全意识不强,字段名称都遵循某种特定方式,字典猜解将常用的字段名称生成一部字典,用该字典中的数据探测数据库的相关信息。
盲注入 盲注入方法是基于推理的。通过问服务器“真/假”问题,查看客户端页面反应获取信息。也就是说,在提交的数据中注入猜测的数据,提交到数据库中,如果正确返回结果,则该数据即为所要猜测的值,如果返回错误,则继续问是否为其他数据。
2 防御网站注入攻击方法
2.1 数据库管理员角度
⑴ 数据库管理员从数据库服务器上移除所有数据库的示例脚本,以便减少冗余脚本数据量。
⑵ 移除不需要用到的存储过程,尤其是访问注册表的存储过程。
⑶ 为每一个网站单独分配一个专门的操作账户,尽可能减少使用sa等默认账户登录数据库及系统。
2.2 应用程序设计员角度
大部分Web应用常见漏洞,均是由于在Web应用开发中,开发者没有对用户输入的参数进行检测或检测不严格造成的。所以,Web应用开发者应该树立强烈的安全意识,在开发中编写安全代码;对用户提交的URL、查询关键字、HTTP头、POSE数据等进行严格的检测和限制,只接受一定长度范围内、采用适当格式及编码的字符,阻塞、过滤或者忽略其他的任何字符。
⑴ 对异常处理错误页面跳转到指定页面,杜绝将异常处理信息过多的暴露给用户。
⑵ 对于动态构造SQL 查询的场合,强烈建议使用以下技术以减少注入漏洞:
A. 替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义[4];
B. 删除用户输入内容中的所有连字符,防止攻击者构造出类似“select*from tbuser where userName='admin1'-and passWord=''”之类的查询,因为这类查询的后半部分已经被注释掉,不再有效,攻击者只要知道一个合法的用户登录名称,根本不需要知道用户的密码就可以顺利获得访问权限。对于用来执行查询的数据库帐户,限制其权限。用不同的帐户执行查询、插入、更新、删除操作。由于隔离了不同帐户可执行的操作,因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。
⑶ 限制表单或查询字符串输入的长度。如果用户的登录名字最多只有10个字符,那么不要认可表单中输入的10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。
⑷ 将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据作比较,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。
2.3 系统管理员角度
作为负责网站日常维护管理工作的Web管理员,必须及时跟踪并安装最新的、支撑Web网站运行的各种软件的安全补丁,确保攻击者无法通过软件漏洞对网站进行攻击。除了软件本身的漏洞外,Web服务器、数据库等不正确的配置也可能导致Web应用安全问题。Web网站管理员应该对网站各种软件配置进行仔细检测,降低出现安全问题的概率。
此外,Web管理员还应该定期审查Web服务器日志,检测是否存在异常访问,及早发现潜在的安全问题。
3 结束语
本文深入介绍并讨论了SQL注入攻击的途径、分类和注入的流程、原理等,结合目前普遍采用的攻击测试方法,提出了针对数据库管理员、应用程序设计员和系统管理员对防范注入攻击方法,极大限度地减少网站注入攻击的可能性,保护数据库的安全。然而,通过人工的方法对网站存在的SQL注入式漏洞进行检测,容易出现遗漏,因此,下一步将重点研究注入式漏洞的自动检测技术及其应用。
参考文献:
[1] Anley C. Advanced SQL injection in SQL server applications[J].White paper, Next Generation Security Software Ltd,2002.
[2] Halfond W G, Viegas J, Orso A. A classification of SQL-injection attacks and countermeasures[C]//Proceedings of the IEEE International Symposium on Secure Software Engineering,Arlington,VA,USA,2006:13-15
[3] 张卓.SQL注入技术与防范措施研究[D].上海交通大学,2007:50-51
[4] Yuki Kosuga, Kenji Kono, Miyuki Hanaoka, Miho Hishiyama, Yu Takahama. Sania:Syntactic and Semantic Analysis for Automated Testing against SQL injection. IEEE Computer Society 2007. Miami Beach,Florida,USA.2007.USA.,IEEE 2007:107-117