Как заставить SQL Injection на INSERT работать на SQLite - PullRequest
1 голос
/ 08 июля 2020

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

У меня есть «database.db» с двумя таблицами: «feedback» и «users». В таблице отзывов есть 1 столбец: сообщение. В таблице пользователей 2 столбца: имя пользователя и пароль.

def send_feedback(feedback):
    conn = sqlite3.connect("database.db")
    curs = conn.cursor()
    curs.execute("INSERT INTO feedback VALUES ('%s')" % (feedback))
    print(curs.fetchall())
    conn.close()

Я знаю, что функция выполнения позволяет мне сделать один запрос к базе данных, поэтому я не могу использовать ";" для выполнения нескольких запросов.

Я пробовал сделать строку так:

a') SELECT password FROM users --
feedback = "INSERT INTO feedback VALUES ('a') SELECT password FROM users --')"

Но это дает мне следующую ошибку:

sqlite3.OperationalError: рядом с «SELECT»: синтаксическая ошибка

Итак, я попытался использовать команду UNION:

a') UNION SELECT password FROM users --  
feedback = "INSERT INTO feedback VALUES ('a') UNION SELECT password FROM users --')"

Эта команда работает, но функция fetchall возвращает пустой список.

1 Ответ

1 голос
/ 10 июля 2020

Большинство SQL инъекций не дают ничего полезного для злоумышленника, только синтаксическая ошибка.

Например, передайте строку «Я не удовлетворен» этой функции обратной связи и дополнительным Символ ' приведет к несбалансированности кавычек, что приведет к ошибке, в результате чего INSERT завершится ошибкой.

sqlite3.OperationalError: рядом с «m»: синтаксическая ошибка

Технически это SQL инъекция. Содержимое, интерполированное в запрос, повлияло на синтаксис оператора SQL. Вот и все. Это не обязательно приведет к успешному проникновению типа «Миссия: невыполнима».

Ethan Hunt perpetrating an SQL injection

I can't think of a way to exploit the INSERT statement you show to make it do something clever, besides causing an error.

You can't change an INSERT into a SELECT that produces a result set. Even if you try to inject a semicolon followed by a second SQL query, you just get sqlite3.Предупреждение: вы можете выполнять только одну инструкцию за раз

Ваша первая попытка, описанная выше, привела к синтаксической ошибке, потому что в качестве источника данных для вставки использовались и предложение VALUES, и SELECT. Вы можете использовать любой из них, но не оба в синтаксисе SQL. См. https://www.sqlite.org/lang_insert.html

Вероятно, вы уже знаете, как сделать код безопасным, поэтому небезопасный контент не может даже вызвать синтаксическую ошибку. Но я добавлю его для других читателей:

curs.execute("INSERT INTO feedback VALUES (?)", (feedback,))
...