近期 Appscan扫描出漏洞 加密会话(SSL)Cookie 中缺少 Secure 属性,已做修复,现进行总结如下:
1.1、攻击原理
任何以明文形式发送到服务器的 cookie、会话令牌或用户凭证之类的信息都可能被窃取,并在稍后用于身份盗窃或用户伪装,此外,若干隐私法规指出,用户凭证之类的敏感信息要始终以加密的方式发送到 Web 站点。
1.2、修复建议
给cookie添加secure属性
1.3、修复代码示例
1)服务器配置为HTTPS SSL方式
2)Servlet 3.0 (Java EE 6)的web.xml 进行如下配置:
<session-config>
<cookie-config>
<secure>true</secure>
</cookie-config>
</session-config>
3)ASP.NET的Web.config中进行如下配置:
<httpCookies requireSSL="true" />
4)php.ini中进行如下配置
session.cookie_secure = True
或者
void session_set_cookie_params ( int $lifetime [, string $path [, string $domain
[, bool $secure= false [, bool $httponly= false ]]]] )
或者
bool setcookie ( string $name [, string $value [, int $expire= 0 [, string $path
[, string $domain [, bool $secure= false [, bool $httponly= false ]]]]]] )
5)weblogic中进行如下配置:
<wls:session-descriptor>
<wls:cookie-secure>true</wls:cookie-secure>
<wls:cookie-http-only>true</wls:cookie-http-only>
</wls:session-descriptor>
1.4、其它资料
https://www.owasp.org/index.php/SecureFlag
1.5、实际修复方案
方案一:项目使用的是WebShpere服务器,这个可以在服务器中进行设置:
其实这种修复方式和5.2修复建议2)给web.xml加配置的方式是一样的。这两种修复方式都是一定可以通过Appscan扫描的,只不过19环境需要支持https和http两种协议,以上两种方案的话,会导致http协议下的Cookie不能传输,从而导致http协议下的部分功能不能使用。现在暂时是以牺牲http协议下的功能不使用为代价以这种方案通过扫描的。
方案二:
如果给Cookie配置了secure属性,那么这个Cookie能在https协议中传输,但是不能在http协议中传输。而实际系统应用中要支持两种协议,这里可以通过request.getScheme()获取是哪种协议(这种方式https协议获取的也是http,奇怪,可以通过下面的方式判断是否是https协议)
String url = req.getHeader("Referer");
if(url.startsWith("https")){}
然后进行判断是否加这个属性:cookie.setSecure(true)。
而这种方案的话,只能对后期自己代码响应的Cookie做设置,而不能对容器自动响应的Cookie做设置。因此这里没有使用。