SQL-инъекция на INSERT - PullRequest
       345

SQL-инъекция на INSERT

3 голосов
/ 22 июля 2011

SQL-инъекция на INSERT, как описано здесь, похоже, не работает с MySQL. SQL-инъекция на INSERT

Когда я использую это утверждение:

INSERT INTO COMMENTS VALUES('122','$_GET[value1]');

При этом в качестве значения переменной 'value1':

'); DELETE FROM users; --

Возвращается эта ошибка:

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELETE FROM users; --')' at line 1

Что не так ???

PS: Кто-то предложил мне сделать SQL-инъекцию со значением переменной:

',(SELECT group_concat(table_name) FROM information_schema.tables INTO OUTFILE '/var/www/tables.txt'))-- -

Но это тоже не сработало и вернуло синтаксическую ошибку.

Ответы [ 2 ]

3 голосов
/ 22 июля 2011

Внедрение превращает один оператор SQL (INSERT ...) в несколько операторов SQL (INSERT ...; DELETE ...).

Однако PHP mysql API не поддерживает несколько операторов водин запрос(Базовый API MySQL C должен явно указываться для поддержки этой функции , чего не делают ваши привязки.)

2 голосов
/ 22 июля 2011

Как указывает @pilcrow, mysql_query будет принимать только одно утверждение.Ваш пример на самом деле состоит из двух операторов:

INSERT INTO COMMENTS VALUES('122','value');

и:

DELETE FROM users;

API PHP mysql немедленно отклонит это, поэтому вы не можете использовать это для проверки внедрения SQL.

Другая проблема с утверждением - использование символов комментария. Синтаксис комментариев MySQL гласит:

От последовательности «-» до конца строки.В MySQL стиль комментария «-» (двойная черта) требует, чтобы за второй чертой следовал хотя бы один пробел или управляющий символ (например, пробел, табуляция, новая строка и т. Д.).Этот синтаксис немного отличается от стандартного синтаксиса комментариев SQL, как обсуждалось в разделе 1.8.5.5, «'- как начало комментария».

Таким образом, после * 1019 у вас должен быть пробел.*.Если вместо этого вы используете #, то следующие пробелы не требуются.

Более простой и безопасный способ начать тестирование SQL-инъекций - попробовать простой SELECT:

$value = "1' OR 1; -- ";
$sql = "SELECT * FROM mytable WHERE id = '$value'";

print "$sql\n";
// SELECT * FROM mytable WHERE id = '1' OR 1; #'

$result = mysql_query($sql,$con);

// Should return multiple rows (if your table has multiple rows):
while ($row = mysql_fetch_assoc($result)) {
    print "{$row['id']}\n";
}

Как PHPmysql API отклоняет несколько операторов, некоторые из наиболее часто используемых примеров SQL-инъекций не будут работать, и это хорошо.Однако, как вы можете видеть из приведенного выше простого примера, он не мешает другим формам внедрения SQL.

Подумайте, как можно повлиять на подобное утверждение:

DELETE FROM mytable WHERE id = '1'

Также неситепомните, что удаление данных, вероятно, не очень полезно для кого-либо, кроме злоумышленника, который просто хочет вызвать сбои.С другой стороны, получение конфиденциальных данных, к которым у вас нет доступа, может быть очень полезным.

...