|
Познающий
Регистрация: 14.09.2008
Сообщений: 38
С нами:
9292218
Репутация:
37
|
|
[Life] дак вот я понять то и не могу ((( тоесть pixel.php%3C пишет что загружен, но файла нет, если так pixel.php%00 то отдает 102 ошибку, если пустым оставить то нормально заливает по сути с нулбайтом он должен создать файл а не папку
Цитата с http://www.xakep.ru/magazine/xa/128/040/1.asp
Загрузка произвольных файлов в FCKeditor
BRIEF
FCKeditor, наряду с TinyMCE, является одним из наиболее распространенных WYSIWYG-редакторов и используется в таких известных WEB-приложенияx, как Zope, PHPList, Falt4 CMS, RunCMS, Dokeos, Nuke ET.
Для этой уязвимости в сети присутствуют очень скудные описания, из которых понятно только то, что уязвим параметр «CurrentFolder» (например, http://www.securitylab.ru/vulnerability/382191.php и http://www.securityfocus.com/bid/31812). Так как такое положение дел меня вовсе не устраивало, пришлось самому покопаться в исходниках описываемого HTML based редактора.
Итак, качаем последний уязвимый релиз (http://dfn.dl.sourceforge.net/sourceforge/fckeditor/FCKeditor_2.6.4.zip) и открываем сценарий, ответственный за upload файлов во встроенном файлменеджере скрипта - ./editor/filemanager/connectors/php/upload.php:
<?php
...
$sCurrentFolder = GetCurrentFolder() ;
// Is enabled the upload?
if ( ! IsAllowedCommand( $sCommand ) )
SendUploadResults( '1', '', '', 'The ""' . $sCommand . '"" command isn\'t allowed' ) ;
// Check if it is an allowed type.
if ( !IsAllowedType( $sType ) )
SendUploadResults( 1, '', '', 'Invalid type specified' ) ;
FileUpload( $sType, $sCurrentFolder, $sCommand )
?>
Здесь нас интересует функция определения текущей директории - GetCurrentFolder(), найти которую мы сможем в сценарии ./editor/filemanager/connectors/php/io.php:
function GetCurrentFolder()
{
if (!isset($_GET)) {
global $_GET;
}
$sCurrentFolder = isset( $_GET['CurrentFolder'] ) ? $_GET['CurrentFolder'] : '/' ;
// Check the current folder syntax (must begin and start with a slash).
if ( !preg_match( '|/$|', $sCurrentFolder ) )
$sCurrentFolder .= '/' ;
if ( strpos( $sCurrentFolder, '/' ) !== 0 )
$sCurrentFolder = '/' . $sCurrentFolder ;
// Ensure the folder path has no double-slashes
while ( strpos ($sCurrentFolder, '//') !== false ) {
$sCurrentFolder = str_replace ('//', '/', $sCurrentFolder) ;
}
// Check for invalid folder paths (..)
if ( strpos( $sCurrentFolder, '..' ) || strpos( $sCurrentFolder, "\\" ))
SendError( 102, '' ) ;
return $sCurrentFolder ;
}
А также функция, собственно, загрузки и сохранения файлов FileUpload() из ./editor/filemanager/connectors/php/commands.php:
function FileUpload( $resourceType, $currentFolder, $sCommand )
{
...
// Map the virtual path to the local server path.
$sServerDir = ServerMapFolder( $resourceType, $currentFolder, $sCommand ) ;
// Get the uploaded file name.
$sFileName = $oFile['name'] ;
$sFileName = SanitizeFileName( $sFileName ) ;
...
$sFilePath = $sServerDir . $sFileName ;
...
move_uploaded_file( $oFile['tmp_name'], $sFilePath ) ;
...
}
Функция ServerMapFolder() просто возвращает полный folder path на сервере, исходя из переданного параметра $currentFolder. Как видно из функции GetCurrentFolder(), имя указываемой пользователем папки проверяется только на наличие уязвимости directory traversal, но никак не на банальный null-byte.
EXPLOIT
Для наглядного примера эксплуатации воспользуемся встроенным тестовым стендом FCKeditor для загрузки файлов - ./editor/filemanager/connectors/uploadtest.html.
Итак, в списке «Select the File Uploader to use» выбираем PHP (ну, или любой другой понравившийся тебе коннектор), далее в форме «Upload a new file» выбирай свой шелл, сохраненный с расширением .txt и, наконец, в поле «Current Folder» вбивай что-то вроде «my-evil-shell.php%00».
Теперь, после сабмита заполненной формы, скрипт с радостью покажет адрес твоего загруженного шелла в поле «Uploaded File URL» (в моем случае это ./userfiles/test.php).
Как видно из примера, $sFilePath для move_uploaded_file() становится равным имени директории ($sServerDir), настоящее же имя файла ($sFileName) просто-напросто отбрасывается нулл-байтом.
TARGETS
FCKeditor <=2.6.4, а также все web cms, в которых используется этот WYSIWYG-редактор.
SOLUTION
Как всегда, наилучшим решением для закрытия уязвимости будет установка последней версии скрипта с сайта производителя - http://www.fckeditor.net.
На локале всё работает на ура
Последний раз редактировалось KosoyRoman; 13.01.2010 в 00:05..
|