Очень базовая c SQL проблема с инъекцией из моего экзамена - сработает ли мое "странное" решение? - PullRequest
1 голос
/ 29 февраля 2020

(я не являюсь носителем английского языка sh, прошу прощения за ошибки).

Ему был дан код Java, который должен был создать простой запрос SQL. Задача состояла в том, чтобы дать строковые аргументы двум параметрам username и password, чтобы удалить user_table.

ПРИМЕЧАНИЕ: мы не получили код SQL, поэтому не беспокойтесь о точном синтаксисе SQL. Это не имеет значения.

Я не могу вспомнить точный код, но он был очень похож на это:

function(String username, String password)
{
    String sql = "SELECT * FROM user_table WHERE id =" + username + "AND pw =" + password;
    //invoke the SQL query with this String
}

Теперь лучшим решением здесь, вероятно, было бы:

username = "Oscar"
password = "123; DROP TABLE user_table"

Но вот что я написал:

username = "Oscar; DROP TABLE user_table; 1=1"
password = "123"

Проблема, которую я вижу со своим решением, состоит в том, что самой последней командой SQL будет 1=1 AND pw = 123, которая является просто логическим значением Выражение в коде ничего не делает. Он не назначен ни для чего или служит для чего-либо условием.

Не приведет ли это к ошибке во время выполнения? И если да, будут ли выполняться предыдущие команды?

Ответы [ 2 ]

3 голосов
/ 29 февраля 2020

Для начала этот код:

String sql = 
    "SELECT * FROM user_table WHERE id =" + username + "AND pw =" + password;

Создает недопустимый запрос:

  • id и pw являются предположительно строками, поэтому значения переданные символы должны быть заключены в одинарные кавычки

  • перед ключевым словом and

пропущен пробел:

String sql = 
    "SELECT * FROM user_table WHERE id = '" + username + "' AND pw ='" + password + "'";

Теперь, когда дело доходит до упражнения, вы можете просто поиграть с pw, чтобы добавить оператор delete после SELECT (все еще генерируя действительное SQL для SELECT). Если код приложения позволяет выполнять более одного запроса одновременно, второй оператор будет выполняться после первого.

Так, например, это:

id: "foo"
pw: "bar'; DROP TABLE user_table; --"

будет объединено как:

SELECT * FROM user_table 
WHERE id = 'foo' AND pw ='bar'; DROP TABLE user_table; --'

Обратите внимание, что маркер последнего комментария экранируется от последней цитаты. Это допустимо SQL и фактически удалит таблицу.

Мораль: используйте параметры запроса.

String sql = 
    "SELECT * FROM user_table WHERE id = :id AND pw = :pwd";
0 голосов
/ 01 марта 2020

"SELECT * FROM user_table WHERE id =" + username + "AND pw =" + пароль;

username = "Oscar; DROP TABLE user_table; 1 = 1"

password = «123»

Теперь, если вы замените их вручную, вы получите:

SELECT * FROM user_table WHERE id = Oscar; DROP TABLE user_table; 1 = 1 И pw = 123

Это приведет к синтаксической ошибке SQL. Если вы хотите быть умным, вы можете добавить «-» в конце имени пользователя «Oscar; DROP TABLE user_table; 1 = 1--», что прокомментирует остальную часть запроса, и внедрение станет действительным.

...