<font color=red>现在可以说了,一个严重的安全问题</font>(100分)

  • 主题发起人 主题发起人 soul
  • 开始时间 开始时间
S

soul

Unregistered / Unconfirmed
GUEST, unregistred user!
说起这个就要回忆起当初修改大富翁的初衷,—— 一个严重的安全问题。
这个问题表现在两个方面一个密码的检验,一个是整个网站数据库的安全。
这个问题在Sql server上尤其明显。并且它可能不仅仅出现在web上,很多程序也
有这个毛病。
好,听我说来。

大家知道,一句sql语句的语法,可是是否可曾想过你的意图被修改。
以大富翁为例,大富翁以前的密码检验程序大致如下形式
user=request("user")
pwd=request("pwd")
sql="select * from users where user='"+user+'" and <font color=red>pwd="'+pwd+'"'</font>
RS.Open SQL, Conn, 1, 1
if RS.RecordCount>0 then

' 通过验证
end if

问题就出在这里了,大家也许对此没有什么意见,其实却犯了大错误。
我如果输入
user=soul
pwd=" or user="soul
那么我便可以改变sql语句的本意,使我通行无阻。
所以大家在做这些事情时切记要考虑输入的合法性,看看是否会引起你的sql语句的改变。
对于数字型的变量一定确认输入的确是数字,而如果是字符串的话,尽量过滤掉 ' 号。
如果必须要存在 ' 号,那就得想法变成转义符号在嵌到sql语句中。
总之,不要让输入使得你的sql发生变化。
在上列中
现在在输入是过滤掉了 ' 号并且改成了。
user=request("user")
pwd=request("pwd")
sql="select * from users where user='"+user+'"
RS.Open SQL, Conn, 1, 1
if RS.RecordCount>0 then
if rs('pws')=pwd then
' 通过验证
end if
end if

第二点情况一般发生在sql server上,但比上面更严重,更可怕。
因为在sql server上形如 select * from aaa where a=1 select * from bbb where b=1 delete aaa where a=1
这样的东西是可以被正确执行的及
象大富翁原来的方式
Lid=request("lid")
.....
sql="select * from letters where id =" &amp;
Lid
这样的语句是非常可怕的。
因为我如果输入的url是 dispQ.asp?lid=33333 delete aaaa
那么sql将变成 select * from letters where id =33333 delete aaaa
其结果是 aaaa 库被无情删除。
这个后果尽管没在大富翁上发生,但其实大富翁在很长时间里都处在风雨飘摇之中。
真的很可怕。
现在终于起用的新版本,这个问题得到了完整的解决。我仔细检查了每一个角落。
可以说没有这些问题。
当然我也知道其实大富翁还是有很多我们没有考虑到的东西,由于对大富翁本身没
什么威胁,也就没去修正。

在此通报大家,希望引起大家的注意。这个问题是个普遍问题,和asp本身关系并
不大,大家在做自己程序的时候不妨也考虑下,是否自己已经犯了这个错误。

 
程序中存在BUG,可能开发者看一百遍也发现不了。
直到等其他人提醒或者被恶意破坏以后才知道。。。。。
计算机,我们到底敢不敢用它来处理严肃机密的资料呢?
难道没有根除这些安全性问题的办法?
以上两个问题都出在了SQL语句上。
我看SQL语句不够严密。
 
是否 Energy 发现的问题 ???
 
不关sql的事,这是程序控制的问题。
在asp的检验页面中,前辈们一直在提醒
不要让用户输入‘’“”=,空格等等这些非法字符
最简单的就是只让他输字母和数字。
 
可以说了
zwhc: 我就是Enery,我是上海人,过年后回了上海一次,此后多有变故,到再上大富翁
已经相隔3个月,居然忘了密码,于是新注册了soul 。
其实此刻的我和那时的我心境有很大不同了,现在这个名字更适合我。
心境不同不是因为什么变故,而是解脱了。
 
一些在聊天室莉的黑客技巧在这里管不管用呀.
我没试过,但给大家提个醒?
谢谢soul教会我这招
 
>> 我看SQL语句不够严密。
完全不关SQL的事!SQL的开发者如听得这种话,一定会Faint.
本来就是程序控制的问题,
以前的聊天室不就是这样吗!? 但你看看现在的聊天室还会不会这样?
你在聊天室里还能用JavaScript 写死循环吗?
可是,以前的大富翁的确不安全。
 
>>居然忘了密码
hahahaha
>>解脱了
恭喜恭喜
 
>>zwhc
呵呵,看看我以前回答小天的一个帖子。你也许会明白一些,个中原因我只漏了那一句。
 
附:
<a href="soft/delphibbs/delphibbs_struct.sql">数据库结构</a>
<a href="soft/delphibbs/delphibbs_src.zip">最新代码</a>
 
我 .. 脚发软……耳鸣,头晕,好恐怖!
 
唉,
不会你用的是假email吧:-<
呵呵,
说到漏洞,我就想起了现在国内不少大网站上的bbs论坛了,
这些网站投入都很大,
也运行了有一段时间了,
可是,
不论是用asp还是php做,
程序逻辑中的不到之处都很多,
尽管可能没法得到源码,
但通过观察,
用心的人往往可以发现问题.
所以我觉得一般来说,
工具的好坏不是绝对的,
关键还是看人们怎么用它。
很多时间,
问题所在之处,
就是我们在划分问题域时,没有认真仔细的分析实际问题,
这样当问题域没有覆盖实际问题时,
我们可以较容易找出并修正,
但当问题域大于实际问题时,
实际问题是覆盖了,
但也覆盖了不应覆盖的东西,这样就可能导致部分不可预料的结果。
soul, 近来事情太多了,可能不能常来了;(
 
都是有心人!
 
amo:你好深奥;呵呵。
不太懂耶。
是不是意思是:当我们的代码没有把系统可能历经的范围全部涵盖时,就有可能在某些
特定条件下发生我们并不预期的结果。
呵呵(比深奥)
 
高手就是与众不同。我又进步了!
 
>>>>我就是Enery,我是上海人,过年后回了上海一次
上海人不在上海?不是上海人想去上海.矛盾吗?
 
to Soul:
你说的这个bug是什么时候的是呀?我刚刚登录大富翁的时候
就试图用这个方法hack过去,但是看了大富翁的源代码后,
发现没有这种漏洞,因此作罢。
难道那时候这个漏洞已经被临时改过了?还是我看代码不仔细?
相反,倒是另外一个漏洞被我发现,因此"偷"了好几个人的帐号。
(不过那都是垃圾帐号,大家不用害怕,“活人”的帐号我是不敢偷的 :-)
这个漏洞就是修改用户信息page上的hidden value--username,
是从上一页获得后写死在页面上的,而不是从cookie中获得,因此轻易被穿透。
 
你看的是什么版本的代码,呵呵,在现在这个版本之前就是这样的,也许你看了我的新代码
以为大富翁没问题吧,呵呵,上当了。
还有现在你说的地方现在也没这个问题。我早就注意到了。
 
SQL语言太灵活,可以拼接出一个文本串来执行。
这样就带来种种隐患。。。 请三思吧。
过滤输入也有需要注意之处。
我可以自己画出一个新网页,画出一个新FORM来填内容。
只要里面的标识符一致,当然也可以将信息发到SERVER去。
所以过滤输入必须放到SERVER上的ASP里过滤。
当然,通过严密的检查和测试可以做到滴水不露,
我的意思是给我们写代码带来了很多陷阱。。。
 

安全问题总是让人头痛
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部