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

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

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

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

[SQL二次注入]

即使一个程序总是过滤单引号,攻击者仍然可以先注入SQL作为数据存放在数据库里然后被程序再次使用。

比如,一个攻击者可能通过注册,创建一个用户名

Username: admin'--
Password: password

程序正确的过滤了单引号,'insert'语句如下:

insert into users values ( 123, 'admin''--', 'password', 0xffff)

我们假设程序允许用户更改密码,ASP脚本在设置新的密码前先确认用户旧密码正确。代码可能这样写:

username = escape( Request.form("username") );
oldpassword = escape( Request.form("oldpassword") );
newpassword = escape( Request.form("newpassword") );
var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username + "' and password = '" + oldpassword + "'";
rso.open( sql, cn );
if (rso.EOF)
{

设置新密码的查询语句可能这样写的:

sql = "update users set password = '" + newpassword + "' where username = '" + rso("username") + "'"

rso("username")是登陆的查询返回的的用户名。

用户名为admin'--,上面的查询就变成了这样:

update users set password = 'password' where username = 'admin'--'

因此攻击者可以通过注册了一个名叫admin'--的用户来把admin的密码改成他们自己的。

这是个危险的问题,目前大部分的大型程序都试图过滤数据。最好的解决方法是拒绝非法输入,而不是简单的改变它。这有时候会导致一些问题,非法字符在某些地方是必要的,比如在名字带符号的情况:

O'Brien

从安全的角度,最好的解决办法是不允许出现单引号。如果这样不行,必须避免它们出现,这种情况下,最好保证所有要进入SQL语句的字符(包括从数据库里取出的字符)都被正确的处理过。

即使这样攻击依然可能实现:如果攻击者可以不经过程序而往系统插入数据。比如攻击者有一个email接口,或者有一个可以控制的错误记录数据库。最好总是验证所有的数据,包括系统里的数据,验证函数调用很简单,比如:

if ( not isValied( "email", request.querystring("emil") ) ) then
response.end

或者其他的方法

0
投稿

猜你喜欢

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