面试必问|一文带你了解sqlmap --os-shell原理分析

举报
亿人安全 发表于 2023/05/16 11:28:52 2023/05/16
【摘要】 一直是面试的时候的高频考点,并且实战中getshell常用相关联的面试题为sql注入getshell的条件和方式首先有关os-shell的处理函数被定义在plugins/generic/taskeover.py文件中代码简要分析首先isStackingAvailable函数是判断是否支持堆叠注入,如果允许该函数返回Trueconf.direct主要是当用户配置了直接连接数据库时存在数据,为一...

一直是面试的时候的高频考点,并且实战中getshell常用

相关联的面试题为sql注入getshell的条件和方式


首先有关os-shell的处理函数被定义在plugins/generic/taskeover.py文件中


代码简要分析

首先isStackingAvailable函数是判断是否支持堆叠注入,如果允许该函数返回True

conf.direct主要是当用户配置了直接连接数据库时存在数据,为一个字符串,类似于

conf.direct = "mysql://root:testpass@127.0.0.1:3306/testdb"

如果两者都不满足,但是后端数据库为mysql的时候,会令web=True,后续会使用一个web的shell来进行后续操作

接着就用getRemoteTempPath来获取后端一个可写的临时目录

主要有如下几种临时路径

  1. 如果命令行参数--tmp-path指定了临时目录,就使用命令行配置的
  2. SELECT SERVERPROPERTY('ErrorLogFileName') sqlserver错误日志的位置

(在sqlserver测试无效)

  1. 如果是windows系统且是直连,临时目录就是%TEMP%
  2. 如果是linux直连的话,临时目录就是/tmp
  3. 未配置直连,但后端为win2000或者NT,则是C:/WINNT/Temp,xp则是C:/Documents and Settings/All Users/Application Data/Temp
  4. 如果是其他windows系统,统一为C:/Windows/Temp


然后就是对临时路径字符串做一些处理,包括将\变成\\等,以适用不同的后端数据库

接着就是initEnv函数

该函数完成了环境方面的一些设置,是os-shell的关键

_initRunAs函数只有在配置了--dbms-cred参数是会生效,主要是后端为sqlserver时候,当用户为DBA权限,提示开始openrowset参数,该语句如下

EXEC master..sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC master..sp_configure 'Ad Hoc Distributed Queries', %ENABLE%;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE WITH OVERRIDE

在SQL Server中使用OPENROWSET访问ORACLE数据库,在2005和2008中是默认关闭的

接着就是webInit这个函数的用途是在远端服务器文档根目录下写一个web后门,支持php,asp,aspx和jsp这4种后门,之后会进行绝对路径的探测,主要是通过parseFilePaths来实现的

也就是通过正则去匹配页面内容

getManualDirectories也会返回一些常见的目录

这两行定义了后门的名字,shell的内容从/data/shell中获取,shell的内容都是加了密的

backdoorName = "tmpb%s.%s" % (randomStr(lowercase=True), self.webPlatform)
backdoorContent = getText(decloak(os.path.join(paths.SQLMAP_SHELL_PATH, "backdoors", "backdoor.%s_" % self.webPlatform)))
stagerContent = getText(decloak(os.path.join(paths.SQLMAP_SHELL_PATH, "stagers", "stager.%s_" % self.webPlatform)))

接着看上传用的语句

OR randInt=randInt LIMIT 0,1 INTO OUTFILE '%OUTFILE%' LINES TERMINATED BY 0x%HEXSTRING%-- -

然后请求相应存在注入点的页面并将页面返回,如果这种方法失败,就会尝试使用联合注入的方式进行上传sqlQuery = "%s INTO DUMPFILE '%s'" % (fcEncodedStr, remoteFile)使用的是into dumpfile的方式


后续通过上传的文件进一步上传一个exe文件

最后执行一个echo命令,看是否成功上传.

当所有命令完成后,清除上传的所有文件,将所有数据库改动还原


技巧

sqlmap自带的-v参数

--level=5 --risk=3 --batch

0:只显示 Python 的 tracebacks 信息、错误信息 [ERROR] 和关键信息 [CRITICAL];

1:同时显示普通信息 [INFO] 和警告信息 [WARNING]; 

2:同时显示调试信息 [DEBUG]; 

3:同时显示注入使用的攻击荷载;

4:同时显示 HTTP 请求; 

5:同时显示 HTTP 响应头; 

6:同时显示 HTTP 响应体。


mysql


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

条件

  1. 网站写入权利
  2. Secure_file_priv参数为空或者为指定路径
  3. 知道网站绝对路径
  4. GPC为off,php主动转义的功能关闭


secure_file_priv 的值,默认为NULL,表示限制不能导入导出

show global variables like '%secure_file_priv%';

secure_file_priv 参数是只读参数,不能使用set global命令修改,打开my.cnf 或 my.ini,加入以下语句后重启mysql


查看官方文档,secure_file_priv参数用于限制LOAD DATA, SELECT …OUTFILE, LOAD_FILE()传到哪个指定目录。
secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。
secure_file_priv 为 /tmp 时,表示限制mysqld只能在/tmp目录中执行导入导出,其他目录不能执行。
secure_file_priv 没有值时,表示不限制mysqld在任意目录的导入导出。

在知晓绝对路径的情况下,数据库版本5.6以下可INTO OUTFILE进行写入。5.6以上和包括5.6需开启general log。

利用 MySQL 进行文件(特别是木马文件)的写入,常常会用到 SELECT INTO FILE 这样一条语句,但是这条 SQL 语句的可写出路径会受到 secure-file-priv 设置项的限制。但可以利用 MySQL 的 general log 进行文件写入的操作。[root权限]

SET GLOBAL general_log=on;
SET GLOBAL general_log_file='目标文件路径'; 

SELECT '要写入的文件内容';


sqlmap做的事情

  1. 进行目标的一个基础信息的探测。
  2. 上传shell到目标web网站上。

追踪http流可以看到内容被url编码了,解开后可以看到是通过into outfile进行文件的写入。
马的内容进行了16进制编码,解开后查看代码就可以发现是一个上传功能的马。

利用tmpukjhb.php上传了一个tmpbezal.php的文件,tmpbezal.php这个文件可以用来执行系统命令,并且将结果返回出来

  1. 退出时删除shell。


sqlmap udf提权

UDF(user defined function)用户自定义函数,mysql的一个拓展接口,用户可以通过自定义函数实现在mysql中无法方便实现的功能,其添加的新函数都可以在sql语句中调用,就像调用本机函数一样

条件

  1. mysql版本大于5.1,udf.dll必须放置在mysql安装目录的lib\plugin文件下[该目录默认不存在,可以利用ntfs特性创建文件夹]
  2. mysql版本小于5.1,udf.dll在win2003下放置于c:\windows\system32目录,在win2000下放置在c:\winnt\system32目录
  3. 掌握mysql数据库的账户,从拥有对mysql的insert和delete的权限,以创建和抛弃函数
  4. 拥有可以将udf.dll写入相关目录的权利

sqlmap -d "" -os-shell

  1. 连接mysql数据库并且获取数据库版本
  2. 检测数据库是否为dba
  3. 检测sys_exec和sys_eval 2个函数是否已经被创建
  4. 上传dll文件到对应目录
  5. 用户退出时默认删除创建的sys_exec和sys_eval2个函数

sqlserver

一般支持堆叠注入,高权限

不支持堆叠的话是无法进行update的,update中可以写select,但select中不能写update,可以看看数据库是啥权限,能不能拿shell之类的

读的iis配置文件,找到一个没得中文的web写马,然后上传一个免杀马 | 把sqlmap挂上代理,截断以后手动改中文字符串就好了 |

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


sqlmap做的事情

  1. 识别当前数据库类型,然后打印出来
  2. 检测数据库是否为dba,也就是查看是否为sa权限
  3. 检测是否开启了xp_cmdshell,如果没有开启,sqlmap就会尝试开启
  4. 若未成功开启xp_cmdshell,可以执行--sql-shell进行手动开启


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。