MySQL 绕过 mysql_real_escape_string()的SQL注入攻击
MySQL是一款常用的关系型数据库管理系统。SQL注入攻击是一种广泛存在的安全风险,而MySQL服务器内置的mysql_real_escape_string()函数能够过滤掉SQL注入的攻击。但是,有些攻手法可以绕过这个过滤函数,从而实现SQL注入攻击。
例如,考虑如下的代码片段:
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
请注意,在这个代码片段中,我们使用mysql_real_escape_string()函数对用户输入进行了过滤,这应该可以阻止大多数SQL注入攻击。但是,还有一些策略可以绕过这个过滤器。
以下是一些可用于绕过mysql_real_escape_string()函数的SQL注入攻击策略:
阅读更多:MySQL 教程
使用单引号绕过mysql_real_escape_string()
即使使用mysql_real_escape_string()函数进行过滤,仍可以使用单引号进行SQL注入。例如:
$username = "admin' --";
$password = mysql_real_escape_string($_POST['password']);
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
在这个例子中,输入的用户名变为了“admin’ –”,其中两个破折号(–)表示注释。这将使查询从’admin’后的所有内容变为注释,从而使查询忽略了密码部分。
可以通过以下查询注入来测试:
' OR 1=1; --
这个查询将返回所有用户记录,因为它不仅包含管理员的名称,还包含始终为true的另一个条件。
使用%00空字节绕过mysql_real_escape_string()
通过使用带有空字节的字符串,攻击者可以欺骗mysql_real_escape_string()函数,从而绕过SQL注入保护。例如:
$username = "admin%00";
$password = mysql_real_escape_string($_POST['password']);
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
在这个例子中,输入的用户名将被截断为“admin”,mysql_real_escape_string()将不会对这个字符串进行正确的转义处理。
可以通过以下查询注入来测试:
' OR 1=1; %00
这个查询将返回所有用户记录,因为攻击者使用%00空字节终止了用户名,从而使查询忽略了密码部分。
总结
SQL注入攻击是常见的Web应用程序攻击之一,可以在不知情的情况下给黑客提供访问受害者敏感数据的通道。MySQL服务器内置的mysql_real_escape_string()函数可以过滤掉大多数SQL注入攻击,但是攻击者可以使用一些技巧来绕过这个过滤函数,从而实现SQL注入攻击。为了保护Web应用程序免受SQL注入攻击,开发人员应该使用预编译语句或轻松可读的查询构造器。另外,MySQL 5.7.8之后的版本开始提供了一个名为“mysqlnd”的MySQL扩展,它提供了一个名为“PDO_MYSQL”的PDO驱动程序,它已经被证明是比mysql_real_escape_string()更安全和更可靠的解决方案。
极客笔记