尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

命令注入与代码注入:从 ping 参数到 RCE

命令注入与代码注入:从 ping 参数到 RCE 很多同学第一次见到 RCERemote Code Execution远程代码执行会以为必须配得上一个“惊天 0day”。真到业务里看事故单起点往往土得令人发指一个网络诊断页把用户输入的 IP 拼进ping一个后台“测试过滤器”把表达式丢进eval一个运维接口把文件名丢进Runtime.exec却还走了 shell。命令注入和代码注入是两条最接近“从参数到 RCE”的直道。它们和 SQL 注入同族——都是不可信输入进了解释器——只是解释器换成了系统 shell、或语言自己的求值器。一、先把两个名词掰开1. 命令注入OS Command Injection应用拼出一条要交给操作系统执行的命令行用户输入改变了命令的结构或追加了新命令。例如本意ping -c 4 用户输入的主机若用户输入被拼进 shell攻击者可能用命令分隔符塞进额外指令让系统在ping之外还执行别的东西。2. 代码注入Code Injection用户输入被送进语言/模板/表达式引擎执行例如eval、assert、动态Function不安全的模板引擎SSTI 常单列本质近亲反序列化触发的魔术方法调用常单列结果也是 RCERuntime反射乱调它不一定经过/bin/sh但一样能在进程里跑任意逻辑。3. 一张对照表命令注入代码注入解释器shell / 命令行语言求值器/模板等典型函数system、popen、exec走 shell 时eval、动态代码编译经典入口ping、转换、打印、备份脚本规则引擎、计算器、调试开关修复关键不调 shell参数数组 API白名单删除求值沙箱极难做对下面两条线都会写到实战里它们还经常接力——代码注入里再拼命令或命令注入里再写文件落地。二、为什么偏偏是 ping 参数1. 业务理由很充分网络设备面板、IDC 管理、监控系统、售后诊断页都需要“帮用户 ping 一下”。产品经理觉得这是运维友好开发随手system(ping ip);于是安全问题从第一天就埋好了。2. Shell 元字符是引爆点若命令经过 shell 解析用户输入中的分隔与链式符号就可能改变语义具体哪些字符危险因 Windowscmd/ PowerShell / Linuxsh而异。教学与靶场里会演示“追加命令”的效果真实授权测试只需证明输入能改变命令语义或触发额外执行不必上破坏性指令。3. 过滤为什么总失败常见假修复黑名单删掉;、|、——总有漏网与编码变体只允许数字和点——却忘了 IPv6、主机名、或旁路参数位置正则看起来很严实际只校验了部分分支换行、管道、命令替换在不同层被解码回来。过滤命令字符串几乎注定输给坚持不懈的人。正解是不要用 shell 拼命令。4. 正确实现 ping 的思路严格校验IPv4/IPv6/主机名白名单规则使用参数数组形式的进程 API不经过 shell超时与输出长度限制仅管理员可用并审计能改成“对固定探针地址探测”就不要让用户指定任意主机。能做到前两条ping 页从“RCE 温床”变回“诊断工具”。三、命令注入的一般形态1. 拼接位置不止主机名文件名、路径备份、压缩、转换邮件地址老脚本发给mail图片尺寸、视频码率ImageMagick、ffmpeg 命令行打印机名、共享路径。审计时搜system、popen、shell_exec、Runtime.getRuntime().exec注意重载是否走 shell、ProcessBuilder用法、subprocess的shellTrue、os.system。2. 无回显与有回显有的接口把命令输出回页面——好证。有的只返回成功失败——要用时间差、外带通道授权下对你控制的接收端等谨慎证明生产环境避免大面积盲打。3. 到 RCE 的“短路径”命令注入一旦成立通常已经是 RCE你能执行的就是系统命令。后续是权限多大www-data 还是 root、能不能写 web 目录、能不能碰云密钥——那是影响评估不是“还没 RCE”。报告里写命令注入导致远程命令执行并注明运行身份与可达资产即可。四、代码注入eval 家族与朋友们1. 为什么开发爱用 eval规则引擎、动态公式、功能开关、灰度表达式、竞品“脚本化配置”——都想让用户或运营写一段逻辑。于是eval(user_input)或稍加伪装的动态编译执行。这等于把解释器端口暴露给输入。2. SSTI 模板注入近亲用户输入进了服务端模板引擎并被当成模板语法解析。表现像代码注入常能读配置或执行命令。修法是用户内容当数据渲染禁止用户模板进服务端引擎或使用沙箱极严的引擎仍要谨慎。3. 反序列化不可信数据反序列化导致任意代码执行——许多报告直接写 RCE。防御是不碰不可信反序列化换安全格式JSON 校验升级补丁。专题可另写这里只强调它和“从参数到 RCE”同一终点。4. 修复代码注入能删 eval 就删换成白名单操作符的表达式解析器自己做要极慎重运营脚本走人工审核发布不进线上动态执行语言沙箱不要迷信历史逃逸太多。五、从“参数”到 RCE 的链路怎么讲给领导听① 功能需要调用外部命令或动态代码 ② 开发用字符串拼接把用户输入塞进去 ③ 攻击者构造输入改变语义 ④ 进程以 Web/应用身份执行任意命令或代码 ⑤ 读配置、弹 shell、打内网、拿云凭证……打断点① 换安全 API 或不让用户指定② 禁止拼接③ 纵深最小权限、只读文件系统④⑤ 检测与分段。六、授权测试方法1. 发现功能关键词诊断、ping、traceroute、nslookup、转换、渲染、打印、备份、升级包处理。白盒搜危险函数与shellTrue。2. 确认在授权环境提交无害差异输入如改变睡眠时间、回显固定标记证明注入点。避免rm、挖矿、大规模扫内网。3. 影响评估谁身份执行能否读业务配置是否容器内是否连到生产库给出级别通常是高危/严重。4. 报告复现步骤最小化修复给“参数数组示例”与“删除 eval”的明确建议复测标准写清。七、防御工程清单命令执行类禁止shellTrue/system拼用户输入使用参数列表 API主机/文件名等严格白名单应用账号最小权限上传与命令处理隔离代码执行类无eval/assert处理用户数据模板不渲染用户模板表达式引擎白名单化反序列化不接不可信源检测Web 日志中的命令分隔特征辅WAF/RASP 规则辅主机侧异常子进程www用户起bash/curl参见 HIDS 文云侧异常行为。八、常见假修复与真翻车“我转义了所有特殊字符。”平台差异与二次解码会打脸且业务字符可能被误伤。“我用了 escapeshellarg。”有帮助但仍要正确用法与参数结构复杂命令行依旧危险。能不用 shell 就不用。“内网系统无所谓。”内网 RCE 往往是勒索与漫游的跳板。“容器里没事。”容器逃逸与云元数据故事你我都写过RCE 仍是事故起点。“只允许数字。”下一个需求就要支持域名一放开又拼回去。九、和 SQL 注入、XSS、SSRF 的关系SQL 注入进数据库解释器命令/代码注入进 OS 或语言解释器XSS进浏览器解释器SSRF进服务端请求器。同一原则数据与代码分离用户输入只能当数据。命令注入常与上传、文件名、图片处理链组合代码注入常与“运营可配置脚本”组合。架构评审时把这些功能单独标红。十、开发规范可写进 Wiki 的几条任何system/exec/eval必须安全评审默认拒绝。子进程只允许参数数组形式禁止拼接命令行字符串。用户输入进入子进程前必须白名单校验。禁止上线面向用户的动态代码执行功能内部工具也要鉴权与审计。发现一处拼接回归测试留样例。十一、学习路径靶场命令注入关卡理解分隔与无 shell API 的差异自己写坏再写好一个 ping先拼接再改 ProcessBuilder/参数数组搜公司代码库危险函数清单出整改工单配一条 HIDS 规则Web 用户起 shell 告警预发验证。十二、收尾从 ping 参数到 RCE中间往往没有华丽漏洞编号只有一次“图省事的拼接”。命令注入把输入交给 shell代码注入把输入交给语言求值器——终点都是别人在你的进程里说话。防住它们不靠更长的黑名单靠三样老实东西不要用 shell 拼用户输入不要 eval 用户输入给应用最小权限让出事时少丢一点。今晚若只做一件事在代码库搜system(、popen(、shellTrue、eval(打开每一处看有没有用户输入。搜完你对“我们离 RCE 有多远”的判断会比听十个黑客故事扎实得多。附危险 API 速记按语言自查PHPsystem、shell_exec、passthru、proc_open、eval、assertPythonos.system、subprocess(..., shellTrue)、eval、execJavaRuntime.exec字符串版、脚本引擎Nodechild_process.exec、eval、vm使用不当运维脚本Bash 里未加引号的变量展开附修复优先级优先级动作P0下线或修复可触发的注入点P1改为无 shell 参数数组 白名单P2删除 eval/动态代码能力P3最小权限 子进程监控
返回列表