实战指南:MSSQL手工注入从入门到提权(附最新Sa权限利用技巧)
在红蓝对抗与渗透测试的实战演练中,数据库注入始终是突破内网边界、获取系统权限的关键路径之一。对于许多初入安全领域的朋友来说,面对MSSQL这类企业级数据库,常常感到无从下手——网上教程要么过于陈旧,要么只讲理论缺乏实战细节。今天,我们就抛开那些泛泛而谈的概述,深入MSSQL手工注入的肌理,从最基础的注入点判断开始,一步步构建完整的攻击链,直至通过Sa权限实现系统提权与权限维持。我们将重点拆解xp_cmdshell的启用、3389端口的开启等核心操作,并融入近两年在实战演练中涌现的新技巧与规避安全软件(AV)的细节。无论你是正在备考OSCP、准备企业红队评估的渗透测试人员,还是希望深入理解数据库安全机制的开发者,这篇文章都将为你提供一套清晰、可落地的实战框架。
1. 环境搭建与注入点深度探测
在开始任何攻击之前,理解你的目标环境是至关重要的。我们假设的目标是一个典型的ASP.NET应用,后端数据库为Microsoft SQL Server。与MySQL不同,MSSQL的权限体系更为复杂,其系统存储过程为我们后续的提权提供了丰富的可能性。
1.1 识别与确认MSSQL注入点
手工注入的第一步永远是判断注入点是否存在以及数据库类型。对于疑似注入点 http://target.com/news.aspx?id=1,我们进行如下基础测试:
基础闭合与报错测试:
id=1':添加单引号,观察是否出现数据库错误信息。典型的MSSQL错误可能包含“Microsoft OLE DB Provider for SQL Server”或“SQL Server”等字样。id=1 and 1=1与id=1 and 1=2:这是经典的布尔型注入测试。如果and 1=1返回正常页面,而and 1=2返回异常(如空白页、内容缺失),则强烈暗示存在数字型或可被逻辑运算影响的注入点。
利用MSSQL特有函数进行指纹识别: 当基础测试模棱两可时,可以使用数据库特有的函数来确认。例如,MSSQL的 @@version 和 db_name() 是很好的识别工具。
-- 通过联合查询获取版本信息
http://target.com/news.aspx?id=1 union select null,@@version,null--
注意:使用
union select前,必须用order by子句确定当前查询的列数,否则会因列数不匹配而报错。例如id=1 order by 5--依次尝试,直到页面报错,即可确定列数。
如果页面返回了SQL Server的版本信息,那么目标数据库是MSSQL就确凿无疑了。这一步的严谨性直接决定了后续所有攻击步骤的可行性。
1.2 权限层级初判:你是谁?
确认MSSQL后,我们需要立即判断当前数据库连接所使用的账户权限。MSSQL的权限大致分为几个等级:
sysadmin(sa):服务器级最高权限,可执行任何操作。db_owner:数据库所有者,在该数据库内拥有极高权限,但通常不能跨库执行系统级命令。public:最低权限,只能访问授权的对象。
使用以下查询进行快速判断:

&spm=1001.2101.3001.5002&articleId=154593689&d=1&t=3&u=22e8850e949e4212a27ea62ead5fc319)
7721

被折叠的 条评论
为什么被折叠?



