我正在使用带有ATG 10.1.2 的weblogic 10.3.6
我想让我的JSESSIONID安全,我试着如下设置weblogic.xml,
<session-descriptor>
<cookie-name>JSESSIONID</cookie-name>
<timeout-secs>1200</timeout-secs>
<cookie-secure>true</cookie-secure>
<url-rewriting-enabled>false</url-rewriting-enabled>
</session-descriptor>
我试着将auth-cookie enabled设置为false,看看它是否会从weblogic.xml中安全地接受cookie,但它没有。
<web-app-container>
<x-powered-by-header-level>SHORT</x-powered-by-header-level>
<auth-cookie-enabled>false</auth-cookie-enabled>
</web-app-container>
spakred的家伙早些时候也发布了类似的帖子(httpOnly漏洞修复),他们强调了runAssembler命令问题,那里提供的解决方案也不适用于weblogic,(在那里留下了评论)。Weblogic甚至不检查context.xml(我尝试放置一个无效的xml,启动时没有错误)
我还注意到,如果我将weblogic.xml中的cookie名称更改为另一个名称,仍然会生成一个JSESSIONID,并且新的cookie变得安全
-有其他东西生成这个cookie吗
-为什么weblogic无法保护JSESSIONID,甚至无法更改其路径(更改cookie路径会导致发送两个JEESSIONID cookie)?
之前有人尝试过吗?请分享你的想法。
这可能无法回答您的所有问题,但至少可以为您提供更多关于ATG和Weblogic如何协同工作的背景知识。
建议您查看/atg/dynamo/servlet/sessiontracking/GenericSessionManager
组件。属性singleSessionIdPerUser
默认为不同的值,具体取决于您在WebLogic、Websphere和jBoss上运行的应用程序服务器。Weblogic将此属性设置为false
,而jBoss和Weblogic将其设置为true
,这就是为什么我认为Weblogic中不存在该漏洞,因为服务器端根据Weblogic会话id查找特定于ATG的会话id(假设您已保护web逻辑jsessionid)。
来自ATG帮助:
如果singleSessionIdPerUser值为true,则应用程序服务器将对所有web应用程序使用相同的会话ID,因此不需要查找。请注意,应用程序服务器分发相同的会话id,但不是相同的HttpSession对象。
当singleSessionIdPerUser为false时,查找将确定会话名称上下文ID。这是由atg.nucleus.servlet.SessionNameContextServlet servlet(包含在atg_bootstrap.war中)使用RequestDispatcher.include()调用完成的。SessionNameContextServlet做两件事:
将父会话ID设置为请求属性,然后子web应用程序可以使用该属性绑定到正确的会话上下文。
对于不允许在web应用程序之间共享请求属性的应用程序服务器,它还设置了一个名为ATG_SESSION_ID的cookie和会话ID。此行为由/ATG/denamo/servlet/sessiontracking/GenericSessionManager.useSessionTrackingCookie属性控制,该属性为每个应用程序服务器预先配置了正确的值。
更多信息可以在这里找到。
此外,请参阅我对SO上一个关于在web逻辑/atg上以编程方式注销用户的问题的回答,我认为这与weblogic 上的上述singleSessionIdPerUser=false
有关
如果您查看ATG发布的cookie,您可能会发现它被发布到根上下文路径(例如path=/;),而不是您为其自定义web.xml的web应用程序的上下文。
由于在ATG中管理会话的方式,可能没有考虑您的weblogic.xml设置。
默认情况下,会话通常在ATG中的web应用程序之间共享。这与会话是特定于web应用程序的标准J2EE行为有点不同,但它允许ATG支持客户所需的一些多站点功能。
这是怎么回事?
ATG具有"父"会话上下文的概念,每当您在web应用程序上启动会话时,都会创建该上下文。因此,虽然你可能会遇到具有不同上下文根的不同网络应用程序,但ATG内部只会创建一个"父"会话。默认情况下,此父会话通常绑定到atg_bootstrap.war web应用程序。
一些选项:
- 构建EAR后,尝试将一个weblogic.xml文件放入atg_bootstrap.war/WEB-INF文件夹中,"cookie安全"设置为true。由于这是最终创建"父"会话的web应用程序,因此weblogic.xml设置应在此处生效
- 或者,您可以覆盖默认的ATG会话共享行为,并让它为单个web应用程序发布会话。例如,如果你有一个上下文为"/store"的web应用,你可以让它将会话绑定到此web应用上下文,而不是父("/")上下文。为此,请尝试将weblogic.xml中的"cookie路径"元素设置为web应用程序的上下文路径。例如,如果您的web应用上下文根为"/store":
<session-descriptor> <cookie-path>/store</cookie-path> <cookie-secure>true</cookie-secure> </session-descriptor>
请注意,如果您打算在不同的web应用程序之间共享会话,第二个选项可能会破坏多站点行为。
OracleKB(support.Oracle.com)中有一篇很好的文章描述了ATG:中的会话管理行为
- Doc ID 1364857.1:ATG会话管理如何在WebLogic、JBoss和WebSphere上工作