http://www.pwntester.com/blog/2014/01/15/hackyou2014-web100-write-up/
По этой ссылке они ввели шестнадцатеричный код вроде
0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f21212729
имея в виду:
999999999999 union all (select 'Hello!!')
В MySQL мы не можем напечатать запрос, как
Mysql> 0x0abcd … (предположим, что 0x0abc .. означает select * from …).
Итак, можете ли вы объяснить мне, почему они могут вводить, как в моей ссылке?
p / s: извините за мой плохой английский.
Внедрение SQL не происходит в INSERT
заявление но во втором SELECT
заявление:
"SELECT title FROM picture WHERE id = ".$r['id']
Вот $r['id']
это недавно вставленный идентификатор, т.е. пользователь предоставил $_POST['id']
значение.
Теперь причина того, почему эта инъекция SQL работает, заключается в поддержке MySQL для шестнадцатеричные литералы и тот факт, что Я бы столбец голос стол из тип строки как в этом случае применяется следующее:
В строковом контексте они действуют как двоичные строки, где каждая пара шестнадцатеричных цифр преобразуется в символ:
mysql> SELECT X'4D7953514C'; -> 'MySQL' mysql> SELECT 0x0a+0; -> 10 mysql> SELECT 0x5061756c; -> 'Paul'
Для PHP 0x…
является числовым (т.е. is_numeric
) и для MySQL 0x…
интерпретируется и сохраняется как строка, которая позже вставляется в вышеупомянутое SELECT
заявление.
Это было бы невозможно, если бы
SELECT
было бы подготовленным заявлением.На это уже ответили в комментариях к этому сообщению в блоге. Шестнадцатеричная строка должна быть запущена через PHP или другую систему, которая неверно передает значение MySQL в виде строки (вместо числа), чтобы этот хак работал.