25上半年java题目随记
java随记
总结一下25年上半年打的比赛之前赛后的复现笔记,以及最近看到的一些比赛的思路
还有想来一波高产(都是之前欠下的,想学的太多了,结果之前刚开始搞一点就会又看到文章又想学习又把这个放下了,长期以往欠下了挺多的),然后就老老实实沉淀一下,不知道能不能撑住学习完这些,我太懒了
25 ccb&ciscn 半决赛 TimeCapsule
其他逻辑不管,sink点是readObject,直接看重写的ObjectInputStream和给的一个类
给了个InvocationHandler的实现类,说明要用动态代理走invoke方法
限制了反序列化的类只能是com.ctf下或是java包下的
直接说解法,PriorityQueue然后走Comparator的代理触发invoke调用getter,然后调用SignedObject的getObject
这一题当时攻击想不到,fix倒是容易想,但是写repair.sh脚本时应该先杀死原来的进程,因为这个问题最后一轮才拿分,要是早点解出来,说不定就可以进决赛了,唉,遗憾啊
25 软件系统半决赛 justDeserialize
javax.management.BadAttributeValueExpException
com.sun.org.apache.xpath.internal.objects.XString
java.rmi.MarshalledObject
java.rmi.activation.ActivationID
javax.swing.event.EventListenerList
java.rmi.server.RemoteObject
javax.swing.AbstractAction
javax.swing.text.DefaultFormatter
java.beans.EventHandler
java.net.Inet4Address
java.net.Inet6Address
java.net.InetAddress
java.net.InetSocketAddress
java.net.Socket
java.net.URL
java.net.URLStreamHandler
com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
java.rmi.registry.Registry
java.rmi.RemoteObjectInvocationHandler
java.rmi.server.ObjID
java.lang.System
javax.management.remote.JMXServiceUR
javax.management.remote.rmi.RMIConnector
java.rmi.server.RemoteObject
java.rmi.server.RemoteRef
javax.swing.UIDefaults$TextAndMnemonicHashMap
java.rmi.server.UnicastRemoteObject
java.util.Base64
java.util.Comparator
java.util.HashMap
java.util.logging.FileHandler
java.security.SignedObject
javax.swing.UIDefaults
这个黑名单应该算限制的比较死了,readObject到toString好像没有能用的
这里说一下,我认为复现不仅要知道解法,还应该结合当时的实际环境
半决赛是线下,一般都是不出网的,现在网上都是打出网的jndi,我认为就复现来说是不对的
springaop
这个我很早就看过,但认识理解不深,导致不太会修改,当时也就做不出来
直接看这个就行了
对于文章中的Ldap_SERIALIZE_DATA
和jndi_Reference
都是需要出网才能攻击
但是应该是不出网的
解决方法可以直接调用DruidDataSource的getter
因为DruidDataSource的getConnection在连接时有个参数可以执行初始化sql语句,直接利用这个调用hsqldb的二次反序列化即可
hibernate
这个学过一点,但忘光了
软件系统安全赛2025华东赛区半决赛wp-web - Potat0w0 (potatowo.top)
hibernate也可以调用getter
同理,文章使用LDAPAttribute
发起jndi同样需要出网
跟上面一样直接调用DruidDataSource的getter
可能的出题人思路
很明显诱导我们,PriorityQueue然后走User的compare,能够调用任意类的compare方法,并且有两个参数
应该就是让我们去找什么类的compare方法能够走到sink点或者调用getter方法
他那个黑名单感觉是诱导我们说jdk.jfr、com.sun感觉会有东西,但我没找到,当然也可以从hsql或hibernate下手
总之就是找利用
tabby
match(source:Method) where source.NAME ='compare' and source.HAS_PARAMETERS = true and source.PARAMETER_SIZE = 2 and source.SUB_SIGNATURE contains "compare(java.lang.Object,java.lang.Object)"
return source
大概这样查吧
然后看到org.hibernate.type.ComponentType#compare
方法
这不跟hibernate后半段长一样吗
应该拼接上就行
看着应该没问题,有兴趣的可以试一下
或者有没有大佬找一下其他compare能利用的
25 软件系统决赛
[2025 软件赛决赛 记录 | A day in AsaL1n](https://asal1n.github.io/2025/05/20/2025 软件赛总决赛记录/)只能说师傅太强了
backup
该dedecms版本后台有个cve,但不知道怎么进入后台
结束后讨论提到可以本地搭建数据库,然后连接我们本地数据库
我当时想到的是把他的网站重置一遍(但没啥用)
学校另一个队的师傅进了后台,但不会打,asalin师傅却直接找到个任意文件读取是在太强了
gld-xs
确实不会审计这种代码较多的tomcat,没啥思路而且都在看另一题所以基本没咋看
看了下审计思路
有个学生权限,先找有权限的路由,然后看对应逻辑,然后就发现代码存在反序列化漏洞,剩下就是加解密问题
就学一下审计思路
misc题忘了叫啥
pickle反序列化,是在server端,我们要用pwntools去连接他
主要是要处理无回显问题,这里能访问到那个self,可以用self.send来进行回显
然后本地跑通了,远程一直不行,直到后面出了提示才做出来,末尾加个EOF
tm的,就是这个一直被卡着,浪费大把时间
2025SUCTF
sujava
当时瞄了一眼,但是没搞懂作者的混淆是什么意思,然后不了了之
现在看一下思路
host处存在注入,可以使用官方文档提到的不使用:
的写法连接
jdbc:mysql://address=(host=127.0.0.1)(port=3306)(database=test)(user=)
然后waf可以使用URL编码绕过(每个字符都要)
ez_solon
alibaba的sofa hessian,自带黑名单(debug才能看到)
有fastjson而且给了toString,就是让我们找toString——》getter能够利用的
看到依赖中有h2数据库,我们可以想到找getConnection
tabby找一下可以找到UnpooledDataSource
我没找到附件,没法用tabby跑一下了
当时我没咋打,看了下队里没人做这题感觉挺难就算了
然后赛后看到wp,其实找getConnection直接找DriverManager或DataSource的子类就行(不一定,但方便)
这里恰好就是
然后有securityManager,在命令执行时先System.setSecurityManager(null),然后执行java命令即可
2024 ciscn bookmanager
RCE vulnerabilities · Issue #73 · opensolon/solon (github.com)
当使用solon框架的GateWay,并且引入官方依赖solon.serialization.hessian
时,如果请求的api
带有参数,请求包的body
部分会用hessian
进行反序列化, 从而导致远程命令执行。
POST /api/rest/book/addBook HTTP/1.1
Content-Type: application/hessian
Host: 127.0.0.1:8080
xxxxxx
在readObject前有个黑名单,说是KMP可以用utf-8-overlong-encoding绕过
然后又会发现hessian-lite
中的ClassFactory
里又有黑名单
对比可以发现黑名单2少了sun.print.
看国产web框架Solon-v2.5.11RCE漏洞 (pankas.top)
sun.print.UnixPrintServiceLookup
就调用这个的getter
finally
就这样,要是还有就继续添加点思路