程序处理用户输入过滤不严导致BUG及安全问题

!本文可能 超过1年没有更新,今后内容也许不会被维护或者支持,部分内容可能具有时效性,涉及技术细节或者软件使用方面,本人不保证相应的兼容和可操作性。

这算是个老生常谈的问题了,我前面的文章也提到了由此导致的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函数:

1
2
3
Function escapeString(str)
    escapeString = Replace(str, "'", "''")
End Function

对于所有参与拼接SQL语句的字符串来说,都应该通过上面的过滤转换函数进行处理,这样就避免了已知的单引号注入攻击,当然对于LIKE模式查询字符串我们还需要额外处理[、%、_这三个字符:

1
2
3
4
5
6
Function escapeLikeString(str)
  str = Replace(str, "[", "[[]")
  str = Replace(str, "%", "[%]")
  str = Replace(str, "_", "[_]")
  escapeLikeString = escapeString(str)
End Function

更多关于注入防范的技术文章还是参考微软的文章吧。

包括XSS安全问题还有上传问题大多是由于过滤不严导致的,有机会我将单独列出来介绍给大家。

2011年12月5日更新

今天某客户遇到一个问题,说是某WEB系统照片上传不上去,跑过去一看,照片格式是JPG的,但是上传时老是提醒格式非法,只支持JPG、GIF和PNG等,我看了一下确实是JPG的,我打开了隐藏的文件扩展名,发现扩展名是大写的JPG,难道是大小写问题?我改成小写的jpg后,上传果然成功了,囧啊。上传扩展名至少忽略大小写判断吧,看来又是一个“赶工”的产品,哦,对了JPG扩展名还有个别称叫JPEG,程序中也要注意处理。

若无特别说明,本网站文章均为原创,原则上这些文章不允许转载,但是如果阁下是出于研究学习目的可以转载到阁下的个人博客或者主页,转载遵循创作共同性“署名-非商业性使用-相同方式共享”原则,请转载时注明作者出处谢绝商业性、非署名、采集站、垃圾站或者纯粹为了流量的转载。谢谢合作!

  1. 我也是这么做的.
    最后那个like,可以探讨一下,我觉得应该分两种情况,
    1.允许用户以高级模式搜索,就是字符串里使用%和_匹配任意字符,这时候搜索就使用like,无需过滤.
    2.不允许用户以高级模式搜索,输入%,_只当作一般字符处理,这时候其实有另外一个方法做搜索,就是instr函数,效率高,也无需对这些字符处理.mssql里叫作CHARINDEX

    • @shirne
      恩,确实,LIKE应该挺耗资源的,如果不需要模式匹配最好还是取代这样的写法,类似INSTR方式搜索改天试试,之前图省事,直接LIKE了,谢谢提供!

请稍后...

发表评论

电子邮件地址不会被公开。 必填项已用*标注