SQL 注入繞過 mysql_real_escape_string()
儘管人們普遍認為使用 mysql_real_escape_string() 足以防止 SQL注入,但確實存在可以繞過此防禦的情況.
攻擊Vector
此類攻擊涉及特定條件的組合:
- 使用易受攻擊的字元編碼(例如gbk、cp932)
- 錯誤設定連接字元集在客戶端
- 利用邊緣情況,其中無效的多位元組字元被視為單一位元組轉義
攻擊過程
- 建立資料庫連線並將伺服器的字元編碼設定為易受攻擊的編碼(例如「SET NAMES gbk”)。
- 建構一個包含無效多位元組字元序列的有效負載,這將導致其被誤解為單一位元組('xbfx27 OR 1=1 /*')。
- 使用 mysql_real_escape_string() 「轉義」有效負載,這會在撇號前錯誤地插入反斜線。
- 使用以下命令執行 SQL 查詢逃逸的有效負載,有效地繞過了預期的保護。
易受攻擊場景
此攻擊在以下場景中尤其令人擔憂:
- 使用4.1.20、5.0.22 或5.1. 11 之前的MySQL 版本
- 模擬之前的PDO版本中準備好的語句5.3.6
緩解策略
要緩解此漏洞,至關重要的是:
- 使用MySQL 5.1 及更高版本
- 使用mysql_set_charset()正確設定連接字元集或等效
- 在5.3.6 之前的PDO 版本中停用模擬預備語句
- 考慮使用不易受攻擊的字元編碼,例如utf8mb4或utf8
結論
雖然mysql_real_escape_string() 提供了針對 SQL 的基本保護注射,也不是萬無一失的。理解和解決潛在的繞過機制對於確保資料庫應用程式的安全至關重要。
以上是mysql_real_escape_string() 可以被繞過嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!