特定情况下绕过mysql_real_escape_string()
的SQL注入
尽管普遍认为mysql_real_escape_string()
可以消除SQL注入漏洞,但在某些特殊情况下,它仍然可能被绕过。
漏洞分析
在某些场景下,攻击者可以利用mysql_real_escape_string()
的一个缺陷,该缺陷发生在数据库连接的字符集被选择为同时支持ASCII字符'和的字符集时(例如,gbk,sjks)。
攻击者可以构造一个包含无效多字节字符序列(例如,xbfx27)的有效载荷,当通过mysql_real_escape_string()
处理时,结果会得到一个未转义的'字符。因此,当将其插入查询时,会导致SQL注入。
示例
考虑以下PHP代码:
<code class="language-php">$login = mysql_real_escape_string($_POST['login']); $password = mysql_real_escape_string($_POST['password']); $sql = "SELECT * FROM table WHERE login='$login' AND password='$password'";</code>
如果攻击者将$_POST['login']
的值设置为\xbf\x27 OR 1=1 /*
,他们就可以绕过mysql_real_escape_string()
的保护,并检索表中的所有行。
缓解措施
为了减轻此漏洞,务必:
mysql_set_charset()
或PDO的DSN字符集参数显式设置数据库连接的字符集。以上是在特定字符集条件下,SQL注入可以绕过`mysql_real_escape_string()`吗?的详细内容。更多信息请关注PHP中文网其他相关文章!