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

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

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

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

[存储过程]

传统的认识是如果ASP程序使用了数据库系统的存储过程,那么就不可能SQL注入了。这句话不完全对,这依赖于ASP脚本调用存储过程的方式。

本质上,一个带参数的查询执行了,用户提供的参数就被安全的传给查询,SQL注入就不可能了。但是,如果攻击者可以对无数据部分的查询语句施加任何影响,他们仍然可能控制数据库。

一个有用的规则是:

1. 如果ASP脚本创建了一个提交给服务器的SQL查询语句,这是很容易被SQL注入的,即使它使用了存储过程。
2. 如果ASP脚本使用了封装传递参数给存储过程的过程对象(如ADO command对象,和参数集合一起使用的)那么它通常就很安全了,但是这还要取决于对象的执行。

明显的,最好习惯于验证所有的用户输入,因为新的攻击技术会不停的涌现。

为了说明存储过程查询的注入,运行下面的SQL语句:

sp_who '1' select * from sysobjects

或者

sp_who '1' ; select * from sysobjects

任何附加语句在存储过程执行后还是可以执行。

[高级Sql注入]

一个应用程序通常过滤单引号,另一方面限制用户的输入,比如限制长度。

在这里,我们将讨论一些绕过一些明显的SQL注入防范的和长度限制的技巧。

[没有符号的字符串]

有时候,开发人员可能已经通过过滤单引号来保护应用程序,比如用VBScript的'replace'函数:

function escape( input )
input = replace(input, "'", "''")
escape = input
end function

不可否认,这会阻止所有的对我们上面给出的对示例站点的攻击,删除';'字符也会起作用。但是,在一个大的程序里一些用户输入可能被假定为数值型。这些值没有限制,提供了很多可以注入的地方。

如果攻击者希望创建一个字符串值而不使用引号,他们可以用'char'函数。例如:

insert into users values( 666,
char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73),
char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73),
0xffff)

它是一个往表里插入字符的不带引号的查询语句。

当然,如果攻击者使用一个数值型的用户名和密码的话,下面的语句也同样可以很好的执行:

insert into users values( 667,
123,
123,
0xffff)

因为SQL-Server自动将数值型的转换成'varchar'类型,类型转换是默认的。

0
投稿

猜你喜欢

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