当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。
在mysql、PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数,sys_exec()和sys_eval()。那么他创建的这两个函数可以执行系统命令。
在Microsoft SQL Server,sqlmap将会使用xp_cmdshell存储过程,如果被禁(在Microsoft SQL Server 2005及以上版本默认禁制),sqlmap会重新启用它,如果不存在,会自动创建
接下来我会通过注入、SQLSERVER数据库、Mysql数据库进行介绍os shell原理。
必要条件:
普通注入--os-shell主要是通过上传一个sqlmap的马,然后通过马来进行命令执行。
操作系统: Microsoft Windows Server 2012 Standard
数据库:Mysql 5.1.60
脚本语言:PHP 5.4.45
Web容器:Apache 2.4.39
利用sqlmap进行注入检测。
然后执行--os-shell
。
这个时候sqlmap主要做了三件事情:
1、进行目标的一个基础信息的探测。
2、上传shell到目标web网站上。
3、退出时删除shell。
wireshark捕获数据包,只查看http数据包。
1、sqlmap上传一个上传功能的马。
追踪http流可以看到内容被url编码了,解开后可以看到是通过into outfile进行文件的写入。
马的内容进行了16进制编码,解开后查看代码就可以发现是一个上传功能的马。
2、通过上传的马进行shell的上传。
追踪http流可以看到body为shell的内容。
3、shell传参进行命令执行。
4、删除shell。
执行命令删除shell。
数据库支持外连,通过Sqlmap执行--os-shell
获取shell。
必要条件:
Sqlserver --os-shell主要是利用xp_cmdshell
扩展进行命令执行。
操作系统:Microsoft Windows Server 2016 Datacenter
数据库:Microsoft SQL Server 2008
利用Sqlmap进行数据库连接。
sqlmap -d "mssql://uset:password@ip:port/dbname"
sqlmap默认不自带pymssql
,需要手动下载。
执行命令python -m pip install pymssql
下载,然后连接成功。
执行--os-shell
。
这个时候sqlmap主要做了三件事情:
1、识别当前数据库类型,然后打印出来。
2、检测是否为数据库dba,也就是查看是否为sa权限。
3、检测是否开启了xp_cmdshell,如果没有开启sqlmap就会尝试开启。
这个地方Sqlmap未能成功开启xp_cmdshell。
执行--sql-shell
手动开启。
手动开启语句:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
在执行RECONFIGURE;
时sqlmap报语法错误。
写一个python脚本调用下载的pymssql模块进行排错。
可以执行select @@version;
命令
执行RECONFIGURE;
命令的时候的报错和sqlshell执行时的报错一样。
由于sqlmap调用的是pymssql模块进行数据库的链接,所以这个地方要开启xp_cmshell,就必须利用其他工具进行开启。利用navicat进行数据库连接。
然后执行命令开启xp_cmdshell。
开启后,可以在navicat里面执行命令,或者sqlmap使用--os-shell
进行命令执行。
若从一开始就使用navicat或其他工具进行数据库链接的话,就需要手动查看是否为dba,是否开启了xp_cmdshell
扩展进程。
select IS_SRVROLEMEMBER('sysadmin')
查看是否为SA
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell';
查看是否存在xp_cmdshell
扩展进程,显示1为存在。
查询完毕后,和上面的操作依葫芦画瓢就行了。
wireshark捕获数据包,追踪TCP流。
我将代码复制到文本中,替换掉.
。
sqlmap会在执行我们输入的命令之前执行ping -n 10 127.0.0.1
和echo 1
,也就是①②,③开始就是我们输入的命令,这里命令都被进行16进制编码了。
Mysql --os-shell主要利用的原理是通过udf执行命令,在Mysql Udf提权这一篇文章中我讲得比较详细了,可以去看看。
操作系统:Microsoft Windows Server 2012 Standard
数据库:Mysql 5.1.60
利用Sqlmap进行数据库连接。
安装pymysql
后再次进行连接,连接后会显示数据库大概的版本。
执行sqlmap -d --os-shell
。
这个时候sqlmap主要做了五件事情:
1、连接Mysql数据库并且获取数据库版本。
2、检测是否为数据库dba。
3、检测sys_exec
和sys_eval
2个函数是否已经被创建了。
4、上传dll文件到对应目录。
5、用户退出时默认删除创建的sys_exec
和sys_eval
2个函数。
wireshark捕获数据包,追踪TCP流。
这里我就直接贴@xz老锥的图,他分析的很详细。