История изменений
Исправление static_lab, (текущая версия) :
Они не используют PDO? ахаха.
Они используют PDO, косяк в генераторе запроса. Вообще, баг весьма эпичен: отрепортили его ещё в прошлом году, автор приложил даже патч с фиксом; разрабы же тупо забили на это, а тэг Security проигнорировали. Виноватыми же у них теперь стали все, включая автора багрепорта, кроме них самих.
Косяк, собственно, заключается в том, что в конструкторе запроса использовался foreach по ассоциативному массиву входных параметров вида [«имя_параметра» => [массив значений]]. Вложенный foreach обходил этот массив и приводил всё это добро к виду [имя_параметра_0 => значение_0, имя_параметра_1 => значение_1...]. При этом за счётчик брался индекс элемента самого массива. Если же это был не обычный массив с числовыми индексами, а ассоциативный со строковыми индексами, то получалось что-то вроде «имя_параметра_0 OR 1=1...». Результат же использовался как часть строки запроса для prepared statement, что и было уязвимым для инъекции (а значения параметров как положено передавались биндингом, и разрабы надеялись, что всё нормально).
Исходная версия static_lab, :
Они не используют PDO? ахаха.
Они используют PDO, косяк в генераторе запроса. Вообще, баг весьма эпичен: отрепортили его ещё в прошлом году, автор приложил даже патч с фиксом; разрабы же тупо забили на это, а тэг Security проигнорировали. Виноватыми же у них теперь стали все, включая автора багрепорта, кроме них самих.
Косяк, собственно, заключается в том, что в конструкторе запроса использовался foreach по ассоциативному массиву входных параметров вида [«имя_параметра» => [массив значений]]. Вложенный foreach обходил этот массив и приводил всё это добро к виду [имя_параметра_0 => значение_0, имя_параметра_1 => значение_1...]. При этом за счётчик брался индекс элемента самого массива. Если же это был не обычный массив с числовыми индексами, а ассоциативный со строковыми индексами, то получалось что-то вроде (имя_параметра_0 OR 1=1...). Результат же использовался как часть строки запроса для prepared statement, что и было уязвимым для инъекции (а значения параметров как положено передавались биндингом, и разрабы надеялись, что всё нормально).