风炫安全Web安全学习第四十节课 反序列化漏洞攻击利用演示

0x02 反序列化漏洞利用

反序列化漏洞的成因在于代码中的 unserialize() 接收的参数可控,从上面的例子看,这个函数的参数是一个序列化的对象,而序列化的对象只含有对象的属性,那我们就要利用对对象属性的篡改实现最终的攻击。

01对象注入

当用户的请求在传给反序列化函数unserialize()之前没有被正确的过滤时就会产生漏洞。因为PHP允许对象序列化,攻击者就可以提交特定的序列化的字符串给一个具有该漏洞的unserialize函数,最终导致一个在该应用范围内的任意PHP对象注入。

对象漏洞出现得满足两个前提:

一、unserialize的参数可控。
二、 代码里有定义一个含有魔术方法的类,并且该方法里出现一些使用类成员变量作为参数的存在安全问题的函数。

<?php
class A{var $test = "demo";function __destruct(){echo $this->test;}
}
$a = $_GET['test'];
$a_unser = unserialize($a);
?>

比如这个列子,直接是用户生成的内容传递给unserialize()函数,那就可以构造这样的语句

?test=O:1:"A":1:{s:4:"test";s:5:"lemon";}

在脚本运行结束后便会调用_destruct函数,同时会覆盖test变量输出lemon。

发现这个漏洞,便可以利用这个漏洞点控制输入变量,拼接成一个序列化对象。
再看下面这个例子:

<?php
class A{var $test = "demo";function __destruct(){@eval($this->test);//_destruct()函数中调用eval执行序列化对象中的语句}
}
$class = $_GET['class'];
$test_unser = unserialize($class); // 反序列化同时触发_destruct函数
?>

其实仔细观察就会发现,其实我们手动构造序列化对象就是为了unserialize()函数能够触发__destruct()函数,然后执行在__destruct()函数里恶意的语句。

所以我们利用这个漏洞点便可以获取web shell了

02其他Magic function的利用

但如果一次unserialize()中并不会直接调用的魔术函数,比如前面提到的__construct(),是不是就没有利用价值呢?非也。类似于PWN中的ROP,有时候反序列化一个对象时,由它调用的__wakeup()中又去调用了其他的对象,由此可以溯源而上,利用一次次的“fuzz”找到漏洞点

<?php
class test{function __construct($test){$fp = fopen("shell.php","w") ;fwrite($fp,$test);fclose($fp);}
}
class test2{var $test = '123';function __wakeup(){$obj = new test($this->test);}
}$class = $_GET['test'];
$class5_unser = unserialize($class);

03 普通方法的使用

前面谈到的利用都是基于“自动调用”的magic function。但当漏洞/危险代码存在类的普通方法中,就不能指望通过“自动调用”来达到目的了。这时的利用方法如下,寻找相同的函数名,把敏感函数和类联系在一起。

<?php
class fengxuan {var $test;function __construct() {$this->test = new class2();}function __destruct() {$this->test->action();}
}
class class2 {var $test2;function action() {eval($this->test2);}
}
$class6 = new fengxuan();
unserialize($_GET['test']);?>

本意上,new一个新的fengxuan对象后,调用__construct(),其中又new了class2对象。在结束后会调用__destruct(),其中会调用action(),从而执行代码。

04反序列化高级攻击

phar:// 如何扩展反序列化的攻击面的
来自2017 年的 hitcon Orange 的一道 0day 题

原来 phar 文件包在 生成时会以序列化的形式存储用户自定义的 meta-data ,配合 phar:// 我们就能在文件系统函数 file_exists() is_dir() 等参数可控的情况下实现自动的反序列化操作,于是我们就能通过构造精心设计的 phar 包在没有 unserailize() 的情况下实现反序列化攻击,从而将 PHP 反序列化漏洞的触发条件大大拓宽了,降低了我们 PHP 反序列化的攻击起点。

通过以上的例子总结一下寻找 PHP 反序列化漏洞的方法或者说流程

(1) 寻找 unserialize() 函数的参数是否有我们的可控点
(2) 寻找我们的反序列化的目标,重点寻找 存在 wakeup() 或 destruct() 魔法函数的类
(3) 一层一层地研究该类在魔法方法中使用的属性和属性调用的方法,看看是否有可控的属性能实现在当前调用的过程中触发的
(4) 找到我们要控制的属性了以后我们就将要用到的代码部分复制下来,然后构造序列化,发起攻击

0x03 防御措施

1.严格的把控 unserailize() 函数的参数,不要给攻击者任何输入的可能
2.在文件系统函数的参数可控时,对参数进行严格的过滤。
3.严格检查上传文件的内容,而不是只检查文件头。
4.在条件允许的情况下禁用可执行系统命令、代码的危险函数。

0x04 参考

http://blog.evalshell.com/2021/01/05/风炫安全web安全学习第四十节课-反序列化漏洞攻击/

https://www.k0rz3n.com/2018/11/19/%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E5%B8%A6%E4%BD%A0%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3PHP%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/

https://chybeta.github.io/2017/06/17/%E6%B5%85%E8%B0%88php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/

风炫安全Web安全学习第四十节课 反序列化漏洞攻击利用演示相关推荐

  1. 风炫安全Web安全学习第四十三节课 路径遍历漏洞

    风炫安全Web安全学习第四十三节课 路径遍历漏洞 路径遍历 0x01 漏洞概述 路径遍历攻击(也称作目录遍历)的目标是访问web根目录外存储的文件和目录.通过操纵使用"点-斜线(-/)&qu ...

  2. 风炫安全WEB安全学习第四十四节课 敏感信息泄漏

    第四十四节课 敏感信息泄漏 敏感信息泄漏 0x01 漏洞简介 敏感数据包括但不限于:口令.密钥.证书.会话标识.License.隐私数据(如短消息的内容).授权凭据.个人数据(如姓名.住址.电话等)等 ...

  3. 风炫安全Web安全学习第三十九节课 反序列化漏洞基础知识

    风炫安全Web安全学习第三十九节课 反序列化漏洞基础知识 反序列化漏洞 0x01 序列化相关基础知识 0x01 01 序列化演示 序列化就是把本来不能直接存储的数据转换成可存储的数据,并且不会丢掉数据 ...

  4. 风炫安全web安全学习第二十八节课 CSRF攻击原理

    风炫安全web安全学习第二十八节课 CSRF攻击原理 CSRF 简介 跨站请求伪造 (Cross-Site Request Forgery, CSRF),也被称为 One Click Attack 或 ...

  5. 风炫安全web安全学习第二十九节课 CSRF防御措施

    风炫安全web安全学习第二十九节课 CSRF防御措施 CSRF防御措施 增加token验证 对关键操作增加token验证,token值必须随机,每次都不一样 关于安全的会话管理(SESSION) 不要 ...

  6. 风炫安全Web安全学习第二节课 HTML基础

    学习地址:HTML基础 html基础 html表单 html常用标签 前端攻防中常用的一些手法 反射性XSS Dom-based型XSS 存储型XSS 学习的网站:https://www.w3scho ...

  7. JAVA学习第四十六课 — 其它对象API(二)Date类 amp; Calendar类(重点掌握)

    Date类(重点) 开发时,会时常遇见时间显示的情况,所以必须熟练Date的应用 <span style="font-family:KaiTi_GB2312;font-size:18p ...

  8. JSP学习笔记(四十九):抛弃POI,使用iText生成Word文档

    POI操作excel的确很优秀,操作word的功能却不敢令人恭维.我们可以利用iText生成rtf文档,扩展名使用doc即可. 使用iText生成rtf,除了iText的包外,还需要额外的一个支持rt ...

  9. JavaScript学习(四十九)—构造方法、原型、对象图解

    JavaScript学习(四十九)-构造方法.原型.对象图解

最新文章

  1. centos导出mysql数据库_centos5.8系统下MySQL数据库导出与导入操作
  2. java中解决Launch configuration TimezoneDump references non-existing project问题
  3. SQL SERVER 2005 CTE(通用表达式)
  4. Java设计模式之迭代器模式
  5. Flowable 数据库表结构 ACT_ID_INFO
  6. Java 对用户密码加密(Jeecg 登录密码加密方式)MD5andDES方式
  7. python round保留小数位_Python-其他-round()保留小数位时遇到的问题
  8. sqlserver的for xml path和mysql的group_concat的区别
  9. [转]Kali-linux安装之后的简单设置
  10. shareplex三点同步配置
  11. Javascript特效:普通轮播图
  12. Axure RP 8下载
  13. 图片标注工具LabelImg安装与使用
  14. BugKu 旋转跳跃(mp3stego(mp3隐写工具)的使用)
  15. 链表在java中的应用_Java链表
  16. mysql 8 my.ini skip_mysql8.0版本skip-grant-tables出现的新问题
  17. 网课公众号搜题接口获取教程
  18. linux winqq 不能输入中文的解决办法
  19. [Irving]字符串相似度-字符编辑距离算法(c#实现)
  20. kile编辑器有关使用说明

热门文章

  1. Java读取Json文件内容
  2. [html] 浏览器的默认字体大小是多少?怎么设计它的基准?
  3. 算法笔记——后缀数组
  4. 视频剪辑有这6个高清视频素材库就够了
  5. XSS-11注入靶场闯关(小游戏)——第十一关
  6. 物联网卡购买途径有哪些?
  7. Jedis的简单介绍和基本使用
  8. 【UE4 004】LandscapeGrassType地形植被类
  9. PHPExcel类导入excel表带图片
  10. vue实现验证码输入