SQLServer应用程序中的高级SQL注入
2009-05-12 20:20:55来源:未知 阅读 ()
介绍:
SQL是一种用于关系数据库的结构化查询语言。它分为许多种,但大多数都松散地基于美国国家标准化组织最新的标准SQL-92。典型的执行语句是query,它能够收集比较有达标性的记录并返回一个单一的结果集。SQL语言可以修改数据库结构(数据定义语言)和操作数据库内容(数据操作语言)。在这份文档中,我们将特别讨论SQLSERVER所使用的Transact-SQL语言。
当一个攻击者能够通过往query中插入一系列的sql语句来操作数据写入到应用程序中去,我们管这种方法定义成SQL注入。
一个典型的SQL语句如下:
Selectid,forename,surnamefromauthors
这条语句将返回authors表中所有行的id,forename和surname列。这个结果可以被限制,例如:
Selectid,forename,surnamefromauthorswhereforename'john'andsurname='smith'
需要着重指明的是字符串'john'和'smith'被单引号限制。明确的说,forename和surname字段是被用户提供的输入限制的,攻击者可以通过输入值来往这个查询中注入一些SQL语句,
如下:
Forename:jo'hn
Surname:smith
查询语句变为:
Selectid,forename,surnamefromauthorswhereforename='jo'hn'andsurname='smith'
当数据库试图去执行这个查询时,它将返回如下错误:
Server:Msg170,Level15,State1,Line1
Line1:Incorrectsyntaxnear'hn'
造成这种结果的原因是插入了.作为定界符的单引号。数据库尝试去执行'hn',但是失败。如果攻击者提供特别的输入如:
Forename:jo';droptableauthors—
Surname:
结果是authors表被删除,造成这种结果的原因我们稍后再讲。
看上去好象通过从输入中去掉单引号或者通过某些方法避免它们都可以解决这个问题。这是可行的,但是用这种方法做解决方法会存在几个困难。第一,并不是所有用户提供的数据都是字符串。如果用户输入的是通过用户id来查询author,那我们的查询应该像这样:
Selectid,forename,surnamefromauthorswhereid=1234
在这种情况下,一个攻击者可以非常简单地在数字的结尾添加SQL语句,在其他版本的SQL语言中,使用各种各样的限定符号;在数据库管理系统JET引擎中,数据可以被使用'#'限定。第二,避免单引号尽管看上去可以,但是是没必要的,原因我们稍后再讲。
我们更进一步地使用一个简单的ASP登陆页面来指出哪些能进入SQLSERVER数据库并且尝试鉴别进入一些虚构的应用程序的权限。
这是一个提交表单页的代码,让用户输入用户名和密码:
<HTML> <HEAD> <TITLE>LoginPage</TITLE> </HEAD> <BODYbgcolor='000000'text='cccccc'> <FONTFace='tahoma'color='cccccc'> <CENTER><H1>Login</H1> <FORMaction='process_loginasp'method=post> <TABLE> <TR><TD>Username:</TD><TD><INPUTtype=textname=usernamesize=100width=100></TD></TR> <TR><TD>Password:</TD><TD><INPUTtype=passwordname=passwordsize=100withd=100></TD></TR> </TABLE> <INPUTtype=submitvalue='Submit'><INPUTtype=resetvalue='Reset'> </FORM> </Font> </BODY> </HTML> 下面是process_login.asp的代码,它是用来控制登陆的: <HTML> <BODYbgcolor='000000'text='ffffff'> <FONTFace='tahoma'color='ffffff'> <STYLE> p{font-size=20pt!important} font{font-size=20pt!important} h1{font-size=64pt!important} </STYLE> <%@LANGUAGE=JScript%> <% functiontrace(str){ if(Request.form("debug")=="true") Response.write(str); } functionLogin(cn){ varusername; varpassword; username=Request.form("username"); password=Request.form("password"); varrso=Server.CreateObject("ADODB.Recordset"); varsql="select*fromuserswhereusername='"+username+"'andpassword='"+password+"'";trace("query:"+sql); rso.open(sql,cn); if(rso.EOF){ rso.close(); %> <FONTFace='tahoma'color='cc0000'> <H1><BR><BR> <CENTER>ACCESSDENIED</CENTER> </H1> </BODY> </HTML> <%Response.endreturn;} else{ Session("username")=""+rso("username"); %> <FONTFace='tahoma'color='00cc00'> <H1><CENTER>ACCESSGRANTED<BR><BR> Welcome,<%Response.write(rso("Username"));Response.write("</BODY></HTML>");Response.end} } functionMain(){//Setupconnection varusername varcn=Server.createobject("ADODB.Connection"); cn.connectiontimeout=20; cn.open("localserver","sa","password"); username=newString(Request.form("username")); if(username.length>0){ Login(cn); } cn.close(); } Main(); %> |
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- SQL Server数据体系和应用程序逻辑详解 2009-05-12
- SQL Server应用程序的高级Sql注入 2009-05-12
- MySQL中SQL的单字节注入与宽字节注入 2009-05-12
- SQL注入攻击成为新威胁将挑战操作系统安全 2009-05-12
- 大内存SQL Server数据库的加速剂 2009-05-12
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash