3

我正在开发开源应用程序“Project-Open”,在扫描过程中我遇到了以下漏洞:

[Medium] Session Identifier Not Updated
Issue: 13800882
Severity: Medium
URL: https://<server_name>/register/
Risk(s): It is possible to steal or manipulate customer session and cookies, which might be used to impersonate a legitimate user,allowing the hacker to view or alter user records, and to perform transactions as that user
Fix: Do not accept externally created session identifiers

虽然提到了修复,但我无法完全理解它。请指导我应该如何删除它。如果需要任何进一步的细节来理解这个问题,请告诉我。项目源码在tcl

我发现以下代码具有相同的功能,但它是在 java 中。

  public HttpSession changeSessionIdentifier(HttpServletRequest request) throws AuthenticationException {

     // get the current session
        HttpSession oldSession = request.getSession();

     // make a copy of the session content
        Map<String,Object> temp = new ConcurrentHashMap<String,Object>();
        Enumeration e = oldSession.getAttributeNames();
        while (e != null && e.hasMoreElements()) {
               String name = (String) e.nextElement();
               Object value = oldSession.getAttribute(name);
               temp.put(name, value);
        }

     // kill the old session and create a new one
        oldSession.invalidate();
        HttpSession newSession = request.getSession();
        User user = ESAPI.authenticator().getCurrentUser();
        user.addSession( newSession );
        user.removeSession( oldSession );

     // copy back the session content
        for (Map.Entry<String, Object> stringObjectEntry : temp.entrySet()){
             newSession.setAttribute(stringObjectEntry.getKey(),       stringObjectEntry.getValue());
         }
  return newSession;

}

PS我是TCL的新手。如果您需要任何进一步的解释,请告诉我。

4

2 回答 2

2

OpenACS 5.9 中有一个修复您的扫描报告的问题。请参阅 OpenACS.org 上的以下讨论以供参考。

http://www.openacs.org/forums/message-view?message_id=5332821

于 2016-09-02T17:37:04.307 回答
0

OWASP 报告所讨论的问题是无法迁移会话以使用新 ID,从而使攻击者更容易发现并重用 ID。针对这种情况的保护措施是不时更改会话 ID(不,我不知道多久更改一次!)并且 Java 代码参与其中。

会话表示为存储在浏览器中的令牌,通常在 cookie 中(这就是 cookie 的设计目的)。然后使用该令牌查找与会话对应的数据库记录,该记录保存会话中键/值映射的序列化。这是一个简单的机制,但非常强大。由于序列化等原因,执行所有这些操作的 Java 代码在幕后会相当复杂,但是 Tcl 值(通常,并且总是用于内置类型)是自然可序列化的,因此在这方面应该证明问题要小得多; 无需首先反序列化即可将会话复制到新密钥。

执行此操作的确切代码取决于使用的框架。我不知道有什么]project-open[用,所以这就是我们现在可以钻的范围。您需要与实际从事 PO 工作的其他人交谈……</p>


尽管如此,最好的方法是让提供给客户端的密钥不是主键,这样您就可以更改会话密钥而无需删除内容。只需有一个会话键列(带有索引!),您就可以使事情正常工作。不过,这是一种更复杂的方法;在您的环境中实施可能不切实际..

于 2014-07-01T13:57:21.433 回答