SQL注入

1.转自:http://www.cnblogs.com/upcontrol/archive/2009/10/25/1589469.html

sql注入式最常见的注入式攻击之一,根据一些用户输入创建查询字符串,这对应用程序来说是非常普遍的。下面是一条用于登陆页身份验证的语句

 

select username from user where username='xxxx' and password='xxxx'

 

 如果用户输入的是 "user1" 和 "123456" 那么不会有什么问题,生成的sql语句如下

 

select username from user where username='user1' and password='123456'

 

但是只需要对输入进行一个很小的修改,就能跳过约束,对其进行控制。例如用户提供的是"user1'--" 和 "123456",来看看sql语句如何改变。

 

select username from user where username='user1'--' and password='123456'

 

psssword语句被注释掉了,并且攻击者仅需要知道验证用户名,便能成功跳过登陆对话框。

同样下面这个看起来没有什么问题的sql语句依然使数据库完全暴漏。

 

select description,price,stock from product where description='xxxxx'

 

此外,注入未处理的" ';drop table product --"语句,能删除整个数据表,并导致整个应用程序不能使用。技能更高超的攻击者能使用这种有缺陷的代码窃取信息,例如数据库保存的客户数据。

攻击者使用一种叫做蒙蔽sql注入的技术,通过从0开始的数字和数据库元数据获取关于数据库,表和列名信息。使用sql联合语句,攻击者能合并多个查询的输出,并显示请求的数据,例如一个GridView,就可以使用下面的命令用于在数据库中进行蒙蔽sql注入

'union select @@version,null,null --       显示sql server的版本

'union select name,null,null from sys.database--   返回所有数据库的名称

'union select table_name,null,null from db.information_schema.tables--   返回所选数据库总所有表的名称

'union select column_name,null,null from db.information_schema.columns where table_name='xxxx'--  返回所选表中所有列的名称

 

对于sql注入最行之有效的缓解方法是使用存储过程,存储过程有一个额外的优点:锁定对数据库的访问,不允许直接访问表。但是存储过程中同样不应该让字符串和参数管理额,例如使用Exec dbo.Someproc + SomeVariable方式。

 

2.http://hi.baidu.com/%B0%FC%D7%D3%C6%CC%CD%F5%D5%C6%B9%F1/blog/item/520a32256f1c286a35a80f49.html

3.http://www.cnblogs.com/thcjp/archive/2006/06/03/416617.html

4.http://www.cnblogs.com/maxianghui/archive/2006/07/12/448978.html

我们在编程过程中,经常会把用户输入的数据拼成一个SQL语句,然后直接发送给服务器执行,比如:

string SqlStr = "select * from customers where CompanyName Like '%" + textBox1.Text + "%'";

这样的字符串连接可能会带来灾难性的结果,比如用户在文本框中输入:

a' or 1=1 --

那么SqlStr的内容就是:

select * from customers where CompanyName like '%a' or 1=1 --%'

这样,整个customers数据表的所有数据就会被全部检索出来,因为1=1永远true,而且最后的百分号和单引号被短横杠注释掉了。

如果用户在文本框中输入:

a' EXEC sp_addlogin 'John' ,'123' EXEC sp_addsrvrolemember 'John','sysadmin' --

那么SqlStr的内容就是:

select * from customers where CompanyName like '%a' EXEC sp_addlogin 'John','123' EXEC sp_addsrvrolemember 'John','sysadmin' --

这个语句是在后台数据库中增加一个用户John,密码123,而且是一个sysadmin账号,相当于sa的权限。

如果用户在文本框中输入:

a' EXEC xp_cmdShell('format c:/y') --

运行之后好像是格式化C盘!

还有很多更危险的操作,不过都没试过。还是存储过程好用啊,存储过程的参数把用户的输入当成真正的字符串处理,既安全,又快速!

posted @ 2009-10-25 17:30  .NET钉子户  阅读(311)  评论(0)    收藏  举报