编写安全的ASP代码
发布时间:2008-03-24 20:10:00
ASP中数据库的安全是一个很严肃的问题。很多代码的编写者意识到了这类问题,并且小心翼翼地对他们认为有问题的地方做了补救,但常见的情况是要么没有穷尽所有的可疑地点,要么这种补救逻辑上有误。对于一个耐心且嗅觉灵敏的攻击者来说,这种意义上的补救措施和没有任何补救措施没有本质上区别。
下面罗列的是一些可能出现的问题:有些是常见易犯的错误,有些根本就是逻辑上有问题。看看你是不是也这样写过?对于攻击者而言,倒着看这些东西,应该对寻找漏洞有点帮助,更为完整一点的检测方法,请等我的关于黑/白盒分析和自动化测试文章。
一、令人疑惑的过滤方式
典型例子是不管不顾地对所有的输入变量都去掉单引号,或者是把单引号替换成合法的两个单引号,例如:
id = replace(request.querystring("id"), "'", "")
str = replace(request("someinput"), "'", "''")
现在很明了的是,第一个做法很有可能是错误的。因为引起SQL Injection的不总是单引号,再扩大一点,引起问题的不是任何单独的符号,这样子的过滤,有些冤枉单引号了。正确的利用注入,重要的一点是闭合前面的一句SQL查询语句——往往是得先正确地闭合前面一个条件,因为我们可能会在同一句里面引入新的条件,补救措施只要破坏注入条件应该就可以了,但是考虑到其复杂性(下面会说),最好还是较为完整的限制一下输入的字符种类。
第二个看起来是没有什么问题的,但潜在的会带来一些隐患。这很容易给人造成的一个错觉是,我对输入的字符串已经很有效的做过处理了,以后使用没有什么问题。这句话没有错,对字符串来说这样做也是很正确的,但是他扮演了一个不光彩的角色,试想一下,如果过滤后的字符串放进了数据库,而后续的语句有直接拿出来使用的,这种对前面过滤的依赖性,是不是正确的呢?
也许较好的做法应该是,针对具体的情况来确定过滤的准则。
常见的输入变量有三种:数字,字符串还有集合。对于数字型的输入变量,简单调用一下判断函数即可,见得到的代码中,凡是检查了这类变量的,几乎都正确。对于字符串型的来说,基本上在插入到生成的SQL语句时,前后都有单引号,如果仅从破坏注入条件来看,把单引号替换成两个单引号应该问题不大。同理的,如果是一个字符串的集合,也可以简单的用这种方法。而如果是数字的集合,情况可能稍微麻烦一点,至少你得允许数字、逗号或许还有空格之类的符号在输入中正常出现,这样子的过滤规则可能显得复杂,不过你可以借鉴一下dvBBS6.1打过补丁后的版本,总的来说,对于已经发现的过滤漏洞而言,他们还是补得比较好的。
对于第二句话,至少现在不能说它说错的,我们留待后面解决。
二、获取的数据值得信赖吗?
其实这样子说范围显得有点大,一下子涉及到很多方面,一个例子一个例子地举来看好了。
首先是关于选择过滤数据的问题。一直以来,我们认为凡是用户输入的东西,都要经过适当的处理。没错,但真正的是否都做到呢?随便找个抓包的工具,比如Ethereal,看看在你用IE提交表单或者是打开连接的时候,都提交了什么。或者,简单一些,打开NetAnt编辑一个任务,在协议标签中,看看那个“自定义提交者”和“用户代理”的选项。
我想你已经明白了,对方可以自己定制的东西不仅仅是GET或POST过来的数据!如果所有的用户都规规矩矩地用浏览器,确实不用防备这么严,如果对方不这么老实,在取服务端变量或Cookie的时候可要小心了,没有任何人能够保证你获得的数据是合法的。对于Cookie而言,很多程序都出过问题,所以以前强调得比较多,至于另外的,关注的人可能比较少一点,但你是否看过或者写过这样的代码:
sql="ShowHOT_COM_inst_online_char 2,"&statuserid&",'"&membername&"','"&memberclass&"','"&Request.ServerVariables("REMOTE_HOST")&"',"&boardid&",'"&Request.ServerVariables("HTTP_USER_AGENT")&"','"&replace(stats,"'","")&"','"&Request.ServerVariables("HTTP_X_FORWARDED_FOR")&"',"&UserGroupID&",'"&actCome&"',"&userhidden&","&userid&""
Request.ServerVariables("HTTP_USER_AGENT")就是你在NetAnt中看到的用户代理选项,也就是说你可以伪造,同样可以伪造的还有Request.ServerVariables("HTTP_REFERER"),也就是你在NetAnt中看到的提交者选项等等。在做一些项目的时候,很有可能要将这一类的变量添加入数据库,这时候要千万小心,这个地方的忽略,引起的后果和其他类型变量未过滤导致的后果是一样的。
在Google上搜索Referer和Request.ServerVariables两个关键字,还可以看到很多有问题的写法,或者去看看五月份左右的关于动网论坛入侵的文章,也许你的理解会更加深刻一点。
然后是一个隐藏得稍微深一点的问题,不是用户的直接输入要不要过滤?
这就回到了我们前面留下的那个问题,单引号换成两个单引号的潜在威胁。在第二次构造SQL语句的时候,倘若数据是从数据库里面直接去取出来用的,多数情况下人们会认为前面已经处理过的东西看起来似乎并没有必要再处理,或者干脆就是没有意识到应该处理。这是极其错误的!从两个方面来看,首先你入库的时候对提交数据中的单引号处理,仅仅是保证了单次SQL语句构造的正确性,并没有一劳永逸地解决问题;再说了,后面取出数据用的时候,对数据安全性检查的依赖并没有得到保证,因为这种依赖关系没有传递下来,而且依赖关系本身还不是可传的。
就replace(request("someinput"), "'", "''")而言,它的不安定性在于这种过滤方式只是一种妥协,换句话说只是在有限的范围内掩盖了可能出现的问题,而没有永久性的处理掉。它还有一个讨厌的地方在于给人一种错觉,似乎是处理过的数据已经安全了,容易让后继的代码编写者产生虚幻的安全感。对这两个弱点,不是靠换一个写法就能解决的,因为如果你把单引号干脆去掉,又会引来另外一个问题,输入数据中确实有需要而且正确的单引号怎么办?从一开始我就说,单引号本身是无罪的,过滤它只是一种解决手段而已,所以我们还是就这样写吧,不过要在后继的部分加强一下检查。
猜你喜欢
- Apache服务器已经内置用户验证机制,大家只要适当的加以设置,便可以控制网站的某些部分要用户验证。大家只要跟着我一步步做下来就应该能轻松实
- 1 安装邮件列表程序apt-get install mailman2 修改配置 /etc/mailman/mm_cfg.py 此服务器采用e
- 昨天呢,gnomeontherun.com上面冒出了一篇文章,Comparing Wordpress, Drupal, and Joomla
- 提供高质量的内容和服务创建让人眼前一亮且有价值的内容较之于这个指南里讨论的因素更容易影响你的网站。用户看到后知道你网站上提供的内容质量很不错
- 相信很多人都曾经被面试官问过这样的问题:”你对自己未来5年的职业规划是怎样的?“,每当我被问起这个问题时,我的脑海中总是会浮现出《Twist
- 很多朋友想建ftp服务器在Internet上共享自己的资源,苦于没有公网IP,无法实现。其实,内网IP也可以建ftp服务器的。第一步:首先当
- 环境:RedHat as3jdk安装路径:/usr/java/jdkTomcat安装路径:/usr/local/tomcat/总共分为以下几
- 从使用虚拟空间到使用独立服务器,这对一个站长来说是一件惊天动地的大事,对于一个没有拿自己电脑做过服务器的站长来说,第一次拿到属于自己的服务器
- 北京时间11月13日早间消息,据国外媒体报道,市场研究公司ComScore今天表示,10月Twitter美国独立用户访问量为1920万,比9
- 圣诞:the birthday of Jesus Christ圣诞节:Christmas day,Xm.,Xmas圣诞歌:Christmas
- 大概上过网的人对网络的一个最大印象就是免费,看绝大部分的新闻不要钱、看美女图片也不要钱、音乐也是随便下,反正大家尽可能的在网上享受免费的服务
- 在Google搜索结果最后一页会提示以下内容:为了提供最相关的结果,我们省略了与已显示的N个类似的条目。如果提问者之前对Google搜索结果
- SSL的窃听和安全最近颇受关注,吴洪声提出了一种SSL窃听攻击的思路,主要是利用了CA签发证书的一个重大缺陷:只验证目标网站的域名信箱即可签
- 据spreadfirefox的消息,Mozilla Firefox 3发布时间暨下载日终于到来了,Mozilla Firefox3于美国西部
- 北京时间7月8日消息,据国外媒体报道,谷歌周一发布了公司内部使用的开源数据描述语言“Protocol Buffers”。Protocol B
- 拒绝游泳的鱼:各位安徽及各地的互联网朋友们,大家下午好。老k一直在做非常公益的这些本地站长的交流,所以鱼特别支持来和大家聊一下。其实很多的技
- 在本文中,作者主要介绍了黑客用于攻击网络的一些工具。通过了解这些黑客工具的使用方法,读者可以更好地保护自己网络的安全。为了帮助你更好地防范时
- 安装好Serv-U初次运行时,会自动弹出创建域和账户操作向导窗口。由于使用向导创建的账户会带来一些未知的安全问题,因此在这里建议单击“取消”
- 地方门户网站在互联网世界里方兴未艾,各个地方的门户网站“你方唱罢我登场”。最初是省级、市级的地方门户
- DDOS攻击是现在最常见的一种黑客攻击方式,下面就给大家简单介绍一下DDOS的七种攻击方式。1.Synflood: 该攻击以多个随机的源主机