如何演示 SQL 注入?

信息安全 php 攻击 应用安全 sql注入
2021-09-07 19:45:13

我的 PHP/MySQL 代码中有如下几行:

...
$sqlquery = "SELECT price FROM products WHERE 1=1 AND id=".$_POST['id'];
...
... query is executed
...
echo $price;

作为测试/演示,如果我有一个表用户,我怎么能颠覆它来显示用户密码之类的东西:

id | username | password
------------------------
 1 |  abcde   | qwerty

或者,我还能让系统显示什么?

3个回答

我假设您使用标准 PHPmysql_query函数,在这种情况下,这样的事情在您的示例中会很有效。

SELECT price FROM products WHERE 1=1 AND id=
999999999999999999999999 
UNION ALL 
(SELECT CONCAT(username, ' ', password) FROM user) limit 0, 1;

解释

  1. 使用不会存在的产品的 ID。
  2. UNION 与用户表。
  3. 选择用户表中的单列返回,因为您只从产品中返回单列。在这种情况下,返回用户名和密码列的连接字段。
  4. 限制为 1。因为您的代码可能只期望查询查询的单个结果。您也可以使用 WHERE 条件来指定要检索的特定用户。

另一个示例是使用group_concat它允许在单个查询中从用户表中检索所有条目。灵感来自此处另一个问题的答案

SELECT price FROM products WHERE 1=1 AND id=-1 
UNION ALL 
(SELECT CONCAT(GROUP_CONCAT(username), '\n', GROUP_CONCAT(password)) FROM user);

涵盖 SQL 注入攻击的其他资源:

对于你的最后一个问题:

或者,我还能让系统显示什么?

通常,这取决于 SQL Server 的配置方式以及是否存在一些缓解措施。但攻击者可能不仅会显示用户密码,还可以尝试:

  • 读取和写入各种文件;
  • 写入数据库并从中读取;
  • 进行 DoS 和其他有害行为;

每个操作都取决于几个因素,比如我所说的 - 缓解因素的存在、文件权限、系统配置等。

顺便说一句,对于攻击者来说,不需要显示 SQL 请求的结果。在攻击者无法查看响应的情况下,它会使信息提取过程变得更慢和更难,但并非不可能。

如果您对此感兴趣,建议您阅读 sqlmap 的创建者 Bernardo Damele 的博客:http: //bernardodamele.blogspot.com/有关于可以做什么和如何做的有趣的演示和阅读。

xkcd 上有一个名为“Exploits of a Mom”的经典示例,在您的示例中可能几乎可以正常工作。想法是将如下字符串作为 id 发布,以便您的代码将其读取为 $_POST['id']:

-1; 从用户中选择 *;

假设当您将查询传递给数据库时,它在分号处分成多个语句,这是您的数据库看到的结果:

从 1=1 且 id=-1 的产品中选择价格;

从用户中选择 *;

您的攻击者已设法列出整个用户数据库。这样,可以执行任意数据库命令。

由于您的代码可能会处理查询结果并在网页上显示一些结果,因此攻击者可以删除内容、伪造数据,甚至从您的数据库中窥探信息,并可能使用它来修改它。这可能包括劫持帐户,或者,如果您的数据库和服务器设计允许,则在不执行付款的情况下下订单。