获取 SQL 注入的结果集

Get the ResultSet of an SQL injection

假设服务器端代码是这样的:

String id = getIdFromHttpRequest();
String value = getValueFromHttpRequest();

ResultSet rs = new ResultSet();
String query = "INSERT INTO users VALUES ('" + id + "', '" + value + "');"
rs = SQL.doQuery(query); // i know it's not the syntax, but the point is clear

嗯,注入很简单,我可以让它执行一个SQL命令,但问题是我想看结果集(我注入SELECT命令)。

有办法吗?

你可能无法做到这一点。

如您所知,INSERT 语句没有结果集,即使您使用 SQL 注入。充其量,您可以让它执行 SELECT 作为标量子查询。欺骗您的示例以执行以下操作并不难:

INSERT INTO users VALUES ('8675309', '' || (SELECT ...blah blah...) || '');

但是那仍然不会 return 结果集,因为 INSERT 从来没有结果集。

您需要执行第二个查询才能执行此操作。一些查询接口确实支持在对 doQuery() 的单个调用中进行多查询,但这并不总是正确的(取决于您使用的数据库品牌,可能还有一些配置选项)。

INSERT INTO users VALUES (...whatever...);
SELECT * FROM secure_table WHERE (id = '8675309');

使用 SQL 注入,您可以操纵 SQL,但不能操纵 运行 应用程序中 SQL 的其余代码.在您展示的示例中,该应用程序旨在 运行 INSERT 查询,而不是 INSERT 后跟 SELECT。应用程序没有理由在执行 INSERT 后获取结果集。

很难想象您如何单独使用 SQL 注入来欺骗您显示的代码来获取和显示结果集。

我认为不可能使用 SQL 注入通过利用非读取查询来读取数据。