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

SQL Injection on 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'))-- -

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

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

Тем не менее, PHP mysql API не поддерживает несколько операторов в одном запросе. (В базовом MySQL C API должно быть явно указано, что необходимо поддерживать эту функциональность , которую ваши привязки не выполняют).

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

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

а также:

 DELETE FROM users; 

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

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

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

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

Более простой и безопасный способ начать тестирование 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"; } 

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

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

 DELETE FROM mytable WHERE id = '1' 

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