数据库触发器提权实验

触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的储存过程,它的执行不是由程序调 用,也不是手工启动,而是由事件来触发,当对一个表进行操作(insert,delete,update)时就会激活它执行。触发器经常用于加强数据的完 整性约束和业务规则等。

Mysql User Get Mysql Root With Trigger

问题描述:

a)通过Mysql触发器提权仅仅能获取一个Mysql Root权限的Mysql账号,并不是系统提权(系统提权取决于包括mysql是不是以root方式运行的等等很多因素)。

b)渗透过程中所能利用的触发器提权中,需要提权的账号需要有”File”权限,或者是有能力向mysql的目录下写入文件。

c)Mysql的触发器有6种类型分别是After insert,After delete,After update和Before insert,Before delete,Before update。

在以下版本测试成功

a) CentOS 5.5 && Mysql-5.0.51a

b) Win2003 x86 && Mysql-5.5.24

工作原理:

a) 因为MySQL的触发器以明文文本的形式保存最对应库的目录下面,形式为触发器文件*.TRG和触发器描述文件*.TRN,可以通过select into outfile方式写入(所以需要”File”权限)。

b) Mysql在定义触发器的时候有一个定义触发器执行角色的字段DEFINER,默认的此字段与建立触发器的角色相同(即与’CREATE DEFINER’字段相同)。如果我们可以上传一个执行角色为root的触发器,那么就能以root权限执行触发语句。

c) 根据触发器的原理,我们本地新建一个触发器,然后修改相关配置,如触发角色,触发条件,触发后执行语句等等,制作exp实现提权。

实验环境:

Win2003x86 && Mysql-5.5.24,默认安装Mysql,导入一个xxxCMS的数据库”cms”,并为此数据库建立一个普通权限的用户”test”

Test 账号添加方式:

root执行show databases;的结果:

root执行select User,Host from mysql.user;的结果:

test执行show databases;的结果:

test执行use cms;并查询此数据库上存在的触发器show triggers;

实验过程:

a)本地生成触发器文件:

1.首先在本地的Mysql上建立正常的触发器,建立过程:

以上sql语句执行完毕就会在数据库cms的目录下生成两个文件:

rootme.TRN 和cms_users.TRG。

打开文件,发现DEFINER字段为:test@localhost

我们将其改为root@localhost,使此触发器触发后执行角色为root。

将这两个文件作为后面的提权Exp保留下来。

b)使用test用户登陆Mysql,并查询此数据库上存在的触发器:

经过查询触发器为空,我们把前面我们本地生成好的触发器文件上传到对应的数据库目录下,即cms目录下:

再次查询Triggers:

发现触发器已经写入,前面我们写的触发类型是after update,作用于表cms_users,所以我们这里我们update cms_users这个表来触发。

触发之前mysql.user表:

update cms_users这个表触发执行:

触发之后mysql.user表:

至此,”test”用户所拥有的权限跟”root”用户拥有的权限一致。

**文中部分位置”有可能”出现”不识别”的情况,比如上传文件后仍然查询不到触发器,比如触发了触发器修改了test的权限后发现并未生效。此时 需要重启数据库重新加载配置,至于重启数据库的方式嘛,可以借鉴社工思路。Mysql5.0版本之前的可以利用之前爆出来的栈溢出漏洞造成MySQL Crash重启,达到重新加载配置文件的目的。

*这个栈溢出的原理是使用一个没有grant权限的用户做一个虚假的grant操作,而这个操作是对一个根本不存在但很长(如下攻击实例是10000字符长度的库名,实际达到284个时就会触发)库进行赋权。(http://www.exploit-db.com/exploits/23076/

文中提到的两个文件cms_users.TRG和rootme.TRN

 

Sqlserver 2005 dbo Get Authorization With Trigger

什么是触发器:

触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别 是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、 alter、drop语句。

问题描述:

a)通过Sqlserver的触发器,可以利用执行者的权限执行自定义的命令。

b)渗透过程中可能利用的触发器场景:在设置好触发器以后,等待、诱使高权限用户去触发这个触发器,来实现入侵、提权、留后门等目的。

c)Sqlserver的触发器可以分为两类:DML触发器(After insert,After delete,After update和instead of)和DDL触发器(for)。

实验环境:

Win2003x86 && SqlServer 2005,默认安装Sqlserver,安装一个开源应用siteserver,并建立test用户,不给予服务器角色,数据库角色仅给予dbo和 public权限。并将test库与test用户相互映射。SqlServer的xp_cmdshell已经被恢复。

实验过程:

a)使用test用户建立触发器语句:

b)执行UPDATE操作,是触发器执行:

1)使用UPDATE语句来触发触发器:

使用test用户执行:

2)使用sa用户执行:

那么这就产生一个问题了,如何利用被动触发留后门或渗透攻击?<当拿下一个数据库管理员后,连接数据库,创建隐藏账户,留下触发器,防止管理员账号更改密码>