sql注入

SQL 注入是一种攻击技术,攻击者利用应用程序代码中构建动态 SQL 查询的缺陷。攻击者可以访问应用程序的特权部分,从数据库检索所有信息,篡改现有数据,甚至在数据库主机上执行危险的系统级命令。当开发人员在他们的 SQL 语句中连接或插入任意输入时,这种漏洞就会发生。

示例 #1 将结果集切割成页面……并创建超级用户(PostgreSQL)。

在下面的示例中,用户输入直接插入到 SQL 查询中,使得攻击者能够在数据库中获得超级用户账户。


$offset
= $_GET['offset']; // 注意,没有输入验证!
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
$result = pg_query($conn, $query);

?>

普通用户会点击“上一页”、“下一页”,$offset 已经编码到 URL 的链接。脚本期望传入的 $offset 是数字。然而,如果有人尝试把以下语句追加入 URL 中的话:

0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
    select 'crack', usesysid, 't','t','crack'
    from pg_shadow where usename='postgres';
--

如果发生,脚本将向攻击者提供超级用户访问权限。注意那个 0; 是为了向原始查询提供有效的偏移量并终止。

注意:

这是常见的技术,使用 SQL 中的注释符号 --,强制 SQL 解析器忽略开发者编写的查询的其余部分。

获取密码的一种可行方式是欺骗搜索结果页面。攻击者只需查看是否有已提交的未经适当处理变量在 SQL 语句中使用。这些过滤器通常可以在先前的表单中设置,以定制 SELECT 语句中的 WHERE、ORDER BY、LIMIT 和 OFFSET 子句。如果数据库支持 UNION 构造,攻击者可能会尝试将整个查询附加到原始查询中,以从任意表中列出密码。强烈建议仅存储密码的安全散列值,而不是密码本身。

共 1 页 1 条数据