靶场 PHP 函数整理与漏洞防御方式总结第一部分 靶场中用到的 PHP 函数一、一句话木马 / 代码执行相关函数 / 语句作用靶场中的用法eval($code)把字符串当作PHP 代码执行一句话木马核心?php eval($_POST[cmd]); ?assert($code)断言传入字符串时也会执行 PHP 代码一句话木马变体call_user_func($func, $arg)回调方式动态调用函数call_user_func(system, $_GET[cmd])常用于绕过对 system 关键字的过滤call_user_func_array()同上参数以数组形式传递回调绕过变体preg_replace()正则替换PHP5.5 时/e修饰符会执行替换结果中的代码历史代码执行点面试常考create_function()动态创建函数PHP7.2可注入代码历史代码执行点区别要点7.27 课堂重点eval执行的是 PHP 代码system执行的是操作系统命令。二、命令执行相关函数作用特点system($cmd)执行系统命令并直接输出结果页面直接显示命令结果如 whoami → www-dataexec($cmd, $output)执行命令结果放入数组只返回最后一行不自动输出需配合 echoshell_exec($cmd)执行命令返回完整输出字符串无回显时需echo shell_exec(...)passthru($cmd)执行命令并原样输出含二进制适合输出原始数据popen()/proc_open()以进程方式执行命令返回句柄进阶/绕过场景三、文件包含相关1. 四个包含函数函数文件找不到时重复包含include警告Warning继续执行允许include_once警告继续执行同一文件仅一次require致命错误程序终止允许require_once致命错误程序终止同一文件仅一次典型漏洞代码include $_GET[page];2. 相关 php.ini 配置项allow_url_include是否允许包含远程 URLRFI、php://input、data:// 的前提allow_url_fopen是否允许 URL 方式的文件操作open_basedir限制 PHP 可访问的目录范围第二部分 各类型漏洞的防御方式一、文件上传漏洞成因对上传文件的类型、后缀、内容校验不严或校验逻辑存在时序/逻辑缺陷导致可执行脚本落地服务器。缺陷类型典型绕过防御方式仅前端 JS 校验禁用 JS / Burp 改包服务端必须重新校验前端校验只做体验仅校验 Content-TypeBurp 改 MIMEMIME 可被伪造只能作为辅助不能作为唯一依据黑名单php3/php5/大小写/双写/末尾点/::$DATA改用白名单只允许 jpg/png/gif 等单次替换pphphp双写白名单或循环替换至无匹配路径参数可控save_path %00 截断过滤../、%00用basename()取纯文件名保存路径由服务端写死文件内容检测图片马 文件包含二次渲染GD 重编码上传目录与包含白名单隔离先保存后校验条件竞争先校验后保存使用临时随机名校验通过再改名原子化用户可控文件名save_name 大小写/末尾点/数组is_string()强制类型检查服务端统一重命名通用加固清单扩展名、MIME、文件内容图片二次渲染三重校验以白名单为准服务端随机重命名攻击者无法预测路径与文件名上传目录禁止脚本解析Apache/Nginx 配置关闭该目录 PHP 执行最好存放到 Web 根目录之外或独立域名/对象存储完整清理链且顺序正确trim → deldot → strtolower → 去::$DATA先清理再检查限制文件大小Web 服务低权限运行。二、文件包含漏洞成因include/require的参数来自用户输入且未严格限制导致包含预期外文件敏感文件、日志、Session、上传的图片马、远程恶意文件。首选白名单映射——用户只提交业务标识真实路径由服务端决定$pages[home__DIR__./pages/home.php,news__DIR__./pages/news.php];$key$_GET[page]??home;if(!isset($pages[$key])){http_response_code(404);exit(页面不存在);}include$pages[$key];必须传路径时做规范化校验realpath()解析../和符号链接后确认最终路径仍在允许目录内strpos($target, $base)0。配置加固生产环境关闭allow_url_include按需评估关闭allow_url_fopen配置open_basedir限制访问范围。切断组合利用链上传、日志、Session 目录不可被包含上传目录禁止 PHP 解析。最小权限 不泄露信息Web 进程低权限运行关闭display_errors错误页不泄露绝对路径。不用字符串替换黑名单过滤../、php://易被变形绕过。三、代码执行 / 命令执行漏洞成因用户可控数据进入eval、system、exec、shell_exec、passthru、call_user_func等函数。删除危险用法生产代码不使用eval()执行用户输入不把用户输入传给命令执行函数。白名单替代动态调用用固定业务逻辑/白名单映射不让用户提供函数名或代码$actions[show_userfunction(){/* 固定业务代码 */}];if(isset($actions[$action])){echo$actions[$action]();}必须执行系统命令时参数用escapeshellarg()/escapeshellcmd()转义命令白名单化。纵深防御Web 服务低权限账户运行结合容器、SELinux/AppArmor 限制影响范围在php.ini中用disable_functions禁用system,exec,shell_exec,passthru,eval等高危函数。四、CSRF 跨站请求伪造成因服务端只验证 Cookie 中的登录状态不验证请求是否由用户本人主动发起攻击者诱导已登录用户访问恶意页面以其身份执行非预期操作。CSRF Token表单/请求中嵌入服务端生成的随机 Token提交时校验攻击者无法预知 Token——最有效校验 Referer / Origin确认请求来源是本站点SameSite Cookie设置SameSiteStrict/Lax阻止跨站携带 Cookie二次验证敏感操作改密、转账要求重新输入密码、短信/图形验证码关键操作使用 POST 而非 GET并配合自定义请求头如X-Requested-With。五、越权攻击成因服务端只判断是否登录不判断该用户是否有权操作这条数据/这个功能。类型说明防御水平越权同等级用户间越权访问数据改 id 看他人信息服务端对每个请求校验数据归属操作对象必须与当前会话用户绑定不使用可猜测的连续 ID用随机/加密 ID垂直越权普通用户执行管理员功能基于角色的访问控制RBAC服务端对每个接口做权限等级校验管理接口不对普通用户开放前端隐藏按钮不算防御核心原则所有权限判断必须在服务端完成前端隐藏、参数信任都不可靠。