Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多个查询时Java和MySQL中的SQL注入_Java_Sql_Mysql_Security_Sql Injection - Fatal编程技术网

使用多个查询时Java和MySQL中的SQL注入

使用多个查询时Java和MySQL中的SQL注入,java,sql,mysql,security,sql-injection,Java,Sql,Mysql,Security,Sql Injection,我有一个web应用程序,其中SQL注入作为INSERT语句的一部分。看起来是这样的: INSERT INTO table1 VALUES ('str1', 1, 'INJECTION HERE') 我可以插入常规的多个查询注入,例如”;截断表1--但由于使用Java+MySQL,它不允许堆叠多个查询,因此上述注入将导致MySQL出错,并且第二个查询永远不会执行 因此,基本上,在上述体系结构中,通过这种注入可以实现的所有功能都是注入“垃圾数据”,这在没有注入的情况下也是可能的 还有更多的技术,比

我有一个web应用程序,其中SQL注入作为INSERT语句的一部分。看起来是这样的:

INSERT INTO table1 VALUES ('str1', 1, 'INJECTION HERE')
我可以插入常规的多个查询注入,例如
”;截断表1--
但由于使用Java+MySQL,它不允许堆叠多个查询,因此上述注入将导致MySQL出错,并且第二个查询永远不会执行

因此,基本上,在上述体系结构中,通过这种注入可以实现的所有功能都是注入“垃圾数据”,这在没有注入的情况下也是可能的

还有更多的技术,比如使用
load\u file()
,但这仍然不允许我操作数据库到我想要的程度


我是不是遗漏了什么?是否有其他方法可以使用此注入来获得对数据库的控制?

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

忽略邪恶的恶意场景,上述操作将导致插入常规数据时出现问题,包括引号字符等。也就是说,上述操作对特定数据集不起作用(除非已清除/esaped等)。我只会出于功能性目的对其进行更正

您应该看看,以及这个()的数据插入方法等等

e、 g:


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

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

例如,考虑下面的后注册表形式(我不熟悉MySQL语法,但类似的东西应该是可能的——根据需要添加注册表):

现在,
table1
——比如说,可以从中检索一些公开可访问的信息,以便任何人都可以看到这些值——包含一个可能安全的表
admin\u only\u表中的潜在敏感值

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

如中所述,与经典的表
DROP
相比,应用程序可能会发生更多的不好的事情:

  • 调用sleep函数,使所有数据库连接都处于繁忙状态,从而使应用程序不可用
  • 从数据库中提取敏感数据
总之,在构建SQL语句时,不应该使用字符串连接。为此,请使用专用API

   PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                     SET SALARY = ? WHERE ID = ?");
   pstmt.setBigDecimal(1, 153833.00)
   pstmt.setString(2, "Insert what you like here")
INSERT INTO table1 VALUES ('str1', 1,
-- injected stuff --
'' || (SELECT valuable_info FROM admin_only_table WHERE id=1) || ''
-- end injected stuff --
))