程序处理用户输入过滤不严导致BUG及安全问题
这算是个老生常谈的问题了,我前面的文章也提到了由此导致的SQL注入漏洞或者XSS跨站漏洞,总结了一下,对于Web有4大漏洞是需要严肃对待的,比如SQL注入、XSS跨站另外还有上传漏洞以及对URL地址处理不严导致的越权漏洞,这个改天单独开一篇文章介绍一下,下面继续谈用户输入过滤不严导致的问题,前天正好帮一个客户处理一个程序问题,一个10年前的计票程序,当然不是我开发的,所以处理起来非常棘手,主要是计票汇总时程序出现了崩溃,仔细研究了这个程序的开发语言,发现是用PowerBuilder构建的,而且留下了PBL文件,用PowerBuilder分析了这个文件,大概知道了BUG的位置。查看了之前录入的数据,发现有个别票选项是0,该软件使用说明上注明只能使用1~4选项,那么说0就是非法的数据选项,那么这个汇总导致程序崩溃的Bug很有可能是由于这个导致的,删除了所有的0选项票,然后再汇总,一切正常!为了切实说明导致Bug的原因,我尝试重现了这个问题,开启一张新选票,然后输入某被选举人票数,输入过程故意输错一项,然后再尝试清除,结果发现无法清除,将该选项设置为0则程序提示“必须为1~4数字”,但是不对0这个无效数据做出处理,也就是说0依旧存在,下一步汇总,结果崩溃如愿的发生了,总结一下,初步判断该程序为“赶工”产品,后期测试不足,所以导致该隐性Bug没有能及时发现。
同样的问题依旧出现在某些网站上,比如经典的SQL注射漏洞,以SQL Server的Transact-SQL语言为例,我们就需要过滤一些危险的字符,比如像单引号,在SQL Server中,如果字符串包含单引号,我们就必须将其转换为两个单引号,避免可能的错误和已知的攻击,参考微软官方的 《SQL 注入》(SQL Injection) 文章,提供下面一个转换单引号的VBScript函数: