我的客户端 (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/