选择显示字体大小

sql server应用程序中的高级sql注入

这份文档是详细讨论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>


<center>access denied</center>
</h1>
</body>
</html
<% response.end return; }
else {
 session("username") = "" + rso("username");
%>
<font face='tahoma' color='00cc00'>
<h1> <center>access granted


welcome, <% response.write(rso("username")); response.write( "</body></html>" ); response.end }
}
function main() {
 //set up connection
 var username
 var cn = server.createobject( "adodb.connection" );
 cn.connectiontimeout = 20;
 cn.open( "localserver", "sa", "password" );
 username = new string( request.form("username") );
 if( username.length > 0) {
  login( cn );
 }
 cn.close();
}
main();
%>


  出现问题的地方是process_lgin.asp中产生查询语句的部分:

var sql="select * from users where username='"+username+"' and password='"+password+"'";

  如果用户输入的信息如下:

username:';drop table users—
password:

  数据库中表users将被删除,拒绝任何用户进入应用程序。'—'符号在transact-sql中表示忽略'—'以后的语句,';'符号表示一个查询的结束和另一个查询的开始。'—'位于username字段中是必须的,它为了使这个特殊的查询终止,并且不返回错误。

  攻击者可以只需提供他们知道的用户名,就可以以任何用户登陆,使用如下输入:

username:admin'—

  攻击者可以使用users表中第一个用户,输入如下:

username:' or 1=1—

  更特别地,攻击者可以使用完全虚构的用户登陆,输入如下:

username:' union select 1,'fictional_user','some_password',1—

  这种结果的原因是应用程序相信攻击者指定的是从数据库中返回结果的一部分。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons