近日,国家信息安全漏洞共享平台(CNVD)收录了WordPress WPDB SQL注入漏洞(CNVD-2017-32143)。远程攻击者利用该漏洞可造成SQL注入攻击,获取数据库敏感信息。漏洞的详细细节已公开,近期被不法分子利用进行大规模攻击尝试的可能性较大。
漏洞情况分析
WordPress是使用PHP语言和MySQL数据库开发的,世界上使用最广泛的博客系统,并逐步演化成一款内容管理软件。
2017年10月31日,WordPress官方发布了WordPress安全更新并修复了一处SQL注入漏洞,即$wpdb-prepare()函数可以创建无法预测且不安全的查询,从而导致潜在的SQL注入(SQLi),但WordPress核心并不容易直接受到该漏洞的影响。CNVD对上述漏洞的综合评级为“高危”。
漏洞影响范围
漏洞影响WordPress 4.8.2及之前版本。
漏洞修复建议
支持自动更新的用户可以通过点击后台的仪表盘更新到4.8.3版本,也可手动下载更新:https://wordpress.org/download/
参考链接:
如果你要把用户输入的数据输出到HTML上下文中,应该这样:
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
如果你要把用户输入的数据输出到JS上下文<script></script>中,应该这样:
echo json_encode($user_input, JSON_HEX_TAG|JSON_HEX_APOS|JSON_HEX_QUOT|JSON_HEX_AMP);
其中JSON编码要求使用UTF-8.
引用来自“eechen”的评论
$place_holders = implode(',', array_fill(0, count($ids), '?'));$sql = "SELECT * FROM `{$table}` WHERE `id` IN ({$place_holders})";
$stmt = $db->prepare($sql); // 预处理
$stmt->execute($ids); // 参数化查询
原生PDO预处理参数化查询就2句的事,为什么WordPress还会搞出SQL注入来么?
引用来自“绫小路清隆”的评论
用预处理就一定不会有注入问题德玛?有些数据库(如SQLite)不支持预处理,所以PHP也支持模拟预处理.
模拟预处理下,参数会被PHP转义,而正确转义的前提是指定了编码:
PDO: PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
MySQLi: $mysqli->set_charset('utf8');
引用来自“eechen”的评论
$place_holders = implode(',', array_fill(0, count($ids), '?'));$sql = "SELECT * FROM `{$table}` WHERE `id` IN ({$place_holders})";
$stmt = $db->prepare($sql); // 预处理
$stmt->execute($ids); // 参数化查询
原生PDO预处理参数化查询就2句的事,为什么WordPress还会搞出SQL注入来么?
$sql = "SELECT * FROM `{$table}` WHERE `id` IN ({$place_holders})";
$stmt = $db->prepare($sql); // 预处理
$stmt->execute($ids); // 参数化查询
原生PDO预处理参数化查询就2句的事,为什么WordPress还会搞出SQL注入来么?