基于约束条件的SQL打击 8090安适门户
目前值得开心的是,开发者在成立网站时,已经开始存眷安适问题了——几乎每个开发者都知道SQL注入缝隙了。在本文中,我将为读者介绍另一种与SQL数据库相关的缝隙,虽然它的风险性与SQL注入八两半斤,但目前却很少为人所知。接下来,我将为读者详细展示这种打击手法,以及相应的防御计谋。
配景常识
比来,我遇到了一段有趣的代码,它测验考试尽一切可能来掩护数据库的访谒安适,例如每当新用户进行注册时,将运行以下代码:
为了验证登录信息,将用到下列代码:
$username = mysql_real_escape_string($_GET['username']); $password = mysql_real_escape_string($_GET['password']); $query = "SELECT username FROM users WHERE username='$username' AND password='$password' "; $res = mysql_query($query, $database); if($res) { if(mysql_num_rows($res) > 0){ $row = mysql_fetch_assoc($res); return $row['username']; } } return Null;安适注意事项周全吗?
过滤用户输入参数了吗? - 查抄了
使用单引号(')来增加安适性了吗? - 查抄了
很好,还有什么可能堕落的处所吗?
是的,打击者依然能够以任意用户身份进行登录!
打击手法
在谈论这种打击手法之前,首先需要介绍几个至关重要的常识点。
1. 在措置惩罚惩罚SQL中的字符串时,字符串末尾的空格字符城市被删除。换句话说,“vampire”与“vampire ”几乎是等效的,这在大大都情况下是正确的,例如WHERE子句中的字符串或INSERT语句中的字符串。例如,以下语句的盘问功效,与使用用户名“vampire”进行盘问时的功效是一样的。
SELECT * FROM users WHERE username='vampire ';
但是,除此之外也确实存在例外情况,例如LIKE子句。注意,对尾部空白字符的这种修剪操纵,主要是在“字符串对照”期间进行的。这是因为,SQL会在内部使用空格来填充字符串,以便在对照之前使其它们的长度连结一致。
2. 在任意INSERT盘问中,SQL会按照varchar(n)来限制字符串的最大长度,也就是说,如果字符串的长度大于“n”个字符的话,那么仅使用字符串的前“n”个字符。例如,如果特定列的长度约束为“5”个字符,那么在插入字符串“vampire”时,实际上只能插入字符串的前5个字符,即“vampi”。
此刻,让我们成立一个测试数据库来演示具体打击过程。
我将创建一个数据表users,它有两列,即username和password。并且,这两个字段的最大长度为25个字符。接下来,我将插入一行记录,此中以“vampire”作为用户名,以“my_password”作为暗码。
mysql> CREATE TABLE users ( -> username varchar(25), -> password varchar(25) -> ); Query OK, 0 rows affected (0.09 sec) mysql> INSERT INTO users -> VALUES('vampire', 'my_password'); Query OK, 1 row affected (0.11 sec) mysql> SELECT * FROM users; +----------+-------------+ | username | password | +----------+-------------+ | vampire | my_password | +----------+-------------+ 1 row in set (0.00 sec)为了展示尾部空白字符的修剪情况,我们可以输入下列命令:
mysql> SELECT * FROM users -> WHERE username='vampire '; +----------+-------------+ | username | password | +----------+-------------+ | vampire | my_password | +----------+-------------+ 1 row in set (0.00 sec)此刻,假设一个易受打击的网站使用了前面提到的PHP代码来措置惩罚惩罚用户的注册和登录。为了入侵任意用户的帐户(就本例来说,用户名为“vampire”),只需使用用户名“vampire[一些空白字符]1”和一个随机暗码进行注册即可。对付选择的用户名,前25个字符应该只包罗vampire和空白字符。这样做的好处是,将有助于绕过查抄特定用户名是否已存在的盘问。
温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/pc/12513.html