Fortify是一款能扫描分析代码漏洞的强大工具,这里就不详细介绍,有兴趣了解的同学可以自己找些相关资料来看看。
本人在实际工作中遇到以下漏洞,结合他人经验及自己的理解总结出一些相关解决方式,如有不足之处还望批评指正。
1.System Information Leak
系统信息泄露:当系统数据或调试信息通过输出流或者日志功能流出程序时,就会发生信息泄漏。
看下面两段代码:
out.println("("+exception.getMessage()+")"); print.write(errorMessage);
根据选定屏幕的配置,此信息可转储到屏幕,也可以直接发送到打印机。在某些情况下,版本信息正好可以准确地告诉攻击者入侵此系统的可能性有多大。同样,错误消息也可以告诉攻击者入侵此系统的可能性究竟有多大。例如,一个数据库错误消息可以揭示应用程序容易受到 SQL Injection 攻击。其他的错误消息可以揭示有关该系统的更多间接线索。
解决方法:以上是Fortify的解释,个人认为如果没必要输出或是记入日志的系统信心就简单print.write("系统出错");就行了,当然如果这样做了系统真的出错对维护来说确实是个困难。
2.Cross-site Scripting:Persistent
基于存储的跨站脚本攻击(XSS): 传送到 Web 浏览器的恶意内容通常采用 JavaScript 代码片段的形式,但也可能会包含一些 HTML、Flash 或者其他任意一种可以被浏览器执行的代码。基于 XSS 的攻击手段花样百出,几乎是无穷无尽的,但通常它们都会包含传输给攻击者的私人数据(如 Cookie 或者其他会话信息)。在攻击者的控制下,指引受害者进入恶意的网络内容;或者利用易受攻击的站点,对用户的机器进行其他恶意操作。
解决方法:其实这个xss攻击还是很好解决的,对web安全业务熟悉的同学可能知道ESAPI这个工具。
ESAPI是一个免费、开源的Web应用程序安全控制组件,可以帮助编程人员开发低风险应用程序。
ESAPI是OWASP组织的一个开源项目,网址是: http://www.owasp.org/index.php/ESAPI
ESAPI很适合一个新的开发项目的安全组件,各版本的ESAPI包含如下基本设计:
具有一个安全接口集;
对每一种安全控制有一种参考实现;
对每一种安全控制可以有你自己的实现方法。
很多著名的大公司开始将ESAPI作为自己保障Web应用程序安全的手段,包括美国运通公司,Apache基金会,世界银行等。
大家可以下载它的源码了解一下,其中有一个方法可以很简单的解决 这个基于存储的跨站脚本攻击,代码如下:
String newStr=ESAPI.encoder().encoderForHTML(str);
3.Insecure Randomness
不安全的随机数:电脑是一种具有确定性的机器,因此不可能产生真正的随机性。伪随机数生成器 (PRNG) 近似于随机算法,始于一个能计算后续数值的种子。
PRNG 包括两种类型:统计学的 PRNG 和密码学的 PRNG。统计学的 PRNG 可提供有用的统计资料,但其输出结果很容易预测,因此数据流容易复制。若安全性取决于生成数值的不可预测性,则此类型不适用。密码学的 PRNG 通过可产生较难预测的输出结果来应对这一问题。为了使加密数值更为安全,必须使攻击者根本无法、或极不可能将它与真实的随机数加以区分。通常情况下,如果并未声明 PRNG 算法带有加密保护,那么它有可能就是一个统计学的 PRNG,不应在对安全性要求较高的环境中使用,其中随着它的使用可能会导致严重的漏洞(如易于猜测的密码、可预测的加密密钥、会话劫持攻击和 DNS 欺骗)。
解决方法:ESAPI的确是个不错的工具,使用它提供的方法可以规避该漏洞,代码很简单:
var random=ESAPI.randomizer().getRandomInteger(0,100);
这里简单解释下,参数0和100可以随意设置,意思是生成0到100之间的随机数,如果你想随机数被预测到概率更低,不妨将两个参数的差值设置足够大。
结尾:其实解决Fortify工具提供的扫描出的漏洞是一件很头疼的事,程序有时候你根本无法猜测它在想什么,常常我认为某种方法可以解决漏洞,但是Fortify并不认可。因此每一种漏洞的规避方法都是背后无数次实验的结果,让人抓狂,但是没办法,工作还得继续......