шестнадцатеричное кодирование в инъекции sql

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: извините за мой плохой английский.

-1

Решение

Внедрение 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 было бы подготовленным заявлением.
3

Другие решения

На это уже ответили в комментариях к этому сообщению в блоге. Шестнадцатеричная строка должна быть запущена через PHP или другую систему, которая неверно передает значение MySQL в виде строки (вместо числа), чтобы этот хак работал.

1

По вопросам рекламы [email protected]