ASP中数据库安全是一个很严肃的问题。很多代码的编写者意识到了这类问题,并且小心翼翼地对他们认为有问题的地方做了补救,但常见的情况是要么没有穷尽所有的可疑地点,要么这种补救逻辑上有误。对于一个耐心且嗅觉灵敏的者来说,这种意义上的补救措施和没有任何补救措施没有本质上区别。
下面罗列的是一些可能出现的问题:有些是常见易犯的错误,有些根本就是逻辑上有问题。看看你是不是也这样写过?对于者而言,倒着看这些东西,应该对寻找漏洞有点帮助,更为完整一点的检测方法,请等我的关于黑/白盒分析和自动化测试文章。
典型例子是不管不顾地对所有的输入变量都去掉单引号,或者是把单引号替换成的两个单引号,例如:
现在很明了的是,第一个做法很有可能是错误的。因为引起SQL Injection的不总是单引号,再扩大一点,引起问题的不是任何单独的符号,这样子的过滤,有些单引号了。正确的利用注入,重要的一点是闭合前面的一句SQL查询语句——往往是得先正确地闭合前面一个条件,因为我们可能会在同一句里面引入新的条件,补救措施只要注入条件应该就可以了,但是考虑到其复杂性(下面会说),最好还是较为完整的一下输入的字符种类。
第二个看起来是没有什么问题的,但潜在的会带来一些隐患。这很容易给人造成的一个错觉是,我对输入的字符串已经很有效的做过处理了,以后使用没有什么问题。这句话没有错,对字符串来说这样做也是很正确的,但是他扮演了一个不光彩的角色,试想一下,如果过滤后的字符串放进了数据库,而后续的语句有直接拿出来使用的,这种对前面过滤的依赖性,是不是正确的呢?
常见的输入变量有三种:数字,字符串还有集合。对于数字型的输入变量,简单调用一下判断函数即可,见得到的代码中,凡是检查了这类变量的,几乎都正确。对于字符串型的来说,基本上在插入到生成的SQL语句时,前后都有单引号,如果仅从注入条件来看,把单引号替换成两个单引号应该问题不大。同理的,如果是一个字符串的集合,也可以简单的用这种方法。而如果是数字的集合,情况可能稍微麻烦一点,至少你得允许数字、逗号或许还有空格之类的符号在输入常出现,这样子的过滤规则可能显得复杂,不过你可以借鉴一下dvBBS6.1打过补丁后的版本,总的来说,对于已经发现的过滤漏洞而言,他们还是补得比较好的。
首先是关于选择过滤数据的问题。一直以来,我们认为凡是用户输入的东西,都要经过适当的处理。没错,但真正的是否都做到呢?随便找个抓包的工具,比如Ethereal,看看在你用IE提交表单或者是打开连接的时候,都提交了什么。或者,简单一些,打开NetAnt编辑一个任务,在协议标签中,看看那个“自定义提交者”和“用户代理”的选项。
我想你已经明白了,对方可以自己定制的东西不仅仅是GET或POST过来的数据!如果所有的用户都规规矩矩地用浏览器,确实不用防备这么严,如果对方不这么老实,在取服务端变量或Cookie的时候可要小心了,没有任何人能够你获得的数据是的。对于Cookie而言,很多程序都出过问题,所以以前强调得比较多,至于另外的,关注的人可能比较少一点,但你是否看过或者写过这样的代码:
Request.ServerVariables(HTTP_USER_AGENT)就是你在NetAnt中看到的用户代理选项,也就是说你可以伪造,同样可以伪造的还有Request.ServerVariables(HTTP_REFERER),也就是你在NetAnt中看到的提交者选项等等。在做一些项目的时候,很有可能要将这一类的变量添加入数据库,这时候要千万小心,这个地方的忽略,引起的后果和其他类型变量未过滤导致的后果是一样的。
在Google上搜索Referer和Request.ServerVariables两个关键字,还可以看到很多有问题的写法,或者去看看五月份左右的关于动网论坛入侵的文章,也许你的理解会更加深刻一点。
这就回到了我们前面留下的那个问题,单引号换成两个单引号的潜在。在第二次构造SQL语句的时候,倘若数据是从数据库里面直接去取出来用的,多数情况下人们会认为前面已经处理过的东西看起来似乎并没有必要再处理,或者干脆就是没有意识到应该处理。这是极其错误的!从两个方面来看,首先你入库的时候对提交数据中的单引号处理,仅仅是了单次SQL语句构造的正确性,并没有一劳永逸地解决问题;再说了,后面取出数据用的时候,对数据安全性检查的依赖并没有得到,因为这种依赖关系没有传递下来,而且依赖关系本身还不是可传的。
就replace(request(someinput), , )而言,它的不安定性在于这种过滤方式只是一种,换句话说只是在有限的范围内了可能出现的问题,而没有永久性的处理掉。它还有一个讨厌的地方在于给人一种错觉,似乎是处理过的数据已经安全了,容易让后继的代码编写者产生虚幻的安全感。对这两个弱点,不是靠换一个写法就能解决的,因为如果你把单引号干脆去掉,又会引来另外一个问题,输入数据中确实有需要而且正确的单引号怎么办?从一开始我就说,单引号本身是无罪的,过滤它只是一种解决手段而已,所以我们还是就这样写吧,不过要在后继的部分加强一下检查。
我曾经非常惊奇地发现乔客论坛对外的版本中一段让人觉得不可思议的问题代码,如果你比较感兴趣的话,翻翻gallery.asp就能看到一个特定的动作序列(action=flash_view),绕过了所有对id的检查。
其实说起来,这一类代码不太可能有太复杂的逻辑结构,对代码进行审查的时候,进行所有的分支覆盖是可以手工完成的,只要稍微想想就会发现对变量的检查是否能够有效地到达你的目的地——生成SQL语句的地方。
关于过滤器的,如果要深入下去,马上就会出来一些让人眼花缭乱的东西,中间的分析很麻烦而且很形式化,虽然确实有算法可以选取的正确性,但是我想这里还是给出一些结论性的东西吧。倘若你很有兴趣,我想你可以来信和我交流。
过滤的,取决于两个方面:你获得变量的来源,以及你需要到的生成SQL语句的。前面一个,不论是来自于直接还是间接输入,先想想可能的输入字符;对于后面一个,你要无论程序运行情况怎样,经过了过滤语句的流程一定会经过你需要到的生成SQL语句的(其是有效过滤语句的后向必经节点)。如果你不很清楚流程的判断,我的是if中仅仅判断,if嵌套间不要有多余的东西,过滤语句后紧接生成SQL语句。
再回到前面提到的潜在问题,我们终于可以在这里解决了:在取出数据后依然首先进行判断。因为根据前面说的,这一种间接输入依然有可能出现。
说到这里,插一句另类的过滤问题:不要把对输入的过滤放到客户端解决,那是可以绕过的!谁能你的VBScript/JavaScript能起作用,如果别人直接用NC或者一个不支持脚本的浏览器呢?
上述两个大的方面,以软件测试的目光来认识,显然是没有穷尽所有的分支所导致。在使用对方提交的数据之前,先做一个对方所有可能进入字符的分析列表,然后就每一种输入分支情况进行类型的审核,这是每个代码编写者都应该做的事情。这是一件很简单的事情,因为只是类型上的审核还好,碰上语义的问题就麻烦了……
譬如对于一个整型数字,你输入的确实是一个整型,通过了过滤器,潜在的问题是你的输入内容上吗,或者根本就不应该从你这里获得信息?很多年前就有人提出来,有些注册的模块存在问题:它里面的id是通过一个type=hidden后隐式提交的,但是我在第一步建立了用户,第二步仍就有可能通过提交内容不的id来修改他人的信息。这种异类的问题都常难发现,而且几乎都只有靠经验而不是某一个具体的算法来处理。我们在联系一下前面的,连起来想想或许能够更加清楚,对于输入的字符串,感觉上没有过滤也不会有错,因为比较数字之类集合来说,字符串所能容纳的几乎是全部可能输入的集合。事实上,常见的是没有过滤造成单引号的错误匹配,进而导致了SQL Injection。严格说起来,这也是一个语义上的问题,不过对于这样子的特殊情况而言,可以通过处理输入中的单引号来语义的某种程度上的正确。所以我也一再强调,单引号本身是无罪的,不过是背了语义的黑锅而已。
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、度的宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加,对信息安全界的动态新闻更新更快。
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的途径。
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
推荐:
网友评论 ()条 查看