面试必问|一文带你了解sqlmap --os-shell原理分析
一直是面试的时候的高频考点,并且实战中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来获取后端一个可写的临时目录
主要有如下几种临时路径
- 如果命令行参数--tmp-path指定了临时目录,就使用命令行配置的
- SELECT SERVERPROPERTY('ErrorLogFileName') sqlserver错误日志的位置
(在sqlserver测试无效)
- 如果是windows系统且是直连,临时目录就是%TEMP%
- 如果是linux直连的话,临时目录就是/tmp
- 未配置直连,但后端为win2000或者NT,则是C:/WINNT/Temp,xp则是C:/Documents and Settings/All Users/Application Data/Temp
- 如果是其他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的马,然后通过马来进行命令执行。
条件
- 网站写入权利
- Secure_file_priv参数为空或者为指定路径
- 知道网站绝对路径
- 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做的事情
- 进行目标的一个基础信息的探测。
- 上传shell到目标web网站上。
追踪http流可以看到内容被url编码了,解开后可以看到是通过into outfile进行文件的写入。
马的内容进行了16进制编码,解开后查看代码就可以发现是一个上传功能的马。
利用tmpukjhb.php上传了一个tmpbezal.php的文件,tmpbezal.php这个文件可以用来执行系统命令,并且将结果返回出来
- 退出时删除shell。
sqlmap udf提权
UDF(user defined function)用户自定义函数,mysql的一个拓展接口,用户可以通过自定义函数实现在mysql中无法方便实现的功能,其添加的新函数都可以在sql语句中调用,就像调用本机函数一样
条件
- mysql版本大于5.1,udf.dll必须放置在mysql安装目录的lib\plugin文件下[该目录默认不存在,可以利用ntfs特性创建文件夹]
- mysql版本小于5.1,udf.dll在win2003下放置于c:\windows\system32目录,在win2000下放置在c:\winnt\system32目录
- 掌握mysql数据库的账户,从拥有对mysql的insert和delete的权限,以创建和抛弃函数
- 拥有可以将udf.dll写入相关目录的权利
sqlmap -d "" -os-shell
- 连接mysql数据库并且获取数据库版本
- 检测数据库是否为dba
- 检测sys_exec和sys_eval 2个函数是否已经被创建
- 上传dll文件到对应目录
- 用户退出时默认删除创建的sys_exec和sys_eval2个函数
sqlserver
一般支持堆叠注入,高权限
不支持堆叠的话是无法进行update的,update中可以写select,但select中不能写update,可以看看数据库是啥权限,能不能拿shell之类的 |
读的iis配置文件,找到一个没得中文的web写马,然后上传一个免杀马 | 把sqlmap挂上代理,截断以后手动改中文字符串就好了 |
sqlserver --os-shell主要是利用xp_cmdshell扩展进行命令执行的
sqlmap做的事情
- 识别当前数据库类型,然后打印出来
- 检测数据库是否为dba,也就是查看是否为sa权限
- 检测是否开启了xp_cmdshell,如果没有开启,sqlmap就会尝试开启
- 若未成功开启xp_cmdshell,可以执行--sql-shell进行手动开启
- 点赞
- 收藏
- 关注作者
评论(0)