Java PostgreSQL上的SQL注入

Java PostgreSQL上的SQL注入,java,postgresql,sql-injection,Java,Postgresql,Sql Injection,我的clienet(android)在用户表单中发送用户详细信息,而我的servlet只是将这些详细信息输入数据库(postgresql)。我试图通过给出来进行sql注入攻击;从tbl_名称中删除。 但postgresql只是将其视为一个值,并将其作为用户名输入。如何进行SQLINjection攻击。(我没有在postgresql或servlet中进行任何类型的检查)。这是否意味着postgresql能够抵抗SQLInjection攻击 我使用以下语句插入数据: String insert ="

我的clienet(android)在用户表单中发送用户详细信息,而我的servlet只是将这些详细信息输入数据库(postgresql)。我试图通过给出
来进行sql注入攻击;从tbl_名称中删除
但postgresql只是将其视为一个值,并将其作为用户名输入。如何进行SQLINjection攻击。(我没有在postgresql或servlet中进行任何类型的检查)。
这是否意味着postgresql能够抵抗SQLInjection攻击

我使用以下语句插入数据:

String insert ="insert into userdetail(username,id,sno) values('"+username+"','"+userid+"','"+no+"')";
                   Statement stmt = conn.createStatement();
                    stmt.executeUpdate(insert);

用户名包含
;从userdetail中删除
我还尝试了以下方法:

');DELETE FROM userdetail;
但它有以下五个错误:

org.postgresql.util.PSQLException: ERROR: unterminat
ed quoted string at or near "');"
  Position: 1
17:36:46,828 INFO  [STDOUT] org.postgresql.util.PSQLException: ERROR: unterminat
ed quoted string at or near "''');"
  Position: 38


我也试过:

','',');DELETE FROM userdetail;

这会产生以下错误:

org.postgresql.util.PSQLException: ERROR: unterminat
ed quoted string at or near "');"
  Position: 1
17:36:46,828 INFO  [STDOUT] org.postgresql.util.PSQLException: ERROR: unterminat
ed quoted string at or near "''');"
  Position: 38
但不删除表的记录。如何使其删除表记录?

您所描述的攻击类型-即使使用单引号“正确”-对PostgreSQL也不起作用 它不起作用,因为JDBC驱动程序不允许在一个
语句中运行多个语句。execute()
调用。 它将抛出一个错误(“无效字符”指向;)
(抱歉,这仅适用于Oracle)

还有其他一些场景可以处理编写糟糕的应用程序

假设应用程序像这样检查用户名/密码(请注意,这是一个非常简化的示例!)

然后,可能的攻击可能是输入值:

' or 1=1 or '' = '
进入密码字段

这将导致生成以下SQL

SELECT count(*) FROM users WHERE username = 'arthur' 
AND password = '' or 1=1 or ''=''
这将始终是正确的,并且可以不使用密码登录。

尝试
,“”,”;从tbl_名称中删除
删除您的表

在最简单的情况下,您可以将
作为用户名,并且您的服务器应该会给您一个错误


此外,没有抗SQL注入的数据库,因为SQL注入的发生是由于服务器端(CGI)脚本编码不好,而不是因为数据库的弱点。

关键在于必须确保完整的语句字符串

  • 创新
  • SQL仍然有效
到目前为止,答案省略了第二部分。但是无效的SQL语句将中止事务,因此很可能什么也不做。如果将
autoCommit
设置为
true
,则攻击可能更容易

但是这个字符串应该以一种“干净”的方式与技巧相关联:

注意:结果字符串如下(换行仅用于更好的阅读):


INSERT
部分是完整和正确的(当然假设没有唯一的索引冲突),而且
DELETE
也是正确的。后面的SQL注释
--

Postgresql不支持SQLInjection,您可能没有正确使用单引号(')。您能告诉我您正在尝试的字符串和它正在生成的查询插入到database@habib.osu:我已编辑了我的问题。您可以在jdbc中编辑多条语句。我的应用程序要求将userdetails插入到两个表中。我通过使用单个executeUpdate语句来实现这一点。作为参数传递给executeUpdate语句的内部字符串包含两个以“;”分隔的insert语句@用户1139023:嗯,很有趣。我敢肯定,我在博士后身上看到过这种失败。但也许这毕竟是甲骨文。谢谢你的提示。我会试试看,然后告诉你。我的应用程序中的任何字段都不允许使用逗号。我可以去掉逗号并试一下吗?实际上,你可以。但请注意,服务器可能会给出一个错误,即您的INSERT语句无效,它引用了成功的SQL注入。我尝试了“”);从userdetail;中删除。它仍然将其作为值并插入“”);从userdetail中删除;作为用户名。不应该是“,”);从tbl_名称中删除;括号前还有一个单引号。因为表中有三列。SQL注释起了作用。如果没有给出注释,则给出未终止的引号字符串错误。@user1139023:SQL注释确实是“保持SQL有效”中的中心点。
insert into userdetail(username,id,sno) values('foo', '42', '42'); 
delete from userdetail; 
-- ','21','21')