* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Download Database Security - People
Survey
Document related concepts
Entity–attribute–value model wikipedia , lookup
Extensible Storage Engine wikipedia , lookup
Microsoft Access wikipedia , lookup
Functional Database Model wikipedia , lookup
Oracle Database wikipedia , lookup
Ingres (database) wikipedia , lookup
Concurrency control wikipedia , lookup
Microsoft Jet Database Engine wikipedia , lookup
Microsoft SQL Server wikipedia , lookup
Open Database Connectivity wikipedia , lookup
Relational model wikipedia , lookup
Database model wikipedia , lookup
Transcript
CIS 764 – DataBase Systems Engineering Database Security CIS-764 Database Systems Engineering Database Security Submitted By:Mazharuddin Mohammad Kansas State University Page 1 of 19 CIS 764 – DataBase Systems Engineering Database Security TABLE OF CONTENTS 1. ABSTRACT 4 2. INTRODUCTION 4 3 ORACLE SECURITY 5 3.1 Listener Security 5 3.2 Listener Security is Not Database Security 5 3.3 Known Listener Problems 5 3.4 TNS Leaks Data to Attacker 6 4. MICROSOFT SQL SERVER SECURITY 8 4.1 Collecting Passwords 8 4.2 SQL Agent Password 8 4.3 DTS Package Passwords 10 4.4 Causing a Denial of Service 11 4.5 Recommendations to secure SQL SERVER 11 5. SYBASE DATABASE SECURITY 11 5.1 SYBASE DBCC CHECKVERIFY BUFFER OVERFLOW 11 5.2 SYBASE DROP DATABASE BUFFER OVERFLOW VULNERABILITY 12 5.3 SYBASE XP_FREEDLL BUFFER OVERFLOW VULNERABILITY 13 6. IBM DB2 SECURITY 13 6.1 Authentication Types 13 6.2 Default IBM DB2 Username and Passwords 14 6.3 LOCKING DOWN ON IBM DB2 DATABASE PRIVILEGES 14 6.4 INSTALL ALL OF THE LATEST FIXPACKS FOR IBM DB2 14 Page 2 of 19 CIS 764 – DataBase Systems Engineering Database Security 7. SQL INJECTION 15 7.1 How Does It Work 15 7.2 Preventing SQL Injection 17 8. DATABASE WORMS 17 9. CONCLUSION 18 10. REFERENCES 18 Page 3 of 19 CIS 764 – DataBase Systems Engineering Database Security Database Security 1. Abstract: Perimeter Security no longer works in today’s environment. Today, more than just our employees need access to data. Essentially, partners and customers must have access to this data as well meaning that our database cannot simply be hidden behind a firewall. However, as our databases become more exposed to Internet, it is imperative that we properly secure them from attacks from the outside world. Securing our databases involves not only establishing a strong policy, but also establishing adequate access controls. This paper covers various ways databases are attacked, and how to prevent them from being “hacked”. 2. Introduction The truth is most databases are configured in a way they can be broken into relatively easily. However, this is not to say that databases cannot be made properly secured. It is the information to properly lock down these databases that has not been made available, and that the proper lockdown procedures have not been taken. On the other hand, we have seen web servers being attacked and compromised. The reasons for this being: There are less databases than web servers. Knowledge of database security has been limited. Getting a version of enterprise databases to learn and test on was difficult. Databases were traditionally behind a firewall. To handle the database security properly, one must know the various classes of vulnerabilities which are as follows: Vendor Bugs: These are nothing but buffer overflows and programming errors that result in users executing the commands they are allowed to execute. To fix this problem one must be aware of the patches, and install them immediately when they are released. Page 4 of 19 CIS 764 – DataBase Systems Engineering Database Security Poor Architecture: This is the result of not properly factoring security into the design of how an application works. This is typically the hardest to fix because it requires a major rework by the vendor. An example of poor architecture would be when a vendor utilizes a weak form of encryption. Misconfigurations: These are caused by not properly locking down databases. An example of this in Oracle is the REMOTE_OS_AUTHENT parameter. By setting REMOTE_OS_AUTHENT to true, you are allowing unauthenticated users to connect to your database. INCORRECT USAGE: Incorrect usage refers to building applications utilizing developer tools in ways that can be used to break into the system. Ex: SQL Injection. 3 ORACLE Security 3.1 Listener Security A good place to start delving into Oracle security is the Listener service - a single component in the Oracle subsystem. The listener service is a proxy that sets up the connection between the client and the database. The client directs a connection to the listener, which in turn hands the connection off to the database. One of the security concerns of the listener is that it uses a separate authentication system. 3.2 Listener Security is Not Database Security Reasons for the separation of Listener and Database security being a potential problem are: Most people do not even realize that a password must be set on the listener service. Setting the password on listener service is not straight forward. One can manually set the password in the “listener.ora” configuration file, but most people do not know how, nor do they have any idea that they should. 3.3 Known Listener Problems Enter the following command at a UNIX shell to start the listener controller: Page 5 of 19 CIS 764 – DataBase Systems Engineering Database Security $ORACLE_HOME/bin/lsnrctl To list the commands available from the listener controller, run the help command. LSNRCTL> help The following operations are available An asterisk (*) denotes a modifier or extended command: start stop status services version reload save_config trace dbsnmp_start dbsnmp_stop dbsnmp_status change_password quit exit set* show* As it can be observed within the above example that “set” and “show” are the commands with asterisks after them. Let’s list the possible extended commands for this commands as well: LSNRCTL> help set password rawmode displaymode trc_file trc_directory trc_level log_file log_directory log_status current_listener connect_timeout startup_waittime use_plugandplay save_config_on_stop Note the command ‘set password’. This command is utilized to log us onto a listener. There are a couple of problems with this password: � There is no lockout functionality for this password � The auditing of these commands is separate from the standard Oracle audit data � The password does not expire. Basically, there are no password management features for the listener password. This means that it is not very difficult to write a simple script to brute force this password even if a strong password is being utilized. 3.4 TNS Leaks Data to Attacker Another problem with Listener Service is that it leaks information. Mr. James Abendschan first made this problem public. A Full Description can be found at: http://www.jammed.com/~jwa/hacks/security/tnscmd/tns-advisory.txt Page 6 of 19 CIS 764 – DataBase Systems Engineering Database Security The format of a listener packet resembles the following: TNS Header – Size of packet – Protocol Version – Length of Command – Actual Command If we create a packet with an incorrect value in the ‘size of packet’ field, the listener will return any data in its command buffer up to the size of the buffer we sent. In other words, if the previous command submitted by another user was 100 characters long, and the command we send is 10 characters long, the first 10 character will be copied over by the listener, it will not correctly null terminate the command, and it will return our command plus the last 90 characters of the previous command. Ex: A typical packet sent to the listener looks like the following: .T.......6.,...............:................4.............(CONNECT_DATA=.) As it can be observed in the above example, the 16 Byte command being sent is (CONNECT_DATA=.) If we set the size of the packet to be 32 instead of 16 then the response packet will be as follows: ....."...(DESCRIPTION=(ERR=1153)(VSNNUM=135290880) (ERROR_STACK = (ERROR=(CODE=1153)(EMFI=4) (ARGS='(CONNECT_DATA=.) ervices)) CONNECT'))(ERROR=(CODE=303)(EMFI=1)))) The return packets indicate that Oracle does not understand our command, and the command it does not understand is returned in the ‘ARGS’ value. As it can be observed that the value returned is our command plus an additional 16 characters. At this point of time it is not clear what those 16 characters are. To analyze that, let’s set size of the packet 200 Bytes and observe the result : ........"..>.H.......@(DESCRIPTION=(ERR=1153)(VSNNUM=135290880)(ERROR _ STACK =(ERROR=(CODE=1153)(EMFI=4) (ARGS= '(CONNECT_DATA=.)ervices)) CONNECT_DATA=(SID=orcl)(global_dbname=test.com) (CID =(PROGRAM =C:\Oracle\ bin\sqlplus.exe)(HOST= host123)(USER=user1))')) (ERROR=(CODE=303) (EMFI=1)))) Now the ARGS value is a little longer and it can be seen now that what is being returned is previous commands submitted by other users to the database. Also Page 7 of 19 CIS 764 – DataBase Systems Engineering Database Security observe that the HOST and USER name of the other user is displayed in this buffer. Now an attacker can continually retrieve the buffer and gather a list of database usernames. Now imagine if the database administrator logs into the database using the listener password of which you can retrieve from the buffer. This problem has been fixed in the latest patch sets (patchset 2 for Oracle version 8.1.7). It is also a good idea to deal with this problem by limiting access to connect to Oracle using a firewall or other packet filtering device. 4. Microsoft SQL SERVER Security 4.1 Collecting Passwords: When SQL Server is running using mixed-mode authentication, login passwords are saved in various locations. Some passwords are saved using strong encryption and permissions but many of them are saved using weak encryption and weak default permissions. One may ask, “Why are passwords saved with weak encryption?” The reason is that these passwords must later be extracted and used by SQL Server to establish connections with itself and other SQL Servers. Typically system tables holding these passwords are properly secure, that is only if dbo has permissions to select from the table. There are, however, system stored procedures that access these tables - so looking at these stored procedures is a good place to start. 4.2 SQL Agent Password: SQL Server Agent can be configured to connect using standard SQL Server authentication with a login in the sysadmin role. Set the login to “sa” and set the password to “a”. The difference between the two SQL statements in SQL Profiler can now be seen: EXECUTE msdb.dbo.sp_set_SQLagent_properties @host_login_name = 'sa’, @host_login_password = 0x6e1c7e83d0a487d623fc7cd689b8e702cc416bcd8d18c28ee0a4ba37c97ccfb5 Performing the same action but setting a password of “aaaaaaaaaa”, we execute the following statement. Page 8 of 19 CIS 764 – DataBase Systems Engineering Database Security EXECUTE msdb.dbo.sp_set_SQLagent_properties @host_login_name = 'sa’, @host_login_password = 0x6e1c1f1b809cb8a1a1acd3c2cb1cce7e0a099592a03ab7979f196de0b6898deb The encrypted password is passed to the stored procedure sp_set_SQLagent_properties. In the stored procedure the following is shown: EXECUTE master.dbo.xp_SQLagent_param 1, N'HostPassword', @host_login_password The encrypted password is finally saved by the extended stored procedure xp_SQLagent_param. The question to ask now is “where is it saved?” It can be assumed that it is not saved in a system table because the password is used to connect to SQL Server so the Agent would need to access the password before connecting to the database. Since it is not saved in a table then it is probably safe to assume that it is saved in the registry. Now that it is known where the encoded password is saved, how can it be retrieved When Enterprise Manager displays the SQL Agent properties? One thing that can be executed is to select the SQL Server Agent properties in Enterprise Manager again and record the SQL sent through SQL Profiler using the following statement: EXECUTE msdb.dbo.sp_get_SQLagent_properties Starting the SQL Query Analyzer will execute the query, and discover that most of the properties of the SQL Server Agent are returned together with the encrypted password. However, it is still unknown what users can execute sp_get_SQLagent_properties. To determine this, the following statement can be executed: EXECUTE sp_helprotect sp_get_SQLagent_properties The results are as follows: Owner dbo Object sp_get_SQLagent_properties Grantee Grantor public dbo ProtectType Action Column Grant Execute . Through the above illustration, a security hole is discovered that can be used by any user in the database. The next step is to figure out how to decrypt the encrypted Page 9 of 19 CIS 764 – DataBase Systems Engineering Database Security password that was found: The encrypted version of the password (a) is: 0x6e1c7e83d0a487d623fc7cd689b8e702cc416bcd8d18c28ee0a4ba37c97ccfb5 The encrypted version of the password (aaaaaaaaaa) is: 0x6e1c1f1b809cb8a1a1acd3c2cb1cce7e0a099592a03ab7979f196de0b6898deb It can be seen from above that the first two bytes are the same in both encrypted passwords. However, with further investigation, it is concluded that the encryption algorithm used is a simple XOR with a positional key depending on the previous character. With this new finding, a chosen plain-text attack knowing that the first character is always XOR’ed with a fixed key can be performed. Let’s look for the function used by Enterprise Manager to encrypt the password. After some research, it is found that SEMCOMN.DLL (located in SQL Server Instance Binn folder) has a Decrypt() function that can be used to decrypt the password With this, a simple program can be created to get the clear text password. Now that the decrypt function produced a sysadmin role password, the server is ready and available for an “attack”. 4.3 DTS Package Passwords: These are another source of passwords. When we select the location to save the Data Transformation Package, it can be seen in the SQL Profiler that msdb.dbo.sp_add_dtspackage is used to save the data (including the connection passwords) in msdb.dbo.sysdtspackages system table. Nevertheless, users in the public group cannot query this table. The DTS package data is saved in an encrypted or encoded format in an image field named “packagedata”. To decode this data, further research is needed. A quick hack would be to retrieve the package data, insert it to your own SQL Server into the sysdtspackages table, and then open the package and extract the connection passwords from memory or from sniffing the wire by running the package. By doing this, it gives ample time in determining this password. Although it may take some time depending on the password strength, the DTS package (if password protected) can be brute forced, ultimately opening the package and gaining the connection password retrieved. with further analysis, it is discovered that the most important data (the connection password) is saved in the table Page 10 of 19 CIS 764 – DataBase Systems Engineering Database Security msdb.dbo.rtbldmbprops in the field col11120, thus yielding a new password uncovered. 4.4 Causing a Denial of Service: What if the server is tightly locked down? An attacker can also simply resort to crashing the server. All users can create temporary stored procedures and tables. Given that, they are authorized to execute the following statements. create table #tmp (x varchar(8000)) exec('insert into #tmp select ''X''') while 1=1 exec('insert into #tmp select * from #tmp') This will create a temporary table and will run an endless loop inserting values into the table. Temporary tables are created in the tempdb system database and, after some time, the tempdb database will grow until it consumes all system resources and causes the SQL Server instance to fail or crash. 4.5 Recommendations to secure SQL SERVER: Keep SQL Server up to date with security fixes. Use Integrated Authentication. Run SQL Server under a low privileged account. Set SQL Server Agent Alerts on critical issues. Run periodical checks on all system and non system objects (tables, views, stored procedures, extended stored procedures) permissions. Run periodical checks on users permissions. Audit as much as you can. 5. SYBASE Database Security Sybase has its own share of vulnerabilities to be aware of. 5.1 SYBASE DBCC CHECKVERIFY BUFFER OVERFLOW: Sybase Adaptive Server provides a built-in function called DBCC CHECKVERIFY which is used to verify the results of the most recent run of dbcc checkstorage. It accepts a single parameter that is the name of the database to verity and does not Page 11 of 19 CIS 764 – DataBase Systems Engineering Database Security validate the length of the string passed into the first parameter. This buffer overflow may allow an attacker to run arbitrary code under the security context of the database. Below is an example of overflowing the buffer using the SQL tool isql.exe: declare @test varchar(16384) select @test = replicate('A', 16384) DBCC CHECKVERIFY(@test) go DBCC CHECKVERIFY is only meant to be run by privileged users, however if a nonprivileged user runs this command, the buffer overflow occurs before any access control takes place. Therefore a non-privileged user can use this security hole to take complete control of a Sybase server. This vulnerability can be remedied by applying the a patch that can be downloaded from the following location: http://downloads.sybase.com/swd/swx 5.2 SYBASE DROP DATABASE BUFFER OVERFLOW VULNERABILITY: Sybase Adaptive Server also provides a built-in function called DROP DATABASE which is used to remove a database from the server. It accepts a single parameter that is the name of the database to remove and does not validate the length of the string passed into the first parameter. This buffer overflow may allow an attacker to run arbitrary code under the security context of the database. Below is an example of overflowing the buffer using the SQL tool isql.exe. declare @test varchar(16384) select @test = replicate('A', 16384) DROP DATABASE @test go The command “DROP DATABASE” is only meant to be run by privileged users, however if a non-privileged user runs this command, the buffer overflow occurs before any access control takes place. Therefore a non-privileged user can use this security hole to take complete control of a Sybase server. This vulnerability can be Page 12 of 19 CIS 764 – DataBase Systems Engineering Database Security addressed by applying the patch available at http://downloads.sybase.com/swd/swx. 5.3 SYBASE XP_FREEDLL BUFFER OVERFLOW VULNERABILITY: Sybase Adaptive Server provides an extended stored procedure (ESP) called xp_freedll in the database sybsystemprocs which is used to release a DLL that has been loaded by another extended stored procedure. Xp_freedll accepts a single parameter that is the name of the DLL to free and does not validate the length of the string passed into the first parameter. Moreover it then attempts to copy an overly long string into a small memory buffer. This memory copy results in the stack and the stack pointer being overwritten with the buffer. Once the stack pointer is overwritten, execution can be redirected to an arbitrary location in memory and opcodes injected into the long string passed to the ESP can be executed. This allows the attacker to run arbitrary code under the security context of the extended stored procedure server. To fix this vulnerability, execute permissions on the extended stored procedure xp_freedll in the sybsystemprocs database should be revoked from public. Moreover latest patches that are released must be downloaded and installed. 6. IBM DB2 Security This section will discuss existing security controls together with a few recently discovered vulnerabilities in IBM DB2 databases. 6.1 Authentication Types: The authentication type defines a combination of where and how authentication occurs. It can be specified at the client or at the server. Which authentication type to use is limited based on the environment and the operating system of the server, and is something to be aware of for all versions of IBM DB2. The authentication type is configured at both the client and the server. For the server, authentication is defined in the database manager configuration file. When selecting an authentication mechanism, it is important to select a secure mechanism. Page 13 of 19 CIS 764 – DataBase Systems Engineering Database Security The first issue to consider is that client authentication should not be relied on. Any computer can be hooked up to the network and you cannot assume these clients are secured. The second issue to consider is that the client credentials should be encrypted before being sent to the server. This is important to prevent someone from sniffing authentication credentials as they go over the network. 6.2 Default IBM DB2 Username and Passwords: After installing a database, one should immediately change any default usernames and passwords. If the password is not changed from the default value, a hacker can easily break into the database. However DB2 provides a method to change a password through a DB2 client: To change the password, use the following command: CONNECT TO [database] USER [userid] USING [password] NEW [new_password] CONFIRM [new_password] The password can also be changed using the "Password change" dialog of the DB2 Client Configuration Assistant (CCA). 6.3 LOCKING DOWN ON IBM DB2 DATABASE PRIVILEGES: In the first step, a would try attempting to gain elevated privileges on an IBM DB2 database, and hence would try to gain a list of accounts that can be brute-forced. IBM DB2 databases do not have database-specific accounts in the same manner that other databases have database-specific accounts. IBM DB2 accounts are operating system accounts and authentication is performed under the operating system. For this reason, this database does not have a specific table under which all accounts are listed. Instead, there are specific tables in which account names are listed. Efforts to secure IBM DB2 databases should include the removal of all permissions granted to "public", and carefully review all users within the SYSADM group. Privileges on all system catalogs should also be revoked. 6.4 INSTALL ALL OF THE LATEST FIXPACKS FOR IBM DB2: Page 14 of 19 CIS 764 – DataBase Systems Engineering Database Security IBM Releases Fix Packs on a regular basis that provide various enhancements including security fixes. Staying up-to-date on the latest Fix Pack minimizes the risk of being vulnerable to buffer overflows and other attacks. 7. SQL Injection: Just because our database is behind a firewall does not mean that we do not need to worry about it being attacked. There are several other forms of attacks that can be executed through the firewall. The most common of these attacks today is SQL Injection. 7.1 How Does It Work: SQL Injection is not an attack directly on the database. It is caused by the way web applications are developed. Since we are trying to protect the database, we need to be aware of these issues, know how to detect them, and fix the problems. SQL Injection works by attempting to modify the parameters passed to a web application to change the SQL statements that are passed to the database. So how does the exploit work? It is based on a hacker attempting to modify a query, such as: Select * from my_table where column_x = ‘1’ to: Select * from my_table where column_x = ‘1’ UNION select password from DBA_USERS where ‘q’=‘q’ In the above example, we can observe a single query being converted into 2 queries. There are also ways to modify the ‘WHERE’ criteria to update or delete rows not meant to be updated or deleted. With other databases one can embed a second command into the query. Oracle does not allow this. Instead an attacker would need to figure out how to supplement the end of the query. Note the ‘q’ = ‘q’ at the end. This is used because we must handle the second single quote that the ASP page is adding onto the end of the page. This clause simply evaluates to TRUE. Here is an example of a Java Server Page that one might typically find in a web application. Here we have the case of a typical authentication mechanism used to login to a web site. One must enter his/her password and username. Using these two fields we get a SQL statement that selects from the tables where the username and Page 15 of 19 CIS 764 – DataBase Systems Engineering Database Security password match the input. If a match is found, the user is authenticated. If the recordset in our code is empty, then an invalid username or password must have been provided and the login is denied. Package myseverlets; <….> String sql = new String(“SELECT * FROM WebUsers WHERE Username=’” + request.getParameter(“username”) + “’ AND Password=’” + request.getParameter(“password”) + “’” stmt = Conn.prepareStatement(sql) Rs = stmt.executeQuery() Exploiting the problem is much simpler if there can be access to the source of the web page. One should not be able to see the source code, however there are many bugs in most of the common web servers that allow an attacker to view the source of scripts, and we assume that there are still many that have not been discovered. The problem with our ASP code is that we are concatenating our SQL statement together without parsing out any single quotes. Parsing out single quotes is a good first step, but it's recommended that we actually use parameterized SQL statements instead. For the following web page, I set the username to: Mazhar I also set the password to: Hardtoguess The SQL statement for these parameters resolves to: SELECT * FROM WebUsers WHERE Username=’Mazhar’ AND password=’Hardtoguess’ Now what if an attacker enters some letters together with using a single quote to end the string literal, and then inserts another Boolean expression in the where clause instead of using a regular password. Obviously, this Boolean expression is TRUE which returns all the rows in the table. For instance, if an attacker instead enters the password as: Aa’ OR ‘A’=‘A The SQL statement now becomes: SELECT * FROM WebUsers WHERE Username=’Mazhar’ AND Password=’Aa’ Page 16 of 19 CIS 764 – DataBase Systems Engineering Database Security OR ‘A’=‘A’ As it can be observed that this query will always return all the rows in the database, with the attacker convincing the web application that a correct username and password was passed in. The kicker is that when the recordset contains the entire set of users, the first entry in the list will typically be the Administrator of the system, so there is a good chance the attacker will be authenticated will full administrative rights to the application. 7.2 Preventing SQL Injection: Once we understand the problem it is simple to prevent SQL injection from happening. There are two strategies that can be used to prevent the attacks: Validate User Input: This involves parsing a field to restrict the valid characters that are accepted. In most cases, fields should only accept alphanumeric characters. Also one can escape single quotes into two single quotes although this method is riskier since it is much easier to miss parsing input somewhere. Use parameterized queries: This involves binding variables rather than concatenating SQL statements together as strings as described earlier. 8. Database Worms: A new set of threats have emerged – worms that propagate through vulnerabilities in databases rather than through more traditional operating system or web server holes. Despite their lack of sophistication, these worms have been somewhat successful because of the poor state of database security. The damage caused by a worm is dependent on several factors: The number of targets for the worm: This is critical because databases cannot always be hidden behind a firewall. The success rate of infection: This is critical in order to know whether or not the worm is able to spread through to other systems. The resilience of the worm: A well-developed worm is much harder to fight than a “noisy” and “sloppy” worm that is easy to remove from the system. Page 17 of 19 CIS 764 – DataBase Systems Engineering Database Security 9. Conclusion The truth is that there are not many resources out there to keep up with database security. There are a few simple tasks that can be performed to reduce your security risk at a reasonable level. Stay patched. Stay aware of database security holes. Explore possible third-party solutions Provide multiple levels of security: Perform audits and pen tests on your databases regularly. Encryption of data in motion. Encryption of data at rest within the database. Monitor your log files. Implement intrusion detection By staying informed and aware of security vulnerabilities to databases, one should be able to minimize the risks to a possible extent. 10. References Cesar Cerrudo (Independent Security Researcher/Consultant) and Aaron Newman (CTO/Founder, Application Security, Inc.) “Hunting flaws in Microsoft SQL Server” http://www.appsecinc.com/presentations/Hunting_MSSQLServer_Security_Flaws.pdf Pages 56 Aaron Newman, “Protecting Databases” http://www.appsecinc.com/presentations/ProtectingDatabases.pdf pages 40 Aaron Newman, “Hack-proofing Oracle Databases” http://www.appsecinc.com/presentations/oracle_security.pdf pages 51 Page 18 of 19 CIS 764 – DataBase Systems Engineering Database Security Aaron Newman, “Introduction to Database and Application Worms “ http://www.appsecinc.com/presentations/Database_Application_Worms.pdf pages 7 Aaron Newman, “Hack Proofing DB2” http://www.appsecinc.com/presentations/Securing_IBM_DB2.pdf pages 47 http://www.appsecinc.com/presentations/Protecting_Oracle_Databases_White_Paper.pdf Pages 17 http://www.appsecinc.com/presentations/Manipulating_SQL_Server_Using_SQL_Injecti on.pdf Pages 14 Page 19 of 19