介绍:
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 } }
文章整理:西部数码--专业提供域名注册、虚拟主机服务 相关文章
热点关注
IDC资讯
虚拟主机
域名注册
托管租用
vps主机
智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源 网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧 行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒 网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它 服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护 软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer 网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash 程序设计 Java技术 C/C++ VB delphi 网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术 操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD |




