9.1. SQL Injection Exploits
As with any automation tool, you should be
familiar with the process the tool attempts to automate in order to
develop the tool properly. A detailed explanation of SQL injection
exploits is beyond the scope of this chapter, so the rest of the text
assumes you're familiar with SQL injection and
typical exploits. Numerous papers have been written on the topic and
you can easily obtain them by searching for "SQL
Injection Whitepaper" online.
9.1.1. Exploit Categories
In general,
SQL
injection exploits fit into the following three categories:
- DATA READ
-
As the name implies, these exploits allow data to be read or
extracted from the target database. These exploits can be as simple
as attacks that modify the query's search criteria
to return all records within the specified table (such as appending
OR 1=1 to the WHERE portion of
the query). More sophisticated exploits allow the addition of a
UNION operator to return results of arbitrary
queries along with the original application dataset. These exploits
rely on standard SQL syntax, and typically succeed against most
SQL-driven databases.
- DATA WRITE
-
These exploits allow data to be written to the database, most
commonly using either an INSERT or
UPDATE query. Like the previous category, these
exploits succeed on most standard SQL-driven databases.
- EXECUTE
-
These exploits are possible only with certain databases and typically
execute a stored procedure or another database-specific command. The
nature and extent of possible exploits vary between database servers.
Although it would be nice to develop a "silver
bullet" tool that can automate exploits against any
database using any of these techniques, documenting such a tool would
require far more than one chapter. In this chapter, we focus on the
DATA READ exploits because
these are least likely to result in damage to the underlying data
and/or application. As we develop our exploit tool, we will attempt
to minimize the number of database-specific strings and routines in
order to make the code as flexible and extensible as possible.
9.1.2. Exploit Techniques
In addition to different categories of
SQL injection exploits, there are also different exploit techniques
and methodologies. Each method has benefits and drawbacks and can be
performed in only certain scenarios. Our exploit engine will use the
two basic techniques discussed in the next two subsections to perform
exploits.
9.1.2.1 Error-based SQL injection
The most basic technique for exploiting
SQL injection uses database error messages to determine the
query's structure and to build a vulnerability
exploit request. Error-based SQL injection is relatively easy to
detect by the database-level error messages disclosed by the
application. These error messages, when available to the attacker,
are very useful when constructing a working exploit. They provide an
easy aid for developing a syntactically correct exploit request. An
attacker who is intimately familiar with the various error messages
returned by different database servers can often obtain all the
necessary information required to exploit the vulnerability through
these messages. Unfortunately, due to the large number of different
error messages a given database server generates, automated exploits
relying on these messages are more prone to error, because even
different versions of the same database server can return different
messages under the same scenarios. Most commercial application-level
scanners (such as SPI Dynamics' WebInspect and
Sanctum's AppScan), and even the scanner we
developed in the previous chapter, do a fairly good job of detecting
potential error-based SQL injection points using error message
signatures, but because they don't attempt to
exploit the potential vulnerability, they are prone to reporting
false positive results.
9.1.2.2 Blind SQL injection
In today's web
application environment, it's common for application
developers and administrators to configure web applications and
servers not to return detailed error messages to end users. Even if
the code doesn't properly handle exceptions, most
application and web servers suppress these details and return a
custom error page or message to the user. To detect and exploit SQL
injection vulnerabilities in these applications, you must use a more
sophisticated approach. Blind SQL injection detects general
application error conditions. Subsequent requests deduce what is
happening within the application code based on the presence or
absence of the error condition. A series of these requests can expose
virtually the same level of exploits as the error-based approach.
However, few commercial application scanners effectively detect blind
SQL injection points.
|