著名的SQL流量注入(SQL注入)攻击法

之所以旧事重提,只是想给那些还没接触到的人提个醒,顺便听听众位高手们的看法,好学习学习。


我们在编程过程中,经常会把用户输入的数据拼成一个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 on 2006-07-12 16:16 莫相会 阅读(4203) 评论(31)  编辑 收藏 网摘

评论

#1楼  2006-07-12 16:27 风中的葱 [未注册用户]   回复  引用    

Sql语句也可以用参数
select * from user u where u.id=@u

#2楼  2006-07-12 16:28 ekinwt [未注册用户]   回复  引用    

哈哈,参数化的传递就不会了啊..SQL注入确实挺恐怖的..

#3楼  2006-07-12 16:55 l [未注册用户]   回复  引用    

这个不是早就知道了吗,如果不过管客户输入什么都要强制把“‘”改为“’‘”就可以了,再说如果没有强制转换,当客户输入中有一个“’”字符时,程序也会报错。

#4楼  2006-07-12 16:58 阿不         回复  引用  查看    

还没有真正理解 Ado.net。

#5楼  2006-07-12 17:14 smalldust         回复  引用  查看    

为什么中文叫作流量注入???
不是SQL Injection吗?流量是从哪里来的?我还以为数据吞吐流量呢。
而且应该是若干年前就有的吧。

#6楼 [楼主] 2006-07-12 17:19 莫相会         回复  引用  查看    

对,强制转换也是一个好办法,参数化的传递也可以避免,不过使用存储过程更好啊,效率和安全性高了很多,而且很灵活,有时业务变更了都不需要改动程序代码,能省不少功夫

#7楼 [楼主] 2006-07-12 17:22 莫相会         回复  引用  查看    

@smalldust
确实是老话题了,纯属旧事重提,喜欢看看大家的见解

#8楼  2006-07-12 17:27 U2U         回复  引用  查看    

这不是普通的SQL Injection吗?干吗说什么“流量注入”,这就弄不明白了。作者的意思是……?

#9楼 [楼主] 2006-07-12 17:53 莫相会         回复  引用  查看    

其实很多文献中都把它翻译成了“SQL流量注入”,也有叫“SQL注入”的,偶也是借鉴别人的啊^_^
之所以旧事重提,只是想给那些还没接触到的人提个醒,顺便听听众位高手们的看法,好学习学习。
其实名字只是个代号,没必要为这个争论吧~_~

#10楼  2006-07-12 18:19 Cure         回复  引用  查看    

搂主不厚道,“流量注入”纯属吸引眼球:)

#11楼 [楼主] 2006-07-12 18:33 莫相会         回复  引用  查看    

@Cure
确实有这样的叫法,不是为了造势啊 *_*

#12楼  2006-07-12 18:45 galford [未注册用户]   回复  引用    

楼主火星来的
“流量注入”还真的是第一次看到
出现在首页确实不应该啊

#13楼  2006-07-12 19:06 lovecherry         回复  引用  查看    

火星了

#14楼 [楼主] 2006-07-12 19:12 莫相会         回复  引用  查看    

被大家说得我好惭愧啊:-(

#15楼  2006-07-12 19:23          回复  引用  查看    

1、最少权限原则应该是解决这个问题较好的办法。就是在用户管理方法要麻烦些。
2、一般使用存储过程的参数来传递,也会很大程序上避免这个问题(长度限制、特殊符号处理等)

还是去“组合式单词查找网站”http://www.pinstudy.com 去实际体验一下就知道了。
a.使用最少权限:该用户使用缺省的Pulic角色,且设置只能读特定表的数据;写权限另外配置
b.使用存储过程:一些放在数据库内,一些使用ADO.net-参数化查询(像@阿不说那样)

#16楼  2006-07-12 20:48 路过 [未注册用户]   回复  引用    

关了ms sql的端口,就算建了帐号也没用吧

#18楼  2006-07-12 21:42 bytesX [未注册用户]   回复  引用    

呵呵
大家不要打击lz, lz没什么恶意.

#19楼  2006-07-12 21:43 AlphaWu         回复  引用  查看    

报告:
楼上是色情网站

#20楼  2006-07-13 09:00 风满袖         回复  引用  查看    

SQL流量注入 和SQL注入 ---- 根本不是一个意思.而且根本没有什么SQL流量注入的说法.

#21楼 [楼主] 2006-07-13 09:23 莫相会         回复  引用  查看    

http://www.baidu.com/s?ie=gb2312&bs=%22SQL%C1%F7%C1%BF%D7%A2%C8%EB%22&sr=&z=&cl=3&f=8&wd=%22SQL%C1%F7%C1%BF%D7%A2%C8%EB%22&ct=0
各位仁兄,光争论没用啊,到网上搜搜不就知道了,还有许多书籍上有这种说法

#22楼  2006-07-13 09:49 风满袖         回复  引用  查看    

你也不看看,这些链接几乎指向的是相同的内容.该文的作者显然翻译错误

#23楼  2006-07-13 10:25 萧寒         回复  引用  查看    

炒现饭;

#24楼 [楼主] 2006-07-13 12:09 莫相会         回复  引用  查看    

@风满袖
仁兄,不知道是怎么“显然”错误的
清华大学出版社出的一本.NET的书,也有这么说,书名不记得了

#25楼  2006-07-13 12:28 smalldust         回复  引用  查看    

@莫相会

声明一下,我虽然刚开始对“流量注入”没有搞清是什么,也觉得SQL Injection的确是老话题,但是觉得lz这篇文章还是很有帮助的。尤其是最近使用SQL Injection进行的入侵比较多,方法也比原来有了更多新花样,所以旧话重提也未尝不可,支持lz发文。

至于名称“流量注入”是否合适,我觉得翻译方面仁者见仁智者见智,就算lz翻译的不妥当,也不该指责lz吧。并且,网上的确存在许多这样的翻译,究竟哪个合适,我觉得还需要进一步考究。

我也为我最开始的回复中措辞不大适当而道歉,希望lz不要在意,不要气馁。

#26楼  2006-07-13 14:58 阿福         回复  引用  查看    

任何时候都使用sql参数

#27楼  2006-07-14 10:10 无聊 [未注册用户]   回复  引用    

火星贴

#28楼  2006-07-15 13:54 zergtant [未注册用户]   回复  引用    

我记得。devday2004的时候,下午第一个介绍web安全就说过用参数化传递可以防止sql injection吧,可惜的是我党是太困竟然睡着了,哈哈

#29楼  2006-07-19 16:42 鲁莽 [未注册用户]   回复  引用    

这是我用存储过程写的查询,好像依然无法避免被攻击的结果啊!有不敬的地方还希望指正出来!
create PROCEDURE prcCheckUseCa(@chryhm char(255)) AS
Begin
declare @intUseCa integer

select @chryhm=ltrim(@chryhm)

begin transaction
select @intUseCa=ISNULL(intUseCA, 0) from gzry where chryhm=@chryhm
select @intUseCa=ltrim(@intUseCa)
if (@@error<>0)
begin
rollback transaction
select @intUseCa=0
select @intUseCa
return 0
end
select @intUseCa
commit transaction
End
GO

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

#30楼  2006-07-19 17:21 philip [未注册用户]   回复  引用    

不小心是会犯这个错误的。

#31楼  2008-01-29 22:14 HappyQQ         回复  引用  查看    

郁闷,我还以为是什么新鲜的功击方式!
正确名字应该是“SQL注入功击,或者是SQL injection“
网上一大把这类的文章

发表评论



姓名 [登录] [注册] 
主页
Email (仅博主可见) 
验证码 *  验证码看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论   新用户注册   返回页首      

导航: 网站首页 社区 新闻 博问 闪存 网摘 招聘 .NET频道 知识库 找找看 Google站内搜索



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务

相关文章:

相关链接: