某.NET仓库管理系统——WMS_APP服务端代码审计一
字数 1931 2025-08-18 17:33:34
.NET仓库管理系统(WMS_APP)服务端代码审计教学文档
1. .NET程序审计关键文件类型
在进行.NET程序审计时,需要重点关注以下文件类型:
- .dll文件:动态链接库文件,包含程序运行时需要的函数和数据,可通过ILSpy等工具反编译为.cs源代码文件进行审计
- .cs文件:包含C#代码,定义网页或Web应用程序的逻辑和功能
- .ashx文件:ASP.NET中的HTTP处理程序文件,专注于处理HTTP请求和生成响应的逻辑
- .aspx文件:定义Web页面结构和布局的文件
- 配置文件和其他静态资源文件
2. 审计发现的安全漏洞
2.1 GET_GN.ashx和FUHESAOMA.ashx - 未授权访问漏洞
漏洞分析
-
请求处理流程:
- 从HTTP请求头中获取名为"param"的值
- 使用
GetParamJson方法处理该值(位于Utils.cs文件) - 方法逻辑:查找请求头中键为"param"的值,没有则返回空
-
数据处理:
- 对获取的param值进行URL解码
- 使用
JsonConvert.DeserializeObject<dynamic>反序列化JSON数据 - 从反序列化结果中获取"type"属性值
-
数据库操作:
- 创建
SqlRun.DBAccess类实例 - 调用
RunProDataSet方法执行SQL操作 - 参数:
APP_WMS_GETData(预定义的SQL命令/函数)和包含type值的数组
- 创建
-
安全问题:
- 无任何token验证机制
- 任意用户可通过构造特定请求头执行有限的SQL查询
- FUHESAOMA.ashx页面还可获取"var"参数值查询用户信息
漏洞验证
构造HTTP请求头:
param: {"type":"value"}
2.2 KeyValueJson.ashx - RCE漏洞
漏洞分析
-
请求处理流程:
- 同样从请求头param获取值
- 使用
ParamsHelper.ReturnParams方法处理(位于ParamsHelper.cs)
-
ParamsHelper.ReturnParams方法:
- 输入:json字符串
- 输出:procName(存储过程名称)
- 处理逻辑:
- 查找json中名为"proc"的参数
- 为其他参数名称前添加"@"符号
- 返回参数数组
-
数据库操作:
- 调用
RunProcedureDR方法执行存储过程 - 存储过程名称和参数完全可控
- 调用
-
RCE实现:
- 利用SQL Server内置存储过程
xp_cmdshell - 构造请求:
param: {"proc":"xp_cmdshell", "command_string":"系统命令"} - 其他可利用的危险存储过程:
sp_databases:列出所有数据库sp_helpdb:报告数据库信息sp_tables:返回可查询对象列表xp_dirtree:查看目录结构xp_enumdsn:查看ODBC数据源xp_getfiledetails:获取文件属性
- 利用SQL Server内置存储过程
漏洞验证
构造HTTP请求头执行系统命令:
param: {"proc":"xp_cmdshell", "command_string":"whoami"}
3. 其他可利用的SQL Server存储过程
-
数据库信息收集:
sp_databases:无参数可查询所有数据库sp_helpdb:报告指定或所有数据库信息sp_renamedb:更改数据库名称
-
表结构信息:
sp_tables:返回可查询对象列表sp_columns:返回表列信息sp_help:查看表的所有信息sp_helpconstraint:查看表约束sp_helpindex:查看表索引
-
系统信息收集:
sp_stored_procedures:列出所有存储过程xp_availablemedia:查看磁盘驱动器空间信息xp_enumgroups:查看系统组信息xp_ntsec_enumdomains:列出机器名和NT域名称
-
敏感操作:
sp_password:添加或修改登录帐户密码xp_sendmail:发送邮件并可附加查询结果xp_makecab:压缩多个文件到目标档案
4. 审计总结与修复建议
发现的安全问题
-
未授权访问:
- 关键接口无身份验证
- 任意用户可执行数据库查询
-
存储过程注入:
- 存储过程名称和参数完全可控
- 可调用危险系统存储过程
-
权限控制缺失:
- 数据库连接使用高权限账户
- 未实现最小权限原则
修复建议
-
身份验证:
- 为所有接口添加token验证机制
- 实现基于角色的访问控制
-
输入验证:
- 限制可执行的存储过程白名单
- 对参数进行严格类型和范围检查
-
数据库安全:
- 使用最低权限账户连接数据库
- 禁用危险存储过程如
xp_cmdshell - 实现参数化查询
-
日志监控:
- 记录所有数据库操作
- 监控异常查询模式
-
代码规范:
- 避免从HTTP头获取关键参数
- 分离数据访问层和业务逻辑层