编写安全的代码-程序员头顶的达摩克利斯之剑

        程序员和黑客有种天生地说不完道不尽的恩怨纠缠,很多计数很高超的黑客同时也都是技术高超的程序员,但是大多数程序员却在同黑客做着生死抗争,特别是编写在公网上运行的业务系统的程序员,更是步步小心.但是与黑客相比,程序员的制肘更多一些,黑客往往只需要一个漏洞就可以逍遥了,但是程序员却要步提防,因为一个小漏洞就可能让自己陷入麻烦.程序是一个有机的整体,并不是所有的代码都无懈可击了的时候就能高枕无忧了,很多时候看来安全的系统却是到处都是口子,我们来看一个例子.
        系统A,是一个在线的交易系统,里面有用户注册功能,但是因为用户常常忘记自己的密码,所以提供了一个密码找回的功能.这里因为系统A使用的严格测试过的ORM的DataMapping组件,所以不存在任何注入的问题,所以用SQL注入看来是没戏了,但是这样子就安全了吗?所以程序员Z同学又在找回密码的地方作了很多加强安全性的处理,但是用户都有不好的习惯,因为嫌麻烦,很多时候用户的找回密码提示和答案都是一样的,Ctrl C,Ctrl V比较快嘛。所以在这里他首先是对IP进行限制,一个IP在30秒内只能请求3次,然后是账号每个帐户在找回密码的时候只能输错3次验证码,如果超过3次就提醒用户你的帐户今天不能再找回了,已经被冻结了,请明天再试。现在看起来这个系统真的是固若金汤了吧。
        其实安全就素那浮云一般,真的安全就是关掉服务器 。我们来看黑客H同学是如何简突破系统的,首先黑客H同学是菜鸟黑客,只会使用朔雪等,他在系统A有帐号,在找回密码的页面随便输入了一些东西后,他拿出工具开始写脚本。首先他要工具不停的根据字典请求字典上的用户名去找回密码,验证码随便输因为那个已经不重要的,他设定每个用户名只请求4次,然后分析回馈的结果HTML,如果找到“你的帐户今天不能再找回了”的字符串就把这个请求的用户名记录下来,因为这表明这个用户已经是在系统中存在的用户名。然后H同学就把这个工具放到了师傅送他的几个肉鸡上,然后就在等待结果了。
         第二天,H同学打开自己邮箱查看战果,这个时候工具已经找到了一千多个账号了,由于无法突破验证码,于是他决定手工来做,用已经找到的用户名,答案直接用找回密码提示,这样子经过一下午的努力,H同学获取到了80多个帐户的密码,每个帐户每月的消费限额是200元,这样子,经过2天的努力,菜鸟黑客H同学就获利1600元了。
         这里除了H同学是虚构的外,整个事件是真实案例改编,H同学的行为是通过分析IIS日志推导出的。
         这里提醒各位,很多时候不要光把眼光局限在代码本身,代码外的业务逻辑上如果有了漏洞也是非常的致命的。

posted on 2007-03-22 09:40 亚历山大同志 阅读(2840) 评论(25)  编辑 收藏 网摘 所属分类: 随笔

评论

#1楼  2007-03-22 09:55 wuyisky [未注册用户]

是呀,黑客促进了软件的发展   回复  引用    

#2楼  2007-03-22 10:05 Cat Chen      

“其实安全就素那浮云一般,真的安全就是关掉服务器”——这是错误的,去看看Kevin Mitnick的The Art of Deception吧,关掉的机器并不安全,因为安全体系中真正薄弱的环节是人,诱骗一个有权限人去帮你把机器启动就是了。   回复  引用  查看    

#3楼  2007-03-22 10:05 ncindy      

这个案例不能说是系统不安全吧,只能说用户安全习惯不够好。   回复  引用  查看    

#4楼 [楼主] 2007-03-22 10:16 亚历山大同志      

@ncindy
你不能因为用户的习惯不好就推托系统的责任,在设计系统地时候就应该把用户当作白痴来对待。   回复  引用  查看    

#5楼  2007-03-22 10:20 henry      

@亚历山大同志
假设一个用户在注册一个blog时,老是提示密码不合符规则!
说不定网站很快会失去这个客户,并不是什么客户都有这个耐性的:)   回复  引用  查看    

#6楼  2007-03-22 10:25 henry      

晕原来把上个回贴改了-.-!   回复  引用  查看    

#7楼 [楼主] 2007-03-22 10:26 亚历山大同志      

@henry
你的reply应该对ncindy 说才对哦,就因为你说的原因我们才不能过多的限制用户   回复  引用  查看    

#8楼  2007-03-22 10:30 装配脑袋      

