标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2024-1522] 作者: ecawen 发表于: [2018-05-12]
本文共 [542] 位读者顶过
目前日期为2018-05-10,php版本目前总共分为3大类,php5.x,php7.x,以及之php5.x之前版本。而目前市场多用于php5.x以及php7.x。 本文仅讨论php5.x与php7.x。早期php4.x中 ZendEngine 1.0 API并不在讨论范围。 文章将围绕几个话题来对抗安全软件:
无论是哪个版本的php,它的引擎都大量的使用了HashTable,如果说php是最好的语言之一,那么一定是在说HashTable。 期间补充大量php内核相关知识,可直接跳到操作总结。
php-src-master\main\php_variables.c:908-917
void php_startup_auto_globals(void)
{
zend_register_auto_global(zend_string_init_interned("_GET", sizeof("_GET")-1, 1), 0, php_auto_globals_create_get);
zend_register_auto_global(zend_string_init_interned("_POST", sizeof("_POST")-1, 1), 0, php_auto_globals_create_post);
zend_register_auto_global(zend_string_init_interned("_COOKIE", sizeof("_COOKIE")-1, 1), 0, php_auto_globals_create_cookie);
zend_register_auto_global(zend_string_init_interned("_SERVER", sizeof("_SERVER")-1, 1), PG(auto_globals_jit), php_auto_globals_create_server);
zend_register_auto_global(zend_string_init_interned("_ENV", sizeof("_ENV")-1, 1), PG(auto_globals_jit), php_auto_globals_create_env);
zend_register_auto_global(zend_string_init_interned("_REQUEST", sizeof("_REQUEST")-1, 1), PG(auto_globals_jit), php_auto_globals_create_request);
zend_register_auto_global(zend_string_init_interned("_FILES", sizeof("_FILES")-1, 1), 0, php_auto_globals_create_files);
}
跟zend_register_auto_global php-src-master\Zend\zend_compile.c:1649-1661
int zend_register_auto_global(zend_string *name, zend_bool jit, zend_auto_global_callback auto_global_callback) /* {{{ */
{
zend_auto_global auto_global;
int retval;
auto_global.name = name;
auto_global.auto_global_callback = auto_global_callback;
auto_global.jit = jit;
retval = zend_hash_add_mem(CG(auto_globals), auto_global.name, &auto_global, sizeof(zend_auto_global)) != NULL ? SUCCESS : FAILURE;
return retval;
}
把对象保存CG(auto_globals)这个全局变量,正如上文,在内核中,超全局变量实际为php内核定义的全局变量。保存在CG。 而backdoor常用除EG,CG辅助宏外,其他辅助宏为: EG();//全局变量 executor_globals 如$_GLOBALS[EG(symbol_table),地址:EG(active_symbol_table) PG();//核心变量 php_core_globals 如:$_GET $_POST .. PG(http_globals)[TRACK_VARS_*],INI信息 SG();//SAPI变量 请求数据 sapi_globals_struct 如:HTTP原始请求变量 sapi_request_info CG();//编译变量 compiler_globals 可以得到函数表,类表 EX();//当前执行数据 zend_execute_data 可以获取到当前执行的函数,类,OPCODE等 OG();//输出变量 output_globals
// function declaration PHP_MINIT_FUNCTION(my_extension); // ... some code ... zend_module_entry my_extension_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif "my_extension", my_extension_functions, PHP_MINIT(my_extension), NULL, NULL, NULL, NULL, #if ZEND_MODULE_API_NO >= 20010901 "1.0", #endif STANDARD_MODULE_PROPERTIES }; // ... some code ... // function implementation PHP_MINIT_FUNCTION(hosting_tools) { REGISTER_INI_ENTRIES(); return SUCCESS; }
在php请求过程中,需要调用HashTable来查找全局变量或者hook func,几个原型如下: uint32_t zend_hash_num_elements(HashTable *ht); // 获取数组大小 zval* zend_hash_find(HashTable *ht, zend_string *key); // 根据 zend_string * 作为 key 查找数组 zval* zend_hash_str_find(HashTable *ht, char *str, size_t len); // 根据 char * 作为 key 查找数组 zval* zend_hash_index_find(HashTable *ht, zend_ulong h); // 查找索引 h 的数组元素 void* zend_hash_find_ptr(HashTable *ht, zend_string *key); // 同上,只是返回元素指针指向的值 void* zend_hash_str_find_ptr(HashTable *ht, char *str, size_t len); // 跟上同类 void* zend_hash_index_find_ptr(HashTable *ht, zend_ulong h); // 跟上同类 zend_bool zend_hash_exists(HashTable *ht, zend_string *key); // zend_string * key 是否存在 zend_bool zend_hash_str_exists(HashTable *ht, char *str, size_t len); // char * key 是否存在 zend_bool zend_hash_index_exists(HashTable *ht, zend_ulong h); // 索引 h 是否存在 zend_array *HASH_OF(zval *val); // 其实 HASH_OF 是一个宏,参数 value 可以是数组 `IS_ARRAY` 或者对象 `IS_OBJECT`,否则返回 NULL
- if (zend_hash_find(ht, Z_STRVAL_P(key), Z_STRLEN_P(key)+1, (void**)&zv_ptr) == SUCCESS) { //php5.x + if ((zv = zend_hash_find(ht, Z_STR_P(key))) != NULL) { //php7.x 操作总结:
2.php7.x hook phpinfo,来隐藏一句话(临时使用标签) 3.如何构造php全版本的backdoor(公共或项目backdoor思想)
4.关于第三方框架的嵌入。(持续性标签) 访问任意php页面,带有post参数micropoor_php,则执行任意代码。
https://drive.google.com/file/d/1WkQInZQ53PHe104MKHqFOG_-ydCZh4lN/view?usp=sharing |