我们开发了一个新的应用程序,在移动更改之前,我们使用checkmarx进行了代码的静态扫描.在名为Cross Site History Manipulation的代码中存在中等级别的漏洞. 这在我正在验证会话值的JSP页面中被
这在我正在验证会话值的JSP页面中被删除:
if(request.getSession().getAttribute("sesStrUID")!=null)
能否帮助我理解这个漏洞以及应该采取哪些措施来消除这种漏洞?
以下是我从@ Checkmarx首席软件架构师Alex Roichman那里得到的答案:跨站点历史记录操作是浏览器相同的原始策略违规,其中可以从另一个来源知道条件的状态.
例如,许多站点在向用户显示其私人数据之前检查用户是否已通过身份验证.
这可以通过以下代码完成:
If (!IsAuthenticated()) Redirect “login.jsp”
通过使用XSHM,可以从其他站点了解用户当前是否已对该站点进行身份验证.
现在让我们来寻找一个给定的行:
if(request.getSession().getAttribute("sesStrUID")!=null)
此行似乎检查用户是否有会话或甚至已经过身份验证.
由于在’if’语句内部存在’重定向’,因此任何其他站点都可以知道request.getSession().getAttribute(“sesStrUID”)!= null或者用户是否已经过身份验证.
因此,这个结果是正确的,它与旧的或现代的浏览器没有任何关系:所有现代浏览器都提供对history.lengh的访问,
此属性可能会导致通过XSHM侵犯隐私,并且由于向后兼容性问题,没有简单的修复.
X-Frame-Options: DENY可以防止XSHM的IFrame版本,但旧浏览器不支持此选项.
在SilverlightFox的回答后编辑
我同意我们有非常相似的答案.
关于:
“3xx redirects do not cause the value of history.length to be increased
in modern browsers”
这是正确的,XSHM正是基于此.
查找以下攻击情形:
>在IFrame中打开“Login.jsp” – 现在历史记录中包含“login.jsp”.
>打开’ShowSecretInfo.jsp’ – 如果服务器将使用3xx重定向到’Login.jsp’,则history.length将保持不变,如果服务器将显示’ShowSecretInfo.jsp’- history.length将增加1 .
这意味着受攻击的用户已通过身份验证 – 隐私侵犯.