【转】基于SQL的Web系统安全防范——SQL注⼊漏洞
攻击研究及防范措施
SQL-Based Web System Security——Structured Query Language InjectionLeak Attack Study And Defense Measure
SQL注⼊(SQL Injection)漏洞攻击是⽬前⽹上最流⾏最热门的⿊客脚本攻击⽅法之⼀,那什么是SQL注⼊漏洞攻击呢?它是指⿊客利⽤⼀些Web应⽤程序(如:⽹站、论坛、留⾔本、⽂章发布系统等)中某些存在不安全代码或SQL语句不缜密的页⾯,精⼼构造SQL语句,把⾮法的SQL语句指令转译到系统实际SQL语句中并执⾏它,以获取⽤户名、⼝令等敏感信息,从⽽达到控制主机服务器的攻击⽅法。
1. SQL注⼊漏洞攻击原理
1. 1 SQL注⼊漏洞攻击实现原理
SQL(Structured Query Language)是⼀种⽤来和数据库交互的语⾔⽂本。SQL注⼊的攻击原理就是攻击者通过Web应⽤程序利⽤SQL语句或字符串将⾮法的数据插⼊到服务器端数据库中,获取数据库的管理⽤户权限,然后将数据库管理⽤户权限提升⾄操作系统管理⽤户权限,控制服务器操作系统,获取重要信息及机密⽂件。
SQL注⼊漏洞攻击主要是通过借助于HDSI、NBSI和Domain等SQL注⼊漏洞扫描⼯具扫描出Web页⾯中存在的SQL注⼊漏洞,从⽽定位SQL注⼊点,通过执⾏⾮法的SQL语句或字符串达到⼊侵者想要的操作。下⾯以⼀段⾝份验证的.NET代码为例,说明⼀下SQL 注⼊攻击的实现⽅法。
SqlConnectionnwConn = new SqlConnection((string)ConfigurationSettings.AppSet
tings["DBconnStrings"]);
string queryStr = "SELECT userid,userpwd, username,type FROM users where userid='" + Txtusername.Text +"'";
DataSet userSet = new DataSet();
SqlDataAdapter userAdapter = newSqlDataAdapter(queryStr, nwConn);
userAdapter.Fill(userSet, "Users");
Session["UserID"] =Txtusername.Text.ToString();
Session["type"] =type.Text.ToString();
Response.Redirect("/Myweb/admin/login.aspx");
从上⾯的代码中可以看出,程序在与数据库建⽴连接得到⽤户数据之后,直接将username的值通过session传给login.aspx,没有进⾏任何的过滤和处理措施, 直接⽤来构造SQL 语句, 其危险系数是⾮常⾼的, 攻击者只要根据SQL 语句的编写规则就可以绕过⾝份验证,从⽽达到⼊侵的⽬的。
1. 2 SQL注⼊漏洞攻击分析
SQL注⼊可以说是⼀种漏洞,也可以说是⼀种攻击。当程序中的变量处理不当,没有对⽤户提交的数据类型进⾏校验,编写不安全的代码,构造⾮法的SQL语句或字符串,都可能产⽣这个漏洞。
例如Web系统有⼀个login页⾯,这个login页⾯控制着⽤户是否有权访问,要求⽤户输⼊⼀个⽤户名和⼝令,连接数据库的语句为:
“select * from users where username = 'username' andpassword = 'password'”
攻击者输⼊⽤户名为aa or 1=1⼝令为1234 or 1=1之类的内容。我们可以看出实际上攻击者并不知道真正的⽤户名、⼝令,该内容提交给服务器之后,服务器执⾏攻击者构造出的SQL命令,但由于攻击者输⼊的内容⾮常特殊,所以最后得到的SQL命令变成:
“select * from users where username = 'aa' or 1=1 andpassword = '1234' or 1=1”;
服务器执⾏查询或存储过程,将⽤户输⼊的⾝份信息和数据库users表中真实的⾝份信息进⾏核对,由于SQL命令实际上已被修改,存在永远成⽴的1=1条件,因此已经不能真正验证⽤户⾝份,所以系统会错误地授权攻击者访问。
SQL 注⼊是通过⽬标服务器的80端⼝进⾏的,是正常的Web访问,防⽕墙不会对这种攻击发出警告或拦截。当Web服务器以普通⽤户的⾝份访问数据库时,利⽤SQL注⼊漏洞就可能进⾏创建、删除、修改数据库中所有数据的⾮法操作。⽽当数据库以管理⽤户权限的⾝份进⾏登录时,就可能控制整个数据库服务器。
SQL注⼊的⽅法很多,在以⼿动⽅式进⾏攻击时需要构造各种各样的SQL语句,所以⼀般攻击者需要丰富的经验和耐⼼,才能绕过检测和处理,提交语句,从⽽获得想要的有⽤信息。这个过程需要花费很多的时间,如果以这种⼿动⽅式进⾏SQL注⼊漏洞攻击,许多存在SQL注⼊漏洞的ASP、JSP、PHP、JAVA等⽹站就会安全很多了,不是漏洞不存在了,⽽是⼿动⼊侵者需要编程基础,但现在攻击者可以利⽤⼀些现成的⿊客⼯具来辅助SQL注⼊漏洞攻击,加快⼊侵的速度,使SQL注⼊变得轻⽽易举。
由于SQL注⼊漏洞攻击利⽤的是通⽤的SQL语法,使得这种攻击具有⼴泛性。理论上说,对于所有基于SQL语⾔的数据库管理系统都是有效的,包括MSSQLServer、Oracle、DB2、Sybase和MySQL等。当然,各种系统⾃⾝的SQL扩展功能会有所不同,因此最终的攻击代码可能不尽相同。
1. 3 SQL注⼊漏洞攻击过程
(1)绕过⾝份验证
如⼀个login界⾯,需要输⼊⽤户名和⼝令,然后Post到另⼀个页⾯,进⾏⾝份验证,因此攻击者只需在⽤户名和⼝令的输⼊框中都输⼊aa or’1’=’1’的内容,那么攻击者就可以通过欺骗的验证⽅式⽽直接进⼊下⼀个页⾯,并拥有和正常登录⽤户⼀样的全部特权。原因是什么呢?我们⽐较⼀下正常⽤户登录和攻击者登录时的两种SQL语句:
1)正常⽤户(如⽤户名为admin,⼝令为1234567) :
SQL= " selectfrom users where username = ’admin’and password= ’1234567’ ";
2)攻击者(⽤户名和⼝令都为aa or’1’=’1’) :
SQL= " select * from users where username='aa or’1’=’1’'and password = ' aa or’1’=’1’'";
可以看到由and连接的两个条件都被⼀个永远成⽴的1=1所代替,执⾏的结果为true,数据库会认为条件恒成⽴,会返回⼀个true,让攻击者以合法⾝份登录进⼊下⼀个页⾯。
(2)执⾏⾮法操作
如⼀个查询页⾯select1.asp? id=1,编程⼈员原本设计意图是显⽰id为1的查询信息,⽽攻击者利⽤程序中没有对id内容进⾏检查的机制,插⼊⾃⼰的代码。
从select1.asp中摘录⼀段关键代码:
SQL= " select *from photo where photoid= 'id'";
可以看到,id没有进⾏任何的处理,直接构成SQL语句并执⾏,⽽攻击者在知道该系统数据库中表名及字段名的情况下,利⽤SQL语句特性(分号是将两句SQL 语句分开的符号),直接向数据库Tuser表中添加记录:
select1.asp? id= 1;Insertinto Tuser (username,password,type) values ('hack','1234567','管理员'),然后攻击者就可以直接⽤hack进⾏登录了。通过这样的⽅法,攻击者还可以对系统做任何的事情,包括添加、删除、修改系统资源的操作。
(3)执⾏系统命令
如果Web主机使⽤MSSQL数据库管理系统,那么攻击者就可以⽤到xp_cmdshell这个扩展存储过程,xp_cmdshell是⼀个⾮常有⽤的扩展存储过程,⽤于执⾏系统命令,⽐如dir、net等,攻击者可以根据程序的不同,提交不同的语句:
execmaster.dbo.xp_cmdshell " dir ";
exec master.dbo.xp_cmdshell" net user hack 1234567 /add ";
execmaster.dbo.xp_cmdshell " net localgroup administrators hack /add ";
这样就可以向Web主机系统中成功添加了⼀个管理员帐户。
2. SQL注⼊漏洞攻击的检测⽅式及⽅法
2. 1检测⽅式
SQL注⼊漏洞攻击检测分为⼊侵前的检测和⼊侵后的检测。⼊侵前的检测,可以通过⼿⼯⽅式,也可以使⽤SQL注⼊漏洞扫描⼯具软件。检测的⽬的是为预防SQL注⼊漏洞攻击,⽽对于SQL注⼊漏洞攻击后的检测,主要是针对审计⽇志的查看,SQL注⼊漏洞攻击成功后,会在Web Service和数据库的审计⽇志中留下“痕迹”。
2. 2检测⽅法
(1)动态SQL检查
动态的SQL语句是⼀个进⾏数据库查询的强⼤的⼯具,但把它和⽤户输⼊混合在⼀起就使SQL注⼊成为了可能。将动态的SQL语句替换成预编译的SQL或者存储过程对⼤多数应⽤程序是可⾏的。预编译的SQL或者存储过程可以将⽤户的输⼊作为参数⽽不是命令来执⾏,这样就限制了⼊侵者的⾏动。当然,它不适⽤于存储过程中利⽤⽤户输⼊来⽣成SQL命令的情况。在这种情况下,⽤户输⼊的SQL命令仍可能得到执⾏,数据库仍然存在SQL注⼊漏洞攻击的危险。
(2)有效性校验
如果⼀个输⼊框只可能包括数字,那么要通过验证确保⽤户输⼊的都是数字。如果可以接受字母,检查是不是存在不可接受的字符,那就需要设置字符串检查功能。确保应⽤程序要检查以下字符:分号、等号、破折号、括号以及SQL关键字。
(3)数据表检查
使⽤SQL注⼊漏洞攻击⼯具软件进⾏SQL注⼊漏洞攻击后,都会在数据库中⽣成⼀些临时表。通过查看数据库中最近新建的表的结构和内容,可以判断是否曾经发⽣过SQL注⼊漏洞攻击。
(4)审计⽇志检查
在Web服务器中如果启⽤了审计⽇志功能,则Web Service审计⽇志会记录访问者的IP地址、访问时间
、访问⽂件等信息,SQL注⼊漏洞攻击往往会⼤量访问某⼀个页⾯⽂件(存在SQL注⼊点的动态⽹页),审计⽇志⽂件会急剧增加,通过查看审计⽇志⽂件的⼤⼩以及审计⽇志⽂件中的内容,可以判断是否发⽣过SQL注⼊漏洞攻击事件;另外还可以通过查看数据库审计⽇志,查询某个时间段是否有⾮法的插⼊、修改、删除操作。
(5)其他
SQL注⼊漏洞攻击成功后,⼊侵者往往会添加特权⽤户(如:administrator、root、sa等)、开放⾮法的远程服务以及安装⽊马后门程序等,可以通过查看⽤户帐户列表、远程服务开启情况、系统最近⽇期产⽣的⼀些⽂件等信息来判断是否发⽣过⼊侵。
3. SQL注⼊漏洞攻击检测防范模型及措施
3. 1 防范模型
本⼈通过深⼊的学习研究,吸取前⼈的经验成果,提出了⼀种通⽤的SQL注⼊漏洞攻击检测防范模型如图1所⽰,本模型中所有检测均在服务器端进⾏。⾸先是校验客户端提交数据的有效性,⾃动识别该数据类型是否符合程序中设定的值,如果校验未通过将禁⽌访问,返回重新输⼊数据并记录该过程;其次将输⼊的字符串类型与SQL注⼊规则库字符串类型进⾏⽐对,检测字符串类型是否合法(验证是否存在
SQL注⼊漏洞),若不合法也将禁⽌访问,返回重新输⼊数据并记录该操作;最后检测是否超过访问权限,如果未超过访问权限,就可以正常访问页⾯,若超过访问权限,除禁⽌访问,返回重新输⼊数据并记录该操作外,同时发送Email给管理员,如果超过3次邮件告警管理员还未采取任何措施,那么将通过⼿机短信⽅式进⾏告警,直到管理员采取防范措施为⽌。
图1 SQL注⼊漏洞攻击检测防范模型
注入本模型的最⼤特点是⾃动将攻击信息及时地传递给管理员,⽅便管理员及时做出响应。
3. 2 防范措施
SQL注⼊漏洞攻击的防范⽅法有很多种,现阶段总结起来有以下⽅法:
(1)数据有效性校验。如果⼀个输⼊框只可能包括数字,那么要通过校验确保⽤户输⼊的都是数字。如果可以接受字母,那就要检查是不是存在不可接受的字符,最好的⽅法是增加字符复杂度⾃动验证功能。确保应⽤程序要检查以下字符:分号、等号、破折号、括号以及SQL 关键字。另外限制表单数据输⼊和查询字符串输⼊的长度也是⼀个好⽅法。如果⽤户的登录名最多只有10个字符,那么不要认可表单中输⼊10个以上的字符,这将⼤⼤增加攻击者在SQL命令中插⼊有害代码的难度。
(2)封装数据信息。对客户端提交的数据进⾏封装,不要将数据直接存⼊cookie中,⽅法就是在编程的
代码中,插⼊session、if、try、else,这样可以有效地防⽌攻击者获取cookie中的重要信息。
(3)去除代码中的敏感信息。将在代码中存在的⽤户名、⼝令信息等敏感字段删除,替换成输⼊框。
如:SQL=" select from users where username = ’admin’and password= ’1234567’ "这样显然会暴露管理员的⽤户名、⼝令信息。可以将其修改成SQL= " select * from users where username='" +Txtuser.Text + "' and userpwd='" + Textpwd.Text + "'",这样就安全了很多,⼊侵者也是不会轻易的就获取到⽤户名、⼝令信息。
(4)替换或删除单引号。使⽤双引号替换掉所有⽤户输⼊的单引号,这个简单的预防措施将在很⼤程度上预防SQL注⼊漏洞攻击,单引号时常会⽆法约束插⼊数据的Value,可能给予输⼊者不必要的权限。⽤双引号替换掉单引号可以使⼤部分SQL注⼊漏洞攻击失败。
如:“select* from users where username='" + admin + "' and userpwd='" + 1234567+ "'”显然会得到与“select * from users where username='admin' and password= '1234567'”相同的结果。
(5)指定错误返回页⾯。攻击者有时从客户端尝试提交有害代码和攻击字符串,根据Web Service给出的错误提⽰信息来收集程序及服务器的信息,从⽽获取想得到的资料。应在Web Service中指定⼀个不包含任何信息的错误提⽰页⾯。
(6)限制SQL字符串连接的配置⽂件。使⽤SQL变量,因为变量不是可以执⾏的脚本,即在Web页⾯中将连接数据库的SQL字符串替换成指定的Value,然后将fig⽂件进⾏加密,拒绝访问。
(7)设置Web⽬录的访问权限。将虚拟站点的⽂件⽬录禁⽌游客⽤户(如:Guest⽤户等)访问,将User⽤户权限修改成只读权限,切勿将管理权限的⽤户添加到访问列表。
(8)最⼩服务原则。Web服务器应以最⼩权限进⾏配置,只提供Web服务,这样可以有效地阻⽌系统的危险命令,如ftp、cmd、vbscript 等。
(9)鉴别信息加密存储。将保存在数据库users表中的⽤户名、⼝令信息以密⽂形式保存,也可以对users表进⾏加密处理,这样可以⼤⼤增加对鉴别信息访问的安全级别。
(10)⽤户权限分离。应尽可能的禁⽌或删除数据库中sa权限⽤户的访问,对不同的数据库划分不同的⽤户权限,这样不同的⽤户只能对授权给⾃⼰的数据库执⾏查询、插⼊、更新、删除操作,就可以防⽌不同⽤户对⾮授权的数据库进⾏访问。
4. 结束语
SQL注⼊漏洞攻击在⽹上⾮常普遍,许多ASP、PHP论坛和⽂章管理系统、下载系统以及新闻系统都存在这个漏洞。造成SQL注⼊漏洞攻击的主要原因是开发⼈员在系统开发的过程中编程不规范,没有形成
良好的编程习惯,问题的解决只有依赖于规范编程。此外,也可以使⽤现有的SQL注⼊漏洞扫描器对整个⽹站中的关键代码进⾏扫描,查⽹站页⾯中存在的SQL注⼊点。对于有问题的页⾯,可以及时删除或更新。本⽂通过对SQL注⼊漏洞攻击的⽅法、原理以及攻击实施过程进⾏了阐述和总结,并给出了⼀些常见的SQL注⼊漏洞攻击防范的⽅法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论