我有与SQL注入作为INSERT语句的一部分,一个Web应用程序。 它看起来像这样:
INSERT INTO table1 VALUES ('str1', 1, 'INJECTION HERE')
我可以插入普通的多查询注射如');truncate table1;--
但由于是Java的+ MySQL的使用它不允许堆叠多个查询,所以上面的注入将导致从MySQL和错误的事实第二个查询永远不会被执行。
因此,基本上似乎所有人们可以从在上述架构这种注射达到被注射的“垃圾数据”,这是可能的,而不注入为好。
还有更多的技术,例如使用load_file()
但是这仍然不能让我来操作数据库,以我在寻找的程度。
我失去了一些东西在这里? 有没有使用这种注射在数据库获得控制一些其他的方式?
当然,如果你从当前实现的东西支持多个请求更改数据库/驱动器组合,那么你就会激活(毫无疑问)的人会忘记关于休眠安全漏洞!
无视恶毒的,恶意的情况下,上述将导致您的问题将常规数据,其中包括引号字符等即上面根本不会对特定的数据集工作 (除非洁净/ 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()方法将支持任何字符串没有逃逸/注射的问题。
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级用户假冒或者以其他方式限制权限,而是拥有完全权限执行它们。
正如在解释这个帖子 ,有更多不好的事情可能发生在你的应用程序比传统的表DROP
:
- 调用睡眠功能,使您所有的数据库连接会很忙,所以让你的应用程序无法使用
- 从DB中提取的敏感数据
- 绕过用户认证
底线,构建SQL语句时,你不应该使用字符串连接。 使用专用API用于这一目的。