Transparency in Ajax Applications - Part 2
[next]
Transparency in Ajax Applications - Part 2
Specific Security Mistakes
Beyond the general danger of revealing application logic to potential attackers, there are specific mistakes that programmers make when writing client-side code that can open their applications to attack.
Improper Authorization
Let's return to MyLocalWeatherForecast.com. MyLocalWeatherForecast.com has an administration page, where site administrators can check usage statistics. The site requires administrative authorization rights in order to access this page. Site users and other prying eyes are, hence, prevented from viewing the sensitive content.
Because the site already used Ajax to retrieve the weather forecast data, the programmers continued this model and used Ajax to retrieve the administrative data: They added client-side JavaScript code that pulls the usage statistics from the server, as shown in Figure 6-7.
Figure 6-7 Intended usage of the Ajax administration functionality
Unfortunately, while the developers at MyLocalWeatherForecast.com were diligent about restricting access to the administration page (admin.php
), they neglected to restrict access to the server API that provides the actual data to that page. While an attacker would be blocked from accessing admin.php
, there is nothing to prevent him from calling the GetUsageStatistics
function directly. This technique is illustrated in Figure 6-8.
Figure 6-8 Hacking the administration functionality by directly accessing the client-side JavaScript function
There is no reason for the hacker to try to gain access to admin.php
. He can dispense with the usual, tedious authorization bypass attacks like hijacking a legitimate user's session or guessing a username and password through brute force. Instead, he can simply ask the server for the administrative data without having to go to the administrative page, just as Eve did in her attack on HighTechVacations.net in Chapter 2. The programmers at MyLocalWeatherForecast.com never intended the GetUsageStatistics
function to be called from any page other than admin.php
. They might not have even realized that it could be called from any other page. Nevertheless, their application has been hacked and they are to blame.
Security Note
In this case, it was easy for the attacker to discover the GetUsageStatistics
function and call it, because it was defined in a shared library referenced by both the main user page weatherforecast.php
and the administration page admin.php
. However, even if GetUsageStatistics were to be removed from the shared library and defined only in admin.php, this would not change the fact that an attacker could still call the server method directly if he ever found out about its existence. Hiding the method is not a substitute for appropriate authorization. Hiding the method is an example of relying on "security through obscurity" and is a dangerous approach to take. The problems with depending on obscurity are discussed later in this chapter.
Some of the worst cases of improperly authorized API methods come from sites that were once standard Web applications but were later converted to Ajax-enabled applications. You must take care when Ajaxifying applications in order to avoid accidentally exposing sensitive or trusted server-side functionality. In one real-world example of this, the developers of a Web framework made all their user management functionality available through Ajax calls. Just like our fictional developers at MyLocalWeatherForecast.com, they neglected to add authorization to the server code. As a result, any attacker could easily add new users to the system, remove existing users, or change users' passwords at will.
Security Note
When converting an existing application to Ajax, remember to add authorization-checking code to newly-exposed methods. Functionality that was intended to be accessed only from certain pages will now be available everywhere. As a result, you can no longer rely on the authorization mechanisms of the page code. Each public method must now check a user's authorization.
[next]
URL: