网络编程
位置:首页>> 网络编程>> 数据库>> SQL Server应用程序的高级Sql注入(2)

SQL Server应用程序的高级Sql注入(2)

作者:Chris Anley luoluo 来源: * 八进制 发布时间:2009-04-11 16:54:00 

标签:SQL,Server,应用程序,Sql注入

我们将以Active Server Pages(ASP)登陆页面为例子来详细说明,它访问一个Sql-Server数据库并且验证一个到我们假想的程序的访问。

这是用户填写用户名和密码的表单页面:

<HTML> 
<HEAD> 
<TITLE>Login Page</TITLE> 
</HEAD> 
<BODY bgcolor='000000' text='cccccc'> 
<FONT Face='tahoma' color='cccccc'> 
<CENTER><H1>Login</H1> 
<FORM action='process_login.asp' method=post> 
<TABLE> 
<TR><TD>Username:</TD><TD><INPUT type=text name=username size=100%width=100></INPUT></TD></TR> 
<TR><TD>Password:</TD><TD><INPUT type=password name=password size=100% 
width=100></INPUT></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 


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_login.asp'中的创建'query string'的部分:

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

如果用户指定了下面这样的数据:

Username: '; drop table users--
Password:

'users'表会被删除,所有用户都不能登陆。'--'是Transact-SQL(交互式SQL)的单行注释符,';'标志着一个查询的结束另一个查询的开始。用户名最后的'--'用来使这个特殊的查询无错误结束。

攻击者只要知道用户名,就可以通过以下的输入以任何用户的身份登陆:

Username: admin'--

攻击者可以通过下面的输入以用户表里的第一个用户来登陆:

Username: ' or 1=1--

...更有甚者,攻击者通过以下的输入可以以任意虚构的用户登陆:

Username: ' union select 1, 'fictional_user', 'somoe_password', 1--

因为程序相信攻击者指定的常量是数据库返回的记录集的一部分。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com