使用多个查询时,Java和MySQL的SQL注入(SQL Injection in Java and

2019-06-25 16:50发布

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

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

我可以插入普通的多查询注射如');truncate table1;--但由于是Java的+ MySQL的使用它不允许堆叠多个查询,所以上面的注入将导致从MySQL和错误的事实第二个查询永远不会被执行。

因此,基本上似乎所有人们可以从在上述架构这种注射达到被注射的“垃圾数据”,这是可能的,而不注入为好。

还有更多的技术,例如使用load_file()但是这仍然不能让我来操作数据库,以我在寻找的程度。

我失去了一些东西在这里? 有没有使用这种注射在数据库获得控制一些其他的方式?

Answer 1:

当然,如果你从当前实现的东西支持多个请求更改数据库/驱动器组合,那么你就会激活(毫无疑问)的人会忘记关于休眠安全漏洞!

无视恶毒的,恶意的情况下,上述将导致您的问题将常规数据,其中包括引号字符等即上面根本不会对特定的数据集工作 (除非洁净/ esaped等)。 我只想纠正它的功能用途。

你应该看看的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()方法将支持任何字符串没有逃逸/注射的问题。



Answer 2:

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级用户假冒或者以其他方式限制权限,而是拥有完全权限执行它们。



Answer 3:

正如在解释这个帖子 ,有更多不好的事情可能发生在你的应用程序比传统的表DROP

  • 调用睡眠功能,使您所有的数据库连接会很忙,所以让你的应用程序无法使用
  • 从DB中提取的敏感数据
  • 绕过用户认证

底线,构建SQL语句时,你不应该使用字符串连接。 使用专用API用于这一目的。



文章来源: SQL Injection in Java and MySQL when using multiple queries