java - PostgreSQL 上的 SQL 注入(inject)

标签 java postgresql sql-injection

我的客户端 (android) 在用户表单中发送用户详细信息,我的 servlet 只是将这些详细信息输入到数据库 (postgre sql) 中。我试图通过在用户名字段中提供 ;DELETE FROM tbl_name; 来进行 sql 注入(inject)攻击。
但是postgresql只是把它当作一个值,作为用户名输入。我如何进行 SQLINjection 攻击。 (我没有在 postgre sql 或 servlet 中做过任何类型的检查)。
这是否意味着 postgresql 可以抵抗 SQLInjection 攻击?

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

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


用户名包含;DELETE FROM userdetail;
我也尝试了以下方法:

');DELETE FROM userdetail;

但它出现了以下错误:

org.postgresql.util.PSQLException: ERROR: unterminat
ed quoted string at or near "');"
  Position: 1



我也试过这个:

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


这会产生以下错误:

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

但不删除表的记录。如何让它删除表记录?

最佳答案

关键技巧是完整的语句字符串必须

  • 做一些创新
  • 仍然是有效的 SQL

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

但是这个字符串应该以一种“干净”的方式解决问题:

foo', '42', '42'); delete from userdetail; -- 

注意:结果字符串是这样的(换行只是为了更好阅读):

insert into userdetail(username,id,sno) values('foo', '42', '42'); 
delete from userdetail; 
-- ','21','21')

INSERT 部分是完整和正确的(当然假设没有唯一索引冲突)而且 DELETE 也是正确的。可能有问题的其余部分被尾随的 SQL 注释 -- 掩盖。

关于java - PostgreSQL 上的 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9734584/

相关文章:

xml - 在 postgresql 中使用 xml?

Java估计一个点的导数

sql - Postgresql Exclusive OR (XOR) CHECK CONSTRAINT,可能吗?

sql - 创建或替换触发器 postgres

php - 除了 SQL 注入(inject)和 XSS 攻击,还有什么我需要担心的吗?

hibernate - 是否可以在grails中进行sql注入(inject)

java - 从带有空格的文本文件中读取,然后放入 arrayList

java - 关于在 Java 中使用 ArrayList 的问题?

Java:跟踪用户登录 session - session EJB 与 HTTPSession

c# - 如何防止用户生成的 SQL 查询中的 SQL 注入(inject)