我有一个 Web 应用程序,其中包含 SQL 注入(inject)作为 INSERT 语句的一部分。它看起来像这样:
INSERT INTO table1 VALUES ('str1', 1, 'INJECTION HERE')
我可以插入常规的多查询注入(inject),例如 ');truncate table1;--
但由于使用 Java + MySQL,它不允许堆叠多个查询,因此上述注入(inject)会导致 MySQL 出错,并且第二个查询永远不会被执行。
所以基本上看来,在上述架构中通过这种注入(inject)所能实现的一切就是注入(inject)“垃圾数据”,这在没有注入(inject)的情况下也是可能的。
还有更多技术,例如使用 load_file()
,但这仍然不允许我将数据库操作到我想要的程度。
我在这里遗漏了什么吗?还有其他方法可以使用此注入(inject)来获得对数据库的控制吗?
最佳答案
当然,如果您将数据库/驱动程序组合从当前的实现更改为支持多个请求的组合,那么您将激活一个 hibernate 的安全漏洞(毫无疑问)人们会忘记这个漏洞!
忽略邪恶的恶意场景,上述内容将导致您在插入常规数据(包括引号字符等)时出现问题。即,上述内容对于特定数据集不起作用(除非经过清理/逃脱等)。我只是出于功能目的而更正它。
您应该看看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() 方法将支持任何字符串,而不会出现转义/注入(inject)问题。
关于java - 使用多个查询时 Java 和 MySQL 中的 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1115739/