Software Security Testing Tips for functional testers
In this article I attempt to give some basic security testing tips and tricks for functional testers with limited technical skills. The focus of the article is mainly on XSS and SQL insertions and how to test for them in forms.
The other day I, for the first time, gave the Polteq security training. The original training was written by a (former) colleague quite a few years ago, so the training was clearly up for a bit of a rewrite. While rewriting the training I tried to make sure all items I deemed important were addressed, items ranging from the OSI 7 Layer Model, to the CIA Traid all the way down to nmap portscans and executing XSS exploits.
<SCRIPT> alert(1); </SCRIPT>
If you want to do something a bit more special you can of course change the alert to give you something useful, such as your cookie information:
<SCRIPT> alert(document.cookie); </SCRIPT>
Once you have managed to get the application to show the popup, showing your cookie information, it is important to understand why this is a security issue.
Know your SQL basics
During the training we also touch on some SQL insertions to login to a (highly insecure) Mutilidae instance. In order to do this, the tester will need to figure out what the SQL query is the PHP application fires off to the Database. Once they have found this query, they will need to find a way to trick the application in giving them an authenticated session without having credentials for the application.
The original query can be found by entering a quotation mark in the username field. This will trigger the PHP debug screen showing you what went wrong and more importantly it will give an SQL query:
SELECT * FROM accounts WHERE username = ''' AND password = '';
In order to get past this query without sending a username/password combination several things should be known to you, the tester.
First of all, the SQL query will return a boolean to the application, telling the application whether or not you logged in succesfully (e.g. whether or not the combination of username and password were indeed a unique combination in the database).
Once you realize you need the database to return a TRUE value to the application, you will need to know how to game the SQL query to actually always return TRUE. To do this, you will need to make sure the query no longer contains the AND clause.
In order to do that, you, the tester, need to know how to write comments in SQL statements. In this case the database server attached to this application is a MYSQL server. Commentary in SQL statements can be achieved as follows:
mysql> SELECT 1+1; -- This comment continues to the end of line
Pay close attention in this comment, the space behind the two dashes needs to be there! During the training that was one of the things the testers missed.
So where you want to go is that the query you submit, when you hit the login button is at least deminished to the following;
SELECT * FROM accounts WHERE username = '' -- AND password = '';
Now you need to know how to trick the database into returning the TRUE back to the application. One very easy way is to tell it that 1=1.
The query I was looking for in the training ends up looking as follows:
SELECT * FROM accounts WHERE username='' OR 1= 1 -- ' AND password=''
So the full “username” you fill in (in Mutilidae) should look like this:
' OR 1=1 --
There is of course an easier way for the average tester to test for this kind of issues. Firefox has a few very useful plugins that can be used to do a relatively quick and easy check on XSS or SQL insertion vulnerabilities in a given webform, for example “XSSme“. Keep in mind when using a tool like this, that is is quite likely to give either false positives or false negatives, e.g. do not blindly trust the plugin, but always verify that what it reports is indeed true!
Quick tests for SQL or XSS insertions can at least give you an idea of the level of security of the application. If you really want to be sure your application is safe, get a penetration tester to test it properly (so in other words, give me a call).