Questions about this topic? Sign up to ask in the talk tab.
Difference between revisions of "Delete after length check"
From NetSec
| Line 1: | Line 1: | ||
| − | + | Delete after length-check (Empty Where Clauses) | |
Proof of concept: | Proof of concept: | ||
| Line 17: | Line 17: | ||
SELECT * FROM user WHERE pwreset_code='' LIMIT 1; | SELECT * FROM user WHERE pwreset_code='' LIMIT 1; | ||
As reset codes are generated on reset request (forgot password form), this will leave the first user (usually the admin) of the web app exposed to arbitrary password overwrite. | As reset codes are generated on reset request (forgot password form), this will leave the first user (usually the admin) of the web app exposed to arbitrary password overwrite. | ||
| − | + | ||
| + | Mitigation: | ||
Instead of checking length before replacement, verify after deletion. | Instead of checking length before replacement, verify after deletion. | ||
* PHP: | * PHP: | ||
| Line 28: | Line 29: | ||
... | ... | ||
} | } | ||
| − | + | ||
| + | |||
| + | In the wild: | ||
A Joomla! framework exploit leveraged this weakness for an administrative password reset (2008). | A Joomla! framework exploit leveraged this weakness for an administrative password reset (2008). | ||
CVE 2008-3861 http://www.exploit-db.com/exploits/6234/ | CVE 2008-3861 http://www.exploit-db.com/exploits/6234/ | ||
| − | + | ||
| + | Auditing: | ||
Follow the same auditing steps as listed for unsafe deletion, with an eye towards where clauses or other empty type comparisons that could lead to problematic outcomes. | Follow the same auditing steps as listed for unsafe deletion, with an eye towards where clauses or other empty type comparisons that could lead to problematic outcomes. | ||
[[Category:Secure programming]] | [[Category:Secure programming]] | ||
Revision as of 06:29, 6 December 2012
Delete after length-check (Empty Where Clauses)
Proof of concept:
------------------------
While the example here is based on SQL injection, it can apply to other scenarios as well. Suppose the following php code:
<?php
# pwreset.php
if (strlen($_GET['reset']) == 16) {
$pwreset_code = preg_replace_all('/([^\w]+)/',,$_GET['reset']); #alphanumeric only.
$user_query = "SELECT * FROM user WHERE pwreset_code= '" . $pwresetcode ."' LIMIT 1";
$user_data = @mysql_query($user_query);
...
}
-----------------------
pwreset.php?reset='''''''''''
The generated sql statement:
SELECT * FROM user WHERE pwreset_code= LIMIT 1;
As reset codes are generated on reset request (forgot password form), this will leave the first user (usually the admin) of the web app exposed to arbitrary password overwrite.
Mitigation:
Instead of checking length before replacement, verify after deletion.
* PHP:
<?php
# pwreset.php
$pwreset_code = preg_replace_all('/([^\w]+)/',,$_GET['reset']); #alphanumeric only.
if (strlen($pwreset) == 16) {
$user_query = "SELECT * FROM user WHERE pwreset_code= '" . $pwresetcode ."' LIMIT 1";
$user_data = @mysql_query($user_query);
...
}
In the wild:
A Joomla! framework exploit leveraged this weakness for an administrative password reset (2008). CVE 2008-3861 http://www.exploit-db.com/exploits/6234/
Auditing:
Follow the same auditing steps as listed for unsafe deletion, with an eye towards where clauses or other empty type comparisons that could lead to problematic outcomes.