Pull to refresh

Comments 11

Воот, так уже лучше :)

И кстати:

> Во-вторых, динамическая загрузка расширений функцией dl().

5.3.0: dl() is now disabled in some SAPIs due to stability issues. The only SAPIs that allow dl() are CLI and Embed.
Это скорее по большей части не по вредоносный код, а про то как не надо делать, чтобы не огрести от коллег.
Вредоносный код то обычно стараются сам по себе сделать незаметным, а как он потом уже будет вызываться — уже не так важно, его ищут с другого конца. Вот «Бонус трек» уже под это подходит.
Круто, вы хотите описать все 100500 способов?
Зачем всё это, в таком случае нужно почистить, как в предыдущей статье в заминусовоном комменте habrahabr.ru/post/215139/#comment_7388239 через reset или что у вас там следит за кодом.
А затем искать кудой его вставили.
У меня какое-то дежавю:
10 марта, 12:11: mnemonic: Какие функции я забыл перечислить, которые принимают callback или callable?

10 марта, 12:42: bolk: Да море их. Например, array_filter, array_reduce, array_udiff_assoc, array_udiff_uassoc, array_udiff, array_uintersect_assoc, array_uintersect_uassoc, array_uintersect, array_walk_recursive, array_walk. Это по доке в разделе «массивы» просматривал. Есть и они в других разделах, например, гляньте на libxml_set_external_entity_loader или iterator_apply. В общем, не стоит их все выписывать.

Кроме того, вы ничего не написали про autoload, про замену сериализатора на свой, про замену сессий на свои, про собственные обработчики стримов, set_exception_handler и так далее. Способов целая куча.
А бонус-трек ваш взят из комментария к предыдущей статье. Т.е. люди за вас подумали, а вы из этого статью сделали без указания источника? Делааа…
Большинство это все же просто create_function. От суперпозиции ничего не меняется.
hide(create(func(you(way('code')))))
Спасибо, узнал про уязвимость в собственном коде :)
Пару дней назад появился еще более интересный метод:

function a () {
     global $template;
     
     $template = "echo 'Test'; // ";
}

function b () {
     a();

     $x = true;
     return ($x ? 'true' : 'false') . ';';
}

$template = '$tpl = ';

eval($template . b());  

Смотреть всё
Все бы ничего, но код легко «палится» любым сканером и ищется «ручками» из-за банального eval(). А анализ того, что будет выполнено, делается простой заменой eval на echo.
А у вас банальный create_function()? Это же только примеры, хотя, например в vB, eval — неотъемлемая часть движка. Никто не будет наивно копировать и вставлять. Закладку обязательно раскидают по библиотекам, наставят условий, замаскируют. Способ может изменять логику, а не вызывать код.
Не банальный create_function(). Смотрите habrahabr.ru/post/215139/, я перечислил как минимум
1. eval
2. create_function
3. косвенный вызов функций вида $a($b)
4. assert
5. preg_replace с модификатором «e»
6. вызов через функции, принимающие callable (хэндлеры, работа с массивами и т.п.)

Причем для тех, кто занимается поиском вредоносного кода на сайте очевидно, что конструкции №3 и №6 наиболее сложно найти, так как они характерны для нормальных скриптов. А вот eval, assert, preg_replace(/.*/e) ищутся очень быстро. Если хакер не школьник и не лентяй, он все-таки код свой банальным eval'ом не будет «палить».

Да и потом, какой смысл наворачивать сложную логику подготовки кода для выполнения, если в конце концов обычная замена eval на echo распечатывает результирующий исходный код, который легко проанализировать.
Да и потом, какой смысл наворачивать сложную логику подготовки кода для выполнения, если в конце концов обычная замена eval на echo распечатывает результирующий исходный код, который легко проанализировать.

Вредоносный код не только 10 строк, которые «хакер» вставил после взлома. Это искусство, где используют комбинации всех методов. Его внедряют в официальные версии движков. Его стараются спрятать, ведь сотни людей занимаются сравнением версий и поиском уязвимостей.

Разумеется, ни о каких вариантах выбора вызова здесь речи не идет. Мой пример, как и ваши, годится только для первой задачи. Для второй же, будет просто найти участки с вызовом $a($b) и анализировать их, однако, когда код исчисляется мегабайтами, место, где использовали особенности интерпретации выражений, найти очень и очень проблематично.
Sign up to leave a comment.

Articles