这样的话,只能在填写找回密码问题的答案时提示:
“对不起,您的找回密码问题的答案过于简单,答案至少包含6个字,不能包括密码中任意子串,不能包括用户名,不能包括问题中任意字符,不能是过去24次修改问题所使用过的答案之一,必须包括以下至少3组字符:简体汉字,繁体汉字,日语假名和英文字母……”   回复  引用  查看    

#9楼 [楼主] 2007-03-22 10:35 亚历山大同志      

@装配脑袋
这样子用户会在找回密码的时候连自己的问题答案都忘记了,比如我老妈就常常忘记自己的QQ号码是多少,每次重装系统后都要来问我   回复  引用  查看    

#10楼  2007-03-22 10:43 PureEviL      

@亚历山大同志
我爸从不重装系统   回复  引用  查看    

#11楼  2007-03-22 10:54 henry      

其实也不能一概而论,系统有没有安全策略的目的都是为了吸引不同客户.
不过这样说下去跑题了....   回复  引用  查看    

#12楼  2007-03-22 10:58 Jeffrey Zhao      

@装配脑袋
that's cool   回复  引用  查看    

#13楼  2007-03-22 11:00 Jeffrey Zhao      

其实安全性方面,“防”永远是处于劣势的,现在很多安全原理和原则已经做得很好了,很不容易。   回复  引用  查看    

#14楼  2007-03-22 12:31 eBay      

1st, 很明显的,这个应用存在严重的信息泄露问题。用户登录名的泄露也是一种泄露,而且很严重。

2nd, “账号每个帐户在找回密码的时候只能输错3次验证码”,验证码的目的是什么?为什么要把防止非人工请求的东西跟用户逻辑关联起来?

对于一般的应用系统,我们无法要求用户具备跟专业人士一样的安全素养。但是,可以引导用户。其次,程序员在coding的过程中有没有最起码的编写Secure Code的意识呢?
  回复  引用  查看    

#15楼  2007-03-22 12:35 eBay      

Programming is like sex. One mistake and u r supporting it for the rest of ur life. So pay ur biggest attention to the security.   回复  引用  查看    

#16楼  2007-03-22 13:18 Cure      

楼上比较搞笑,呵呵   回复  引用  查看    

#17楼  2007-03-22 13:26 Cat Chen      

@eBay
没错,系统本身就存在用户名泄漏,这就不能说是攻击者厉害了。合法的用户名才会提醒“已锁定”,这是很笨的做法,一般都不会如设计。正确的做法是无论用户名是否合法都提醒“已锁定”。   回复  引用  查看    

#18楼  2007-03-22 14:00 deerchao      

安全,性能,易用性,灵活性这几者之间必然得有个平衡,不可能为了安全性把其它的全都抛下.

最安全的软件是没有人用的软件.   回复  引用  查看    

#19楼 [楼主] 2007-03-22 14:03 亚历山大同志      

@ALL
2007-03-22 13:26 by Cat Chen
@eBay
没错,系统本身就存在用户名泄漏

我想说的就是这个,所以虽然代码没有漏洞,但是在业务上出现了漏洞,所菜鸟黑客才可以在仔细分析回馈的信息后作出正确的攻击手段,很多时候我们常常会忽略这些问题,虽然在别人的系统出现问题的时候都会去这样给别人指出。   回复  引用  查看    

#20楼  2007-03-22 14:52 ocean [未注册用户]

其实根本就没有真正的系统安全,系统永远是脆弱的,你想突破网络进入到微软的内网获取微软的内部资源吗?ok,只要加入微软就可以了,所有资源你都可以访问了。   回复  引用    

#21楼  2007-03-22 15:18 javanb [未注册用户]

嗯,楼主说的故事和安全代码没有关系,和业务逻辑有关系,本质上说漏洞是永远存在的,让人进入便要留下口子   回复  引用    

#22楼  2007-03-22 15:37 fhmsha [未注册用户]

是我没看懂吗?

现在密码找回的功能都是用注册时填写的邮箱的

这个H用自己的怎么可能收得到别人的请求?
难道密码找回可以用任意邮箱来收信??   回复  引用    

#23楼  2007-03-22 16:45 pscj [未注册用户]

密码找回了也应该是寄到注册者的邮箱中,黑客怎么会得到密码的   回复  引用    

#24楼  2007-03-24 09:01 剑在上海^^ [未注册用户]

为什么不在找回密码的地方也使用验证码机制,他的暴力不就没用了?   回复  引用    

#25楼  2007-08-22 20:35 wwl      

垃圾文章,浪费首页资源。   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接:
 




导航

公告

鉴于很多TX投诉黑色背景杀伤眼球,遂换个容易阅读的
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

与我联系

搜索

 

常用链接

留言簿(29)

我参加的小组

我的标签

随笔分类(84)

随笔档案(83)

相册

朋友的Blog

同事的Blog

最新随笔

积分与排名

最新评论

阅读排行榜

评论排行榜

60天内阅读排行