编写安全的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"), "'", "''")而言,它的不安定性在于这种过滤方式只是一种妥协,换句话说只是在有限的范围内掩盖了可能出现的问题,而没有永久性的处理掉。它还有一个讨厌的地方在于给人一种错觉,似乎是处理过的数据已经安全了,容易让后继的代码编写者产生虚幻的安全感。对这两个弱点,不是靠换一个写法就能解决的,因为如果你把单引号干脆去掉,又会引来另外一个问题,输入数据中确实有需要而且正确的单引号怎么办?从一开始我就说,单引号本身是无罪的,过滤它只是一种解决手段而已,所以我们还是就这样写吧,不过要在后继的部分加强一下检查。


猜你喜欢
- 整合搜索,或者叫通用搜索,universal search,是这几个月对SEO行业有重要影响的另一个搜索引擎发展趋势。我个人感觉整合搜索比个
- Windows 2000 Server是比较流行的服务器操作系统,如何安全地配置这个操作系统呢?本文试图从用户安全设置、密码安全设置、系统安
- D.配置postfix.1.主要是main.cf的配置。virtual_alias_maps=mysql:/etc/postfix/mysq
- 1.更新yum源CentOS7默认yum源的PostgreSQL版本过低,不适合在本版本上使用。在https://yum.postgresq
- 一位站长朋友,他问我这样的问题,购买的Godaddy主机IP被封,他通过切换操作系统进行更换IP,换好新的IP后,发现域名不能访问,打不开页
- 一、apache、php、mysql安装1.安装php分步式安装:下载php:wget http://cn2.php.NET/get/php
- 首先我们需要使用 cd 命令进入对应的目录,然后,命令如下:find . -type f -atime +365 -ex
- 前言本文主要给大家详细解析了关于Tomcat中catalina.bat原理的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细
- 之前写了篇文章说博客的事,但是关于微博的这部分,也许有误读。原来的观点是:原来把博客当成圈子的人,转移到交流更加方便的SNS,微博客去了。其
- 最近经常有同学在使用LAMP/WAMP时,遇到这样的编码错误问题: A网站程序编码UTF-8编码安装成功,运行成功。 B网站程序编gb231
- 一、什么是Google Sitelinks?Google Sitelinks也叫站内链接,这种方式的索引结果在Google搜索引擎上已经存在
- 网站的链接广泛度(Link Popularity)在搜索引擎排名中的作用已得到广泛的认同和重视。实际上,即使你没有在GOOGLE上提交你的站
- 通常利用Apache的rewrite模块对 URL 进行重写的时候, rewrite规则会写在 .htaccess 文件里。但要使
- Exchange 2000 Server中的Recipient Policies是一项重要的功能,它制定了收件人的邮箱地址,其中包括:X.4
- phpwind官方论坛于近日升级至phpwind 8.7 beta版,phpwind论坛用户如需体验更多新功能,可到官方体验站参与体验(ti
- 如果您已经在网站上使用链接单元,也许会注意到一个小小的变化,当访问者点击链接单元标题之后进入广告页面,在页面的底部我们新增了一个图片广告。我
- Linux 中firewall的使用方法总结 firewall 简单使用 1,显示所有配置firewall-cmd --
- 最近我在VMware上面用三台虚拟机搭建了一个hadoop的集群。但是后来发现了一个问题:每次重新打开三台机器的时候,因为主机所连接的网络的
- SEO的未来发展趋势互联网是一个庞大的信息和数据来源,大部分的互联网用户依靠搜索引擎找资料,组织网上信息是一个庞大的任务,搜索引擎优化目的就
- 接到这个项目时我看了他们的网站,基本上没有做SEO,搜索引擎优化也没有做,我查了一个百度,谷歌都没有收录他们的网站.接到这个项目时已经是年底