2

作为 INSERT 语句的一部分,我有一个带有 SQL 注入的 Web 应用程序。它看起来像这样:

INSERT INTO table1 VALUES ('str1', 1, 'INJECTION HERE')

我可以插入常规的多查询注入,');truncate table1;--但由于使用了 Java + MySQL,它不允许堆叠多个查询,因此上述注入会导致 MySQL 出错,并且第二个查询永远不会执行。

所以基本上,在上述架构中,从这种注入中可以实现的所有目标似乎都是注入“垃圾数据”,这在没有注入的情况下也是可能的。

还有更多的技术,例如 using load_file(),但这仍然不允许我将数据库操作到我正在寻找的程度。

我在这里错过了什么吗?有没有其他方法可以使用这种注入来获得对数据库的控制?

4

3 回答 3

2

当然,如果您将数据库/驱动程序组合从当前实现更改为支持多个请求的实现,那么您将激活一个(毫无疑问)人们会忘记的休眠安全漏洞!

忽略邪恶的恶意场景,上面的内容会导致您插入常规数据时出现问题,包括引号字符等。即上面的内容根本不适用于特定的数据集(除非已清理/删除等)。出于功能目的,我会对其进行更正。

你应该看看PreparedStatement,以及这个(setString())的数据插入方法等。

例如:

   PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                     SET SALARY = ? WHERE ID = ?");
   pstmt.setBigDecimal(1, 153833.00)
   pstmt.setString(2, "Insert what you like here")

setString() 方法将支持任何字符串而不会出现转义/注入问题。

于 2009-07-12T10:30:07.353 回答
1

SQL 注入不必从数据库中删除某些内容。攻击者可能想要检索一些他不应该访问的有价值的数据。

例如,考虑下面的注入后形式(我不熟悉 MySQL 语法,但一般来说应该可以这样 - 根据需要添加强制转换):

INSERT INTO table1 VALUES ('str1', 1,
-- injected stuff --
'' || (SELECT valuable_info FROM admin_only_table WHERE id=1) || ''
-- end injected stuff --
))

现在table1- 例如,可以从其中检索一些可公开访问的信息,因此任何人都可以看到这些值 - 包含来自可能安全表的潜在敏感值admin_only_table

当然,这假设您的服务器不执行任何技巧,例如用户模拟或以其他方式限制查询的 SQL 级别权限,而是以完全权限执行它们。

于 2009-07-12T10:47:03.263 回答
0

正如这篇文章中所解释的,您的应用程序可能会发生比经典表更多的坏事DROP

  • 调用 sleep 函数,使您的所有数据库连接都处于忙碌状态,从而使您的应用程序不可用
  • 从数据库中提取敏感数据
  • 绕过用户认证

最重要的是,在构建 SQL 语句时,您永远不应该使用字符串连接。为此目的使用专用 API。

于 2016-11-08T14:54:36.933 回答