极客大挑战JAVA题目WP
2023-12-28 15:11:7 Author: mp.weixin.qq.com(查看原文) 阅读量:1 收藏

Java该题目源码位于 https://github.com/yaklang/yaklang/tree/geek2023)  

分析

打开后是一个登录框。

登录

登录是明文传输的,可以直接从源码看密码,也可以爆破一下

通过Header相似度可以找出登录成功的认证信息:admin123456

登录后是一个表单,修改下信息保存,抓包查看。可以看见保存时先调用了/marshalinfo接口对信息序列化,又调用invoke将序列化信息传给后端更新信息。

对序列化信息解析下,可以看到关键字my serilizersr,猜测是魔改了writeObject方法

除此还可以看到一些信息,包括姓名、性别、年龄、和secretsecret是一个文件路径,猜测可以修改文件路径,读取任意文件

可以先尝试直接修改/tmp/admin_secret

改了后调用更新接口

刷新网页,发现性别修改成功,但是secret没修改成功,看来只会修改namesexage

题目给了jar包,直接看源码吧,使用jd打开可以看见源码结构

先看更新接口,对输入内容反序列化,然后对旧信息更新(只更新了namesexagehash),然后对更新后的信息进行了序列化,储存到redis

再看inputouput,对序列化过程进行了一些魔改

可以看见User重写了writeObjectreadObject

序列化时把所有字段使用分隔符拼接存到一个字符串中,还有一个hash的字符串,和我们在codec中看到的O.oadminO.o男O.o10O.o/tmp/admin_secret-admin-男-10-/tmp/admin_secret就对得上了

但是注意到,在拼接是跳过了一个字段,也就是hash,所以拼接结果是[hash(隐藏)]-admin-男-10-/tmp/admin_secret

再看反序列化时,是直接split,然后遍历字段赋值。

反序列化漏洞

如果直接修改secretFile字段,在调用update接口时不会更新secretFile,但是会更新hash,而hash又处于拼接时的第一个字段,所以可以造成字符串逃逸的效果。

所以在前面脚本基础上,修改rep1(hash字段)

但发生报错

在源码中可以看到,hash做了过滤,不可以存在O.o

Java split特性

javaString.split参数其实是一个正则,所以可以这样绕过所以O.o可以替换为O<任意字符>o绕过

发送payload,更新后可以看到成功读取flag

END

  YAK官方资源 

Yak 语言官方教程:
https://yaklang.com/docs/intro/
Yakit 视频教程:
https://space.bilibili.com/437503777
Github下载地址:
https://github.com/yaklang/yakit
Yakit官网下载地址:
https://yaklang.com/
Yakit安装文档:
https://yaklang.com/products/download_and_install
Yakit使用文档:
https://yaklang.com/products/intro/
常见问题速查:
https://yaklang.com/products/FAQ

长按识别添加工作人员
开启Yakit进阶之旅


文章来源: https://mp.weixin.qq.com/s?__biz=Mzk0MTM4NzIxMQ==&mid=2247518601&idx=1&sn=66c65920308241bee8a9d36efaa25305&chksm=c2d1f52df5a67c3b6ce7b9e82f1f89ebf558cc4ac6e36f93e24964acfb83989813b80d3e1cc7&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh