这次比赛做了一个web题,知识点挺多的,但做题经验还是不够,希望以后再接再厉~
0x01 java代码审计
第一步粗略看了看,大致判断了一下题目框架,典型的SSH项目:大致是springboot整合shiro 实现了一个用户登陆,然后重写了CredentialMatcher做的md5密码校验。然鹅,也就是第一步习惯性对java代码功能以及框架的判断让我忽视了很多重点,再加上返回头里面rememberme的信息,导致一上午都纠结在shiro的反序列化漏洞上了。
header
后面在mote的提示下,重点去看了pom.xml,啊,发现自己漏了很多。首先shiro是最新版本(其实这里之前就看到了,但我一直认为shiro的这个漏洞与版本关系不大,重点在密钥的泄露,但细想想这时候出题人标注出来版本肯定是有其用意的,这里一上午陷入死胡同了),然后便注意到了xstream是1.4.7版本,巧的是该版本并不在xstream RCE漏洞影响范围内。果然不能偷懒,细心点继续看代码。
pom.xml
重新审视一遍代码,发现自己着实漏了很多重点,对java代码的敏感性还是不大够。首先loaddocument的load是DOM Read XML,这里就很熟悉了,显然是XXE。然后转到convert,调用了xstream,对此功能点也表示怀疑,但由于测试用户权限问题,暂时先没法儿进行判断。于是xxe走起~
apicontroller
load方法
xstream
0x02 漏洞入口
一波xxe测试下来,也没有读到什么有用的信息。此时放了个tip,提示重点并不在xxe。果然,升级赛并没有那么简单。重新看了下源码,发现mysql账号密码都给出来了,又想到convert功能点需要高权限,便怀疑是XXE配合SSRF登录mysql读admin密码。又尝试了一波gopher连接mysql,并没有任何响应,大概率并不支持该协议。于是搜了一下java下的可用协议,想起了netdoc,果然查看历史命令的时候发现了一个sql文件。
xxe
0x03 XStream Rce
有报错,但接下去就没思路了,这里一度怀疑大佬们拿了个0day来玩(生无可恋的绝望)......
秉承着不抛弃不放弃的理念,找到了XStream-Rce-空指针CTF一月内部赛Writeup这篇博客,这才有了些头绪。前面的链跟s2-052是一样的,后面则是利用defineclass来做。真的是甘拜下风🤜有时间再好好记录一下这边的学习历程和复现过程。
学习链接:
1、shiro反序列化漏洞
2、java xxe漏洞写法与防御
3、不同库的java xxe漏洞
4、gopher连接mysql
5、java xxe协议思路
6、https://github.com/mbechler/marshalsec
网友评论