某移动平台代码审计
字数 1418 2025-08-06 08:35:00
某移动平台代码审计教学文档
系统概述
该文档基于一次地市级HVV行动中发现的某移动平台系统进行代码审计分析。系统采用.NET框架开发,通过黑盒+白盒结合的方式进行审计。审计发现了多处安全漏洞,包括SQL注入、逻辑漏洞和文件上传漏洞等。
前台SQL注入漏洞1
漏洞发现过程
- 黑盒测试发现用户表单最多只能输入4个字符
- 通过Burp Suite捕获数据包,发现
/Home/UserDepartment?username=8888请求 - 暴力破解4位数字用户名,发现有效用户名
漏洞代码分析
漏洞位于Controllers\HomeController.cs中的UserDepartment方法:
[HttpGet]
public ActionResult UserDepartment(string username)
{
return Json(Account.UserDepartment(username), JsonRequestBehavior.AllowGet);
}
跟进Account.UserDepartment()方法:
public static List<X_keshi> UserDepartment(string username)
{
User user = new User();
return user.GetUserKeShi(username);
}
继续跟进user.GetUserKeShi()方法:
public List<X_keshi> GetUserKeShi(string userid)
{
Msg msg = new Msg();
string sql = "select a.* from x_keshi a,x_yonghukeshi b where a.id=b.keshiid and b.yonghuid='" + userid + "'";
MobileDataEntityDAL<X_keshi> mobileDataEntityDAL = new MobileDataEntityDAL<X_keshi>();
DataSet dataSet = DBHelper.SqlHelper(MobileDataBaseLink.Mobile, sql, msg, CommandType.Text);
List<X_keshi> list = new List<X_keshi>();
// ...
}
漏洞原理
- 用户输入
username未经过任何过滤直接拼接到SQL语句中 - 使用字符串拼接方式构造SQL查询
- 数据库为Oracle
漏洞验证
- 构造延时注入:
/Home/UserDepartment?username=8888' AND 1=DBMS_PIPE.RECEIVE_MESSAGE('RDS',5)-- - 使用Sqlmap可直接利用
前台SQL注入漏洞2
漏洞发现过程
- 通过全局搜索
GetUserKeShi()方法发现另一处调用 - 位于
Controllers\HomeController.cs中的UserModules方法
漏洞利用
- 直接访问:
/home/UserModules?username=注入payload
逻辑漏洞(硬编码密码)
漏洞发现过程
- 跟踪
login()方法调用链 - 最终在
ValidateUser()方法中发现硬编码密码
漏洞代码分析
public Msg ValidateUser(string userid, string password)
{
Msg msg = new Msg();
// ...
// 发现密码直接硬编码在代码中
if (password == "硬编码的密码值")
{
msg.Result = true;
}
// ...
}
漏洞利用
- 使用前期收集到的账号(4位数字用户名)
- 直接使用硬编码密码登录
- 无验证码限制,可暴力破解
后台文件上传漏洞(5处)
漏洞发现方法
- 全局搜索
SaveAs()函数 - 发现5处上传点
漏洞代码分析(以ArtConfigController为例)
位于\Areas\BackStage\Controllers\ArtConfigController.cs中的UploadImage()方法:
public ActionResult UploadImage(string name)
{
// 检查路径是否存在,不存在则创建
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
// 检查是否有文件上传
if (base.Request.Files.Count > 0)
{
// 获取上传的文件
HttpPostedFileBase httpPostedFileBase = base.Request.Files[0];
Image img = Image.FromStream(httpPostedFileBase.InputStream);
// 生成缩略图
Image thumbnail = ImageConvert.MakeThumbnail(img, 800, 800);
// 使用用户提供的文件名或生成GUID作为文件名
string fileName = string.IsNullOrEmpty(name) ?
Guid.NewGuid().ToString() + Path.GetExtension(httpPostedFileBase.FileName) :
name;
// 保存文件
thumbnail.Save(Path.Combine(path, fileName));
return Json(fileName, JsonRequestBehavior.AllowGet);
}
// ...
}
漏洞原理
- 未对上传文件类型进行过滤
- 允许用户自定义文件名
- 未检查文件内容是否为有效图片
- 直接保存用户上传的文件
漏洞利用
- 访问后台文件上传功能
- 直接上传WebShell等恶意文件
- 结合前台注入和逻辑漏洞获取后台权限
组合攻击思路
- 利用前台SQL注入收集管理员账号
- 使用硬编码密码登录后台
- 利用后台文件上传漏洞获取WebShell
- 进一步渗透内网
防御建议
针对SQL注入
- 使用参数化查询或ORM框架
- 对用户输入进行严格过滤和转义
- 最小权限原则,限制数据库账户权限
针对逻辑漏洞
- 避免硬编码敏感信息
- 实现强密码策略
- 添加验证码等防暴力破解机制
针对文件上传
- 检查文件类型和内容
- 限制上传文件扩展名
- 重命名上传文件
- 将上传文件存储在非Web目录
- 设置适当的文件权限
总结
该移动平台系统存在多处高危漏洞,主要原因是:
- 未对用户输入进行有效过滤
- 使用不安全的编码实践(如SQL拼接)
- 缺乏基本的安全防护措施
- 敏感信息硬编码
通过组合利用这些漏洞,攻击者可完全控制该系统。开发人员应重视安全编码实践,定期进行代码审计和安全测试。