特定情況下繞過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中文網其他相關文章!