SQL Server应用程式中的高级SQL注入

2008-04-02 10:40:35来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

这份文档是周详讨论SQL注入技术,他适应于比较流行的IIS ASP SQLSERVER平台。他讨论了哪些SQL语句能通过各种各样的方法注入到应用程式中,并且记录和攻击相关的数据确认和数据库锁定。

  介绍

  SQL是一种用于关系数据库的结构化查询语言。他分为许多种,但大多数都松散地基于美国国家标准化组织最新的标准SQL-92。典型的执行语句是query,他能够收集比较有达标性的记录并返回一个单一的结果集。SQL语言能够修改数据库结构(数据定义语言)和操作数据库内容(数据操作语言)。在这份文档中,我们将特别讨论SQLSERVER所使用的Transact-SQL语言。

  当一个攻击者能够通过往query中插入一系列的sql语句来操作数据写入到应用程式中去,我们管这种方法定义成SQL注入。

  一个典型的SQL语句如下:

Select id,forename,surname from authors

  这条语句将返回authors表中任何行的id,forename和surname列。这个结果能够被限制,例如:

Select id,forename,surname from authors where forename'john' and surname='smith'

  需要着重指明的是字符串'john'和'smith'被单引号限制。明确的说,forename和surname字段是被用户提供的输入限制的,攻击者能够通过输入值来往这个查询中注入一些SQL语句,如下:

Forename:jo'hn
Surname:smith

  查询语句变为:

Select id,forename,surname from authors where forename='jo'hn' and surname='smith'

  当数据库试图去执行这个查询时,他将返回如下错误:

Server:Msg 170, Level 15, State 1, Line 1
Line 1:Incorrect syntax near 'hn'

  造成这种结果的原因是插入了.作为定界符的单引号。数据库尝试去执行'hn',但是失败。假如攻击者提供特别的输入如:

Forename:jo';drop table authors—
Surname:

  结果是authors表被删除,造成这种结果的原因我们稍后再讲。

  看上去好象通过从输入中去掉单引号或通过某些方法避免他们都能够解决这个问题。这是可行的,但是用这种方法做解决方法会存在几个困难。第一,并不是任何用户提供的数据都是字符串。假如用户输入的是通过用户id来查询author,那我们的查询应该像这样:

Select id,forename,surname from authors where id=1234

  在这种情况下,一个攻击者能够很简单地在数字的结尾添加SQL语句,在其他版本的SQL语言中,使用各种各样的限定符号;在数据库管理系统JET引擎中,数据能够被使用'#'限定。第二,避免单引号尽管看上去能够,但是是没必要的,原因我们稍后再讲。

  我们更进一步地使用一个简单的ASP登陆页面来指出哪些能进入SQLSERVER数据库并且尝试鉴别进入一些虚构的应用程式的权限。

  这是个提交表单页的代码,让用户输入用户名和密码:

<HTML>
<HEAD>
<TITLE>Login Page</TITLE>
</HEAD>

<BODY bgcolor='000000' text='cccccc'>
 <FONT Face='tahoma' color='cccccc'>
  <CENTER><H1>Login</H1>
  <FORM action='process_loginasp' method=post>
   <TABLE>
    <TR><TD>Username:</TD><TD><INPUT type=text name=username size=100 width=100></TD></TR>
    <TR>
     <TD>Password:</TD><TD><INPUT type=password name=password size=100 withd=100></TD>
    </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='tahoma' 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='tahoma' color='cc0000'>
<H1> <BR><BR>
<CENTER>ACCESS DENIED</CENTER>
</H1>
</BODY>
</HTML>
<% Response.end return; }
else {
 Session("username") = "" rso("username");
%>
<FONT Face='tahoma' color='00cc00'>
<H1> <CENTER>ACCESS GRANTED<BR> <BR>
Welcome, <% Response.write(rso("Username")); Response.write( "</BODY></HTML>" ); Response.end }
}

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 保护 SQL Server 数据库的十大绝招

下一篇: 跟日期有关的两条经典SQL语句