热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

RubyChina的MongodbHash注入漏洞

今天在RubyChina上看见一个帖子,从下面的回复中发现是Mongodb的漏洞,然后顺便学习了下。漏洞详细介绍以用户登陆而言,需要先根据用户传过来的帐户名从数据库中找到这条记录,然后再验证密码。用户登陆流程一个登陆表单inputtypetextname

今天在 Ruby China 上看见一个 帖子,从下面的回复中发现是 Mongodb 的漏洞,然后顺便学习了下。 漏洞详细介绍 以用户登陆而言,需要先根据用户传过来的帐户名从数据库中找到这条记录,然后再验证密码。 用户登陆流程 一个登陆表单 input type= "text" name=

今天在 Ruby China 上看见一个 帖子,从下面的回复中发现是 Mongodb 的漏洞,然后顺便学习了下。

漏洞详细介绍

以用户登陆而言,需要先根据用户传过来的帐户名从数据库中找到这条记录,然后再验证密码。

用户登陆流程

一个登陆表单

 type="text" name="session[account]">
 type="text" name="session[password]">

当提交后,服务端得到的数据是这样的(去除其它 token 等信息)。

{
  "session" => {
    "account"  => "username",
    "password" => "password"
  }
}

然后服务端通过帐户名从数据库中取得记录

User.find_by(account: params[:session][:account])
# => User.find_by(account: "username")

看起来很正常,但是问题就出现在这一步。

上面的查询语句转换成 Mongodb 查询语句是这样的

db.users.find({ account : params[:session][:account] }).limit(1)

如果参数是普通的字符串,那么是没有问题的,但是如果它是一个 Hash 呢?

如果 params[:session][:account] 的值是 { "$ne" => "username" },那么得到的 Mongodb 查询语句就是这样的

db.users.find({ account : { $ne : "username" } }).limit(1)

这段代码什么意思?找到所有 account 不等于 username 的记录。同样 $ne 可以换成其他 Mongodb 支持的操作,比如 $gt, $lt。username 也可以换成一串乱序字符串,这样就能得到用户集合中的所有记录。

注入

想让服务端得到的参数是 Hash 很简单,只需要手动修改一下表单就行了。

原表单

 type="text" name="session[account]">

修改后的表单

 type="text" name="session[account][$ne]">

这样,服务端得到的参数就是这个样子的。

{
  "session" => {
    "account"  => {
      "$ne" => "username"
    },
    "password" => "password"
  }
}

解决方法

将参数转化为字符串

Ruby China 的解决方法就是这种。

account = params[:session][:account].to_s
User.find_by(account: account)

Strong Parameters

Rails 4 开始提供了 Strong Parameters 用来对 params 参数进行过滤。基本语法是

def session_params
  params.require(:session).permit(:account, :password)
end

然后使用过滤后的数据进行查询数据库。

User.find_by(account: session_params[:account])

Strong Parameters

Strong Parameters 是 Rails 4 中提供的用于过滤用户输入的机制,其核心的两个方法是

  • ActionController::Parameters#require
  • ActionController::Parameters#permit

require 用来获取参数中指定键的值

如果不存在则产生 ParameterMissing 异常

对于以下参数

{
  "session" => {
    "account"  => {
      "$ne" => "username"
    },
    "password" => "password"
  }
}

使用 params.require(:session) 后得到的结果是这样的

{
  "account"  => {
    "$ne" => "username"
  },
  "password" => "password"
}

permit 用来对参数进行实际的过滤

对于 { "account" => "username", "password" => "password" },使用 permit(:account, :password) 得到的结果还是原 Hash,因为该 Hash 中的两个键都被 permit 了,而使用 permit(:account) 得到的结果是 { "account" => "username" },由于没有 permit :password,所以结果中 password 被过滤掉了。

如果是 { "account" => { "$ne" => "username" } } 的话,直接 permit(:account) 的结果是 nil

如果需要保留多级参数,需要明确指出。

permit(:password, account: :$ne)
# 或者多个键
permit(:password, account: [ :$ne, :$regexp ])

总结

  1. 这个漏洞对于普通的用户表单登陆没有多大影响,因为这里只是查找记录,然后验证密码,所以只会提示用户密码错误而已。但是对于 API 接口就有隐患了,API 接口是通过 token 而不是验证密码登陆的。
  2. 这件事让我更加了解了 Rails 4 中 Strong Parameters 的厉害之处!
推荐阅读
  • Allegro总结:1.防焊层(SolderMask):又称绿油层,PCB非布线层,用于制成丝网印板,将不需要焊接的地方涂上防焊剂.在防焊层上预留的焊盘大小要比实际的焊盘大一些,其差值一般 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 乐山市计算机学校2017—2018学年度第一学期开学典礼隆重举行
    乐山市计算机学校于2017—2018学年度第一学期举行了隆重的开学典礼,全体教职工和学生参加了此次典礼。乐山市计算机学校自建校以来一直秉承着追求崇高、抓住机遇、回报社会的办学宗旨,取得了累累硕果。在典礼上,常务副校长梁志明发表了致辞,鼓励全体新生用自己的智慧和勤奋去创造优秀的业绩。同时,苏稽镇派出所所长、市计算机学校法制副校长邹学斌提出了关于遵守法律法规和社会公共道德规范、树立自尊、自律、自强意识以及相信和依靠法律的建议,以维护校园秩序的平安和谐。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • Java开发面试问题,2021网易Java高级面试题及答案,实战案例
    前言大厂面试真题向来都是各大求职者的最佳练兵场,而今天小编带来的便是“HUAWEI”面经!这是一次真实的面试经历,虽然不是我自己亲身经历 ... [详细]
  • 数据库基本介绍
    1、数据库基本知识概念:数据库:database(DB),是一种存储数据的仓库数据库是根据数据结构组织、存储和 ... [详细]
  • 关于mysql原理与web系统开发的信息
    本文目录一览:1、在做web开发的时候,MySQL主要功能是什么? ... [详细]
  • hackingTeam是如何被黑的
    hackingTeam是如何被黑的 ... [详细]
author-avatar
lluuaalulua619
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有