使用多个查询时Java和MySQL中的SQL注入
我有一个web应用程序,其中SQL注入作为INSERT语句的一部分。看起来是这样的:使用多个查询时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出错,并且第二个查询永远不会执行 因此,基本上,在上述体系结构中,通过这种注入可以实现的所有功能都是注入“垃圾数据”,这在没有注入的情况下也是可能的 还有更多的技术,比
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 --
))