Получить ResultSet SQL-инъекции - PullRequest
0 голосов
/ 12 мая 2018

Предположим, что код на стороне сервера выглядит примерно так:

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).

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 13 мая 2018

Вы, вероятно, не можете достичь этого.

Как вы знаете, оператор INSERT не имеет набора результатов, даже если вы используете SQL-инъекцию.В лучшем случае вы можете заставить его выполнить SELECT как скалярный подзапрос.Нетрудно подделать ваш пример, чтобы выполнить следующее:

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

Но это все равно не вернет набор результатов, потому что INSERT никогда не имеет набора результатов.

Для этого вам потребуется выполнить второй запрос.Некоторые интерфейсы запросов поддерживают множественные запросы в одном вызове doQuery (), но это не всегда так (зависит от используемой вами базы данных и, возможно, некоторых параметров конфигурации).

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

СВнедрение SQL, вы можете манипулировать SQL, но вы не можете манипулировать остальным кодом в приложении, которое запускает SQL.В приведенном вами примере приложение предназначено для выполнения запроса INSERT, а не INSERT, за которым следует SELECT.У приложения не будет причин извлекать результирующий набор после выполнения INSERT.

Трудно представить, как можно использовать только SQL-инъекцию, чтобы обмануть код, который вы показываете, при извлечении и отображении набора результатов.

Я не думаю, что можно использовать SQL-инъекцию для чтения данных, используя запрос без чтения.

...