Authorization

Url Parameter

You can start accessing information and see the pattern used: /infos/1, /infos/2.

You can access the information using a method similar to the one seen previously.

You cannot just directly access the information, however you can see that you are now able to edit information. You can use this feature to access information from other users just by incrementing the number in the URL.

Adding Extention

Here, most of the code is generated automatically and access to different formats (HTML, JSON) for the same database record, is also done automatically.

For example, by accessing /users/1, you will see a HTML page with the first user's details. However, the scoring key has been masked. You can add /users/1.js or /users/1.json

Fortunately, you should be able to access the JSON representation of this user's details by modifying the URL.

Mass Assignment

When people started building websites with databases to store information, they had to do write a lot of SQL manually. However, some people realized that this was not the best solution and started working on smarter alternatives, building Object-Relational Mapping (ORM) to easily query the database without any SQL knowledge.

For example, in Ruby (using ActiveRecord), you can do things like:

@user = User.find_by_name('pentesterlab')

This will automatically generate and execute the query, then retrieve the result in a User object.

Another really handy usage is to automatically create and update an object from a hash:

@user = User.create(myhash) 
[...]
@user.update_attributes(anotherhash)

Unfortunately, this useful feature comes with a security price.

If a developer did not correctly ensure that attributes of the object @user were protected, an attacker could arbitrarily overwrite any of these attributes. In this section, we will see some common examples of these types of issues: Mass-Assignment.

In this example, you can register a user. The application has two levels of privileges:

  • User.

  • Admin.

The admin privilege is set using the attribute admin on the object user. If you look closely at the format used by the web application: user[username] and user[password], you should be able to find a way to get admin access. Three methods can be used:

  • Modify the page directly using a browser extension.

  • Save the page and modify offline to create a page that will send the right payload to the right URL.

  • Use a proxy to intercept the legitimate request and add your parameter (the fastest option).

// Example
user[username]=admin&user[password]=admin&submit=Submit

user[username]=admin&user[password]=admin&submit=Submit&user[admin]=true

To set your organisation using mass-assignment.

By convention (can be changed programmatically) when a developer uses ActiveRecord (Ruby-on-Rails' most common data mapper), and a class Organisation has multiple User's, the relation is managed using a field organisation_id inside the User class.

The following code is used in Ruby:

class User < ActiveRecord::Base
  belongs_to :organisation
end

class Organisation < ActiveRecord::Base
  has_many :users
end

You can guess the fact that organisation is used by visiting the organisation page and looking at the URL. You will see that the class is probably named Organisation. And therefore the key in the users table is likely to be organisation_id.

Last updated