SQL注入漏洞原理及分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SQL注入漏洞原理及分析
Structured Query Language Injection Principle And Analysis of
Vulnerability
摘要:注入式攻击的根源在于,程序命令和用户数据(即用户输入)之间没有做到泾渭分明。这使得攻击者有机会将程序命令当作用户输入的数据提交给We程序,以发号施令,为所欲为。而且表面看起来注入攻击与一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警告,如果管理员没查看IIS日志的习惯,很可能被渗透很长时间都不会发觉。本文通过对SQL注入式攻击的常用攻击方法做了逐一的分析, 并针对每种攻击方法提出了检测和防范的措施。文章还会对一些网站源代码进行分析,并介绍一些检测工具。
关键词:SQL注入攻击;防御方法;脚本攻击;网站安全;数据库安全。
随着数据库技术及B/S模式应用技术的发展,SQL注入攻击也成了黑客对数据库进行攻击的常用手段之一。但是由于使用这种模式编写代码的程序员水平有限,相当大一部分程序员在编程的时候,没有考虑用户输入数据的合法性问题,使得应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
1.SQL注入攻击的背景
在信息技术高速发展的今天,各种各样复杂的威胁网站技术也同时快速的“发展”,让人们防不胜防。攻击者利用网络的安全漏洞进行各种恶意活动,如账号盗用、私密信息截获、带宽资源占用等。严重破坏了网络的正常健康运行,危害十分严重。
网站威胁的目标定位有多个维度,可以是个人、公司、某种行业,甚至国家、地区、性别、种族、宗教等。通常情况下攻击会采用多种形态,如病毒、蠕虫、特洛伊、间谍软件等或是他们的复合形态。可以分为内部攻击和外部攻击两类:
1)内部攻击主要来自信任网络,可能是用户执行了未授权访问或是无意中定制了恶意攻击;
2)外部攻击主要是由于网络漏洞被利用或者用户受到恶意程序制定者的专一攻击。2.SQL注入攻击的概念
SQL注入攻击源于英文“SQL Injection Attack”。目前还没有看到一种标准的定义,常见的是对这种攻击形式、特点的描述。微软技术中心从两个方面进行了描述:1)脚本注入式的攻击;
2)恶意用户输入用来影响被执行的SQL脚本。
Stephen Kost给出了这种攻击形式的另一个特征,“从一个数据库获得未经授权的访问和直接检索”。SQL注入攻击就其本质而言,他利用的工具是SQL的语法,针对的是应用
程序开发者编程过程中的漏洞。“当攻击者能够操作数据,往应用程序中插入一些SQL语句时,SQL注入攻击就发生了”。 SQL注入攻击是指黑客利用一些Web 应用程序(论坛, 留言本, 文章发布系统)中某些疏于防范的用户可以提交或修改的数据的页面, 精心构造Sql 语句, 把特殊的SQL 指令语句插入到系统实际SQL语句中并执行它, 以获取用户密码等敏感信息, 以及获取主机控制权限的攻击方法。
3.SQL注入攻击特点
1)广泛性
SQL注入攻击利用的是SQL语法,因此只要是利用SQL语法的Web应用程序如果未对输入的SQL语句做严格的处理都会存在SQL注入漏洞,目前以Active/Java Server Pages、Cold Fusion Management、 PHP、Perl等技术与SQL Server、Oracle、DB2、Sybase等数据库相结合的Web应用程序均发现存在SQL注入漏洞。
2)技术难度不高
SQL注入技术公布后,网络上先后出现了多款SQL注入工具,例如教主的HDSI、NBSI、明小子的Domain等,利用这些工具软件可以轻易地对存在SQL注入的网站或者Web应用程序实施攻击,并最终获取其计算器的控制权。
3)危害性大
SQL注入攻击成功后,轻者只是更改网站首页等数据,重者通过网络渗透等攻击技术,可以获取公司或者企业机密数据信息,产生重大经济损失。
4.SQL注入攻击的实现原理
SQL注入攻击主要是通过构建特殊的输入,这些输入往往是SQL语法中的一些组合,这些输入将作为参数传入Web应用程序,通过执行SQL语句而执行入侵者的想要的操作,下面以登录验证中的模块为例,说明SQL注入攻击的实现方法。
在Web应用程序的登录验证程序中,一般有用户名(username)和密码(password)两个参数,程序会通过用户所提交输入的用户名和密码来执行授权操作。其原理是通过查找user表中的用户名(username)和密码(password)的结果来进行授权访问,典型的SQL 查询语句为:
如果分别给username和password赋值“admin' or 1=1--”和“aaa”。那么,SQL脚本解释器中的上述语句就会变为:
该语句中进行了两个判断,只要一个条件成立,则就会执行成功,而1=1在逻辑判断上是恒成立的,后面的“--”表示注释,即后面所有的语句为注释语句。同理通过在输入参数中构建SQL语法还可以删除数据库中的表,查询、插入和更新数据库中的数据等危险操作:1)drop table authors—如果存在authors表则删除;
2)union select sum(username) from users—从users表中查询出username的个数;
3)insert into users values( 666, 'attacker', 'foobar', 0xffff )—在user表中插入值;
4)union select @@version,1,1,1--查询数据库的版本;
5)exec master..xp_cmdshell 'dir' 通过xp_cmdshell来执行dir命令。
5.SQL注入攻击实现过程
SQL注入攻击可以手工进行,也可以通过SQL注入攻击辅助软件如HDSI、Domain、NBSI 等,其实现过程可以归纳为以下几个阶段:
1)寻找SQL注入点
寻找SQL注入点的经典查找方法是在有参数传入的地方添加一些特殊字符,通过浏览器所返回的错误信息来判断是否存在SQL注入,如果返回错误,则表明程序未对输入的数据进行处理,绝大部分情况下都能进行注入。
2)获取和验证SQL注入点
找到SQL注入点以后,需要进行SQL注入点的判断。
3)获取信息
获取信息是SQL注入中一个关键的部分,SQL注入中首先需要判断存在注入点的数据库是否支持多句查询、子查询、数据库用户账号、数据库用户权限。
4)实施直接控制
以SQL Server 2000为例,如果实施注入攻击的数据库是SQL Server 2000,且数据库用户为sa,则可以直接添加管理员账号、开放3389远程终端服务、生成文件等命令。
5)间接进行控制
间接控制主要是指通过SQL注入点不能执行DOS等命令,只能进行数据字段内容的猜测。在Web应用程序中,为了方便用户的维护,一般都提供了后台管理功能,其后台管理验证用户和口令都会保存在数据库中,通过猜测可以获取这些内容,如果获取的是明文的口令,则可以通过后台中的上传等功能上传网页木马实施控制,如果口令是明文的,则可以通过暴力破解其密码。
6.SQL注入攻击及防御方法具体实现
1)绕过身份认证
一个登陆界面, 需要输入用户名和密码, 然后Post 到另一个页面, 进行身份认证, 此时进行身份认证的代码如下: