简介
在数据交互中,前端的数据传入到后台处理时,由于后端没有没有做过滤或过滤不严,则会导致其传入的恶意“数据”拼接到SQL语句中,被当作SQL语句的一部分执行。漏洞产生于脚本,注入是针对数据库进行。
利用条件:
- 参数用户可控:从前端传给后端的参数内容是用户可以控制的。
- 参数带入数据库查询:传入的参数拼接到 SQL 语句,且带入数据库查询。
检索关键词
在 PHP 代码审计中,为了定位潜在的 SQL 注入漏洞,可以检索一些特定的关键词和代码模式。以下是一些常用的关键词和代码模式,它们可能表明存在 SQL 注入的风险:
直接拼接 SQL 语句:
- . 或 .=:用于字符串拼接的运算符,可能表明 SQL 语句是直接拼接的。
- mysql_query:这是一个过时的 MySQL 函数,它不提供参数绑定,容易导致 SQL 注入。
- $db->query 或 $db->exec:这些是数据库抽象层(如 PDO 或 MySQLi)的方法,如果没有使用参数绑定,也可能导致 SQL 注入。
未转义的用户输入:
- $_GET、$_POST、$_REQUEST、$_COOKIE:这些超级全局变量直接包含用户输入,如果没有经过适当的处理,可能会导致 SQL 注入。
- $_SERVER 中的某些变量(如 $_SERVER['PHP_SELF'])也可能包含用户输入,需要谨慎处理。
未使用预处理语句:
- 缺少 prepare 和 bindParam 或 bindValue:这些是预处理语句的关键方法,如果代码中没有使用它们,可能存在 SQL 注入风险。
未验证的用户输入:
- 缺少输入验证或过滤函数,如 filter_input、filter_var、preg_match 等。
特定 SQL 函数和操作符:
- SELECT、INSERT、UPDATE、DELETE:这些是 SQL 查询的关键词,如果它们后面直接跟用户输入,可能存在风险。
- LIKE:在使用 LIKE 进行模糊查询时,如果没有正确处理通配符,也可能导致 SQL 注入。
数据库连接和查询函数:
- mysqli_query、PDO::query:这些函数用于执行 SQL 查询,如果没有使用参数绑定,可能存在风险。
- mysqli_real_escape_string、PDO::quote:这些函数用于转义字符串,但它们不是防止 SQL 注入的最佳方法,因为它们不能防止所有类型的注入。
动态构建 SQL 语句:
- if 、switch 等条件语句中动态构建 SQL 语句,如果没有正确处理用户输入,可能存在风险。
错误处理:
- 如果代码中有显示数据库错误信息的逻辑,这可能会帮助攻击者发现注入点。
无过滤
数字型
$user_id = $_GET['id']; // 用户输入的 ID
$sql = "SELECT * FROM users WHERE id = $user_id";
$result = mysqli_query($conn, $sql);
字符型
$user_id = $_GET['id']; // 用户输入的 ID
$sql = "SELECT * FROM users WHERE id = '$user_id'";
$result = mysqli_query($conn, $sql);
搜索型
$search_term = $_GET['search']; // 用户输入的搜索关键字
$sql = "SELECT * FROM products WHERE name LIKE '%$search_term%'";
$result = mysqli_query($conn, $sql);
存在过滤或过滤不严谨
magic_quotes_gpc
magic_quotes_gpc 是 PHP 早期版本中的一个配置选项,用于自动对从 GET、POST 和 COOKIE 中获取的数据进行转义,以防止 SQL 注入和跨站脚本攻击等安全问题。
当 magic_quotes_gpc 被启用时( magic_quotes_gpc = On),PHP 会自动在 GET、POST 和 COOKIE 数据中的单引号(')、双引号(")、反斜杠(\)和 NULL 字符前添加反斜杠(\),以转义这些特殊字符。
例如:
如果用户提交了一个包含单引号的字符串 A'pple
那么 PHP 会自动将其转换为 A\'pple
配置选项文件名:php.ini

然而,magic_quotes_gpc 在 PHP 5.4.0 版本中已经被废弃,并在 PHP 7.0.0 版本中被移除。
这是因为 magic_quotes_gpc 存在一些问题,例如:
- 它可能会破坏数据的完整性,因为它会自动对数据进行转义,而有时我们并不需要这样做。
- 它可能会导致安全问题,因为它只是简单地对特殊字符进行转义,而没有对数据进行严格的验证和过滤。
- 它可能会导致性能问题,因为它会对所有的 GET、POST 和 COOKIE 数据进行转义,而不管这些数据是否需要转义。
在日常程序的开发过程中,都会对其magic_quotes_gpc是否开启,进行判断,如果没有开启,则使用所设置的过滤函数,常会使用addslashes函数对其传入的参数值进行过滤,降低SQL注入产生的风险。
常见过滤函数
addslashes():将特殊字符(单引号、双引号、反斜杠和 NULL 字符)前添加反斜杠。
htmlspecialchars():<

最低0.47元/天 解锁文章
389

被折叠的 条评论
为什么被折叠?



