mysql osshell_sqlmap --os-shell原理

前言

当数据库为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原理。

注入

必要条件:

拥有网站的写入权限

Secure_file_priv参数为空或者为指定路径。

普通注入--os-shell主要是通过上传一个sqlmap的马,然后通过马来进行命令执行。

测试环境:

操作系统: Microsoft Windows Server 2012 Standard

数据库:Mysql 5.1.60

脚本语言:PHP 5.4.45

Web容器:Apache 2.4.39

利用sqlmap进行注入检测。

530243d19a3f2970826dacc15a1e6862.png

然后执行--os-shell。

9f0ea5500112874b96f34674b6bb5844.png

这个时候sqlmap主要做了三件事情:

1、进行目标的一个基础信息的探测。

2、上传shell到目标web网站上。

3、退出时删除shell。

wireshark捕获数据包,只查看http数据包。

f0b59cfd8650f037abd7a6fe581bf54f.png

1、sqlmap上传一个上传功能的马。

e6fa053724ea67a6bd37066d64317268.png

0e13e4f5ddb99fec9050812f2effa248.png

eff7937106195935b68fc6782c2adb5a.png

追踪http流可以看到内容被url编码了,解开后可以看到是通过into outfile进行文件的写入。

马的内容进行了16进制编码,解开后查看代码就可以发现是一个上传功能的马。

2、通过上传的马进行shell的上传。

24f81dff069bd0efa7632425748caf04.png

追踪http流可以看到body为shell的内容。

3、shell传参进行命令执行。

557eda91b208df0ee8478695f70dbfad.png

4、删除shell。

becc1fb9f3340c22aa812cfa3fd39495.png

执行命令删除shell。

Database

数据库支持外连,通过Sqlmap执行--os-shell获取shell。

Sqlserver

必要条件:

数据库支持外连

数据库权限为SA权限

Sqlserver --os-shell主要是利用xp_cmdshell扩展进行命令执行。

测试环境:

操作系统:Microsoft Windows Server 2016 Datacenter

数据库:Microsoft SQL Server 2008

利用Sqlmap进行数据库连接。

sqlmap -d "mssql://uset:password@ip:port/dbname"

fdf2a6d647cf7d40d5b9e5e5a45998ea.png

sqlmap默认不自带pymssql,需要手动下载。

执行命令python -m pip install pymssql下载,然后连接成功。

60d0a130ed5617673a06e09f75c22aba.png

执行--os-shell。

3fca47939e3f182789a2f61ccefbb772.png

这个时候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;

e1965385e4cd81f570f61cd7f3e5cd3c.png

在执行RECONFIGURE;时sqlmap报语法错误。

写一个python脚本调用下载的pymssql模块进行排错。

可以执行select @@version;命令

4aab63a8dd3f0f48dba4d82a81c04ecd.png

执行RECONFIGURE;命令的时候的报错和sqlshell执行时的报错一样。

0b805ccb81673f478efddcd785b74d20.png

由于sqlmap调用的是pymssql模块进行数据库的链接,所以这个地方要开启xp_cmshell,就必须利用其他工具进行开启。利用navicat进行数据库连接。

af95c49117343f1311aa14627aec26f4.png

然后执行命令开启xp_cmdshell。

c2a47d32ddddf7be636c430bc6d539f5.png

开启后,可以在navicat里面执行命令,或者sqlmap使用--os-shell进行命令执行。

ca3b3280333ab2e6dba37568c9e254ef.png

51d7b7c13a77bc38bc7fc0e27eabd168.png

若从一开始就使用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流。

5ee6e1cc2b94e35634ae732d13889879.png

我将代码复制到文本中,替换掉.。

35d94dc38e9284f7759df2076d94f8a7.png

sqlmap会在执行我们输入的命令之前执行ping -n 10 127.0.0.1和echo 1,也就是①②,③开始就是我们输入的命令,这里命令都被进行16进制编码了。

Mysql

数据库支持外连

Secure_file_priv参数为空或者为指定路径。

对mysql目录存在写入权限。

针对版本大于5.1,需要存在/lib/plugin目录。

Mysql --os-shell主要利用的原理是通过udf执行命令,在Mysql Udf提权这一篇文章中我讲得比较详细了,可以去看看。

测试环境:

操作系统:Microsoft Windows Server 2012 Standard

数据库:Mysql 5.1.60

利用Sqlmap进行数据库连接。

c86cb3fc13f59b9c8754da0801fe8885.png

安装pymysql后再次进行连接,连接后会显示数据库大概的版本。

059bb1736ed4632a3aa96f34df22591c.png

执行sqlmap -d --os-shell。

11d6c0137fbfdbf5f5bda94cf2aeba61.png

这个时候sqlmap主要做了五件事情:

1、连接Mysql数据库并且获取数据库版本。

2、检测是否为数据库dba。

3、检测sys_exec和sys_eval2个函数是否已经被创建了。

4、上传dll文件到对应目录。

5、用户退出时默认删除创建的sys_exec和sys_eval2个函数。

wireshark捕获数据包,追踪TCP流。

这里我就直接贴@xz老锥的图,他分析的很详细。

82e49c87330ed953b11a63b24d83f51b.png

写在最后

本文若有差错,请务必斧正

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值