当人们开始使用数据库构建网站来存储信息时,他们必须手动执行大量SQL。 很少有人意识到它不是最好的解决方案,并开始研究更智能的替代方案,并开始构建对象关系映射(ORM),以便在没有任何SQL知识的情况下轻松查询数据库。
例如,在Ruby(使用ActiveRecord)中,您可以执行以下操作:
@user = User.find_by_name('pentesterlab')
这将自动生成并执行查询并在User对象中检索结果。
另一个非常方便的用法是从哈希中自动创建和更新对象:
@user = User.create(myhash)
[...]
@user.update_attributes(anotherhash)
不幸的是,这个有用的功能带有安全隐患,如果开发人员没有正确确保对象@user的属性受到保护,攻击者可以任意覆盖任何这些属性。
在本节中,我们将看到这些类型问题的一些常见示例:批量赋值。
也有很多人把“批量赋值”攻击 叫做“覆盖属性”攻击。
在web开发的时候,如果用数据库做存储时会有很多手工写的sql语句。为了方便开发人员,于是开发出了对象关系映射(Object-relational mapping),就像上面Ruby所讲的那样。 以方便不懂sql的开发人员来做数据库的操作。但这并不能保证安全性,如果开发人员没有对参数做好判断,就会出现重置某些属性的问题,这就是覆盖属性。
Example 1
在此示例中,您可以注册用户。该应用程序具有两个级别的权限:
- User
- Admin
使用对象user上的属性admin设置管理员权限。 如果仔细查看Web应用程序使用的格式:user [username]和user [PASSWORD],您应该能够找到获取admin访问权限的方法。 可以使用三种方法:
- 使用浏览器扩展直接修改页面。
- 保存页面并离线修改以创建将正确的有效负载发送到正确的URL的页面。
- 使用代理拦截合法请求并添加参数(最快的选项)。
攻击方法如下:
此示例目的是创建个admin权限的用户。观察参数,发现是user[username]=&user[PASSWORD]= 那么我们试着添加一个admin 属性。
Example 2
在本练习中,开发人员修复了上面的错误。您无法创建具有admin权限的用户...或至少不能直接创建。 试着找到另一种方法来做同样的事情。
例如:
此示例目的同上面一样,创建一个admin权限的用户。但是此示例在创建时并不行。
那么我们创建一个普通用户进去,发现有一个更新简历,那么在更新处添加admin属性就可以。
Example 3
在本练习中,您可以使用以下用户登录:user1,密码为pentesterlab。 登录后,尝试访问company“Company 2”中的信息。
为此,您需要使用批量赋值来修改您的company。
按照惯例(可以通过编程方式更改)当开发人员使用ActiveRecord(Ruby-on-Rails最常用的数据映射器),并且类Company有多个User时,使用User类中的字段company_id管理关系:
Ruby中使用以下代码:
class User < ActiveRecord::Base
belongs_to :company
end
class Company < ActiveRecord::Base
has_many :users
end
Ruby-on-Rails对“配置”实施“约定”,这有助于猜测类名和属性的名称......
使用此信息,您应该能够修改当前company以访问另一家company 的“secret”。 一旦你得到这个“secret”,你可以重置你的company_id以回到你company 的详细信息。
攻击方法如下:
此示例同前2个差不多,但是这里要猜一个company_id的字段。因为在一对多的结构中,即一个company对应多个user,那么在user表中会多一个company_id的外键指向company表。