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
构造,攻击者可能会尝试将整个查询附加到原始查询中,以从任意表中列出密码。强烈建议仅存储密码的安全散列值,而不是密码本身。