PHP审计之POP链挖掘
PHP审计之POP链挖掘
前言
续上文中的php反序列化,继续来看,这个POP的挖掘思路。在其中一直构思基于AST去自动化挖掘POP链,迫于开发能力有限。没有进展,随后找到了一个别的师傅已经实现好的项目。
魔术方法
__wakeup() //使用unserialize时触发
__sleep() //使用serialize时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发,file_exists()判断也会触发
__invoke() //当脚本尝试将对象调用为函数时触发
__call
与__callstatic
现实情况下__call
的利用居多,该魔术方法触发的条件是在对象上下文中调用不可访问的方法时触发。
调用流程如下:
$this->a() ==> 当前类a方法 ==> 父类a方法 ==> 当前类__call方法 ==> 父类__call方法
如果触发__call
方法,那么a,即方法名,会作为__call
的方法的第一个参数,而参数列表会作为__call
的方法第二个参数。
来看到代码
function __destruct(){
$this->a->b();
}
这里有2个利用路径,一个是$this->a
中构造一个存在方法的实例化类,另一种方式是找一个不存在b方法并且存在__call
方法的类,当b不存在时,即自动调用__call
。
__callstatic
方法只有在调用到静态方法的时候才能触发
__get
与__set
不存在该类变量或者不可访问时,则会调用对应的__get
方法
$this->a ==> 当前类a变量 ==> 父类a变量 ==> 当前类__get方法 ==> 父类__get方法
__get
代码案例
function __destruct(){
echo $this->a;
}
调用不存在变量a,即会自动触发__get
方法,
数据写入不可访问的变量或不存在的变量即调用__set
function __destruct(){
$this->a = 1;
}
__toString
把类当作字符串使用时触发
$this->_adapterName = $adapterName;
$adapterName = 'xxx' . $adapterName;
POP链挖掘
此前构思的自动化挖掘POP链的功能已经被其他师傅实现了,在此就不班门弄斧了,直接拿现成的来用。
思路其实寻找__destruct
方法,作为入口点,然后寻找一个回调函数作为末端。而中间需要寻找各种中间链,将其串联起来。串联的方法基本上就是一些魔术方法和一些自定义的方法。
项目地址:https://github.com/LoRexxar/Kunlun-M
cp Kunlun_M/settings.py.bak Kunlun_M/settings.py
python kunlun.py init initialize
python kunlun.py config load
python kunlun.py plugin php_unserialize_chain_tools -t C:\kyxscms-1.2.7
结果:
[20:28:51] [PhpUnSerChain] New Source __destruct() in thinkphp#library#think#Process_php.Class-Process
[20:28:51] thinkphp#library#think#Process_php.Class-Process
newMethod Method-__destruct()
[20:28:51] thinkphp#library#think#Process_php.Class-Process.Method-__destruct
MethodCall Variable-$this->stop()
[20:28:51] thinkphp#library#think#Process_php.Class-Process.Method-stop
MethodCall Variable-$this->updateStatus('Constant-false',)
[20:28:51] thinkphp#library#think#Process_php.Class-Process.Method-updateStatus
MethodCall Variable-$this->readPipes('Variable-$blocking', '\ === Constant-DIRECTORY_SEPARATOR ? 627')
[20:28:51] thinkphp#library#think#Process_php.Class-Process.Method-readPipes
MethodCall Variable-$this->processPipes->readAndWrite('Variable-$blocking', 'Variable-$close')
[20:28:51] thinkphp#library#think#console#Output_php.Class-Output
newMethod Method-__call('$method', '$args')
[20:28:51] thinkphp#library#think#console#Output_php.Class-Output.Method-__call.If
FunctionCall call_user_func_array("Array-['Variable-$this', 'block']", 'Variable-$args')
[20:28:51] [PhpUnSerChain] UnSerChain is available.
这其实利用链就清晰了
Process->__destruct ==>Process->stop ==>Process->updateStatus ==> Process->readPipes ==> Output->readAndWrite ==> Output->__call==> call_user_func_array()
参考
如何自动化挖掘php反序列化链 - phpunserializechain诞生记
结尾
但该工具并没有达到我个人的预期,因为该工具中只是使用__destruct
这单个方法作为反序列化的入口点。
PHP审计之POP链挖掘的更多相关文章
- 2019强网杯web upload分析(pop链)
参考链接:https://blog.csdn.net/qq_41173457/article/details/90724943 注意 只要namespace相同那就可以直接实例化同一namespace ...
- Smarty 3.1.34 反序列化POP链(任意文件删除)
Smarty <= 3.1.34,存在任意文件删除的POP链. Exp: <?php class Smarty_Internal_Template { public $smarty = n ...
- php反序列化之pop链构造
本题是某信有一次内部比赛的题目,涉及到pop链的构造问题,所以在这里与大家分享一下 题目 查看源码 逻辑是当参数fn存在且不包含string.zlib.flag这三个字符串时,进行文件包含这里的过滤是 ...
- pop链构造
class Person { private $name; private $sex; private $age; //__set()方法用来设置私有属性 function __set($proper ...
- Java安全之挖掘回显链
Java安全之挖掘回显链 0x00 前言 前文中叙述反序列化回显只是为了拿到Request和Response对象.在这里说的的回显链其实就是通过一连串反射代码获取到该Request对象. 在此之前想吹 ...
- 构造注入链:POP
1.POP链原理简介: 在反序列化中,我们能控制的数据就是对象中的属性值,所以在PHP反序列化中有一种 漏洞利用方法叫"面向属性编程",即POP( Property Oriente ...
- ref:PHP反序列化漏洞成因及漏洞挖掘技巧与案例
ref:https://www.anquanke.com/post/id/84922 PHP反序列化漏洞成因及漏洞挖掘技巧与案例 一.序列化和反序列化 序列化和反序列化的目的是使得程序间传输对象会更加 ...
- PHP审计之PHP反序列化漏洞
PHP审计之PHP反序列化漏洞 前言 一直不懂,PHP反序列化感觉上比Java的反序列化难上不少.但归根结底还是serialize和unserialize中的一些问题. 在此不做多的介绍. 魔术方法 ...
- [置顶] 使用struts拦截器+注解实现网络安全要求中的日志审计功能
J2EE项目中出于安全的角度考虑,用户行为审计日志功能必不可少,通过本demo可以实现如下功能: 1.项目中记录审计日志的方法. 2.struts拦截器的基本配置和使用方法. 3.struts拦截器中 ...
随机推荐
- php Abstract 抽象类 与 Interface的
一.Abstract Class 与 Interface 的构造 抽象类 Abstract Class <?php abstract class A { abstract public func ...
- 【Azure 应用服务】使用PowerShell脚本上传文件至App Service目录
问题描述 使用PowerShell脚本上传文件至App Service目录的示例 脚本示例 对文件进行上传,使用的 WebClient.UploadFile 方法进行上传.当文件夹中包含子目录,执行以 ...
- github push报LibreSSL SSL_connect错误
最近发现在家里push代码到github的时候总是报错,报错内容如下: fatal: unable to access 'https://github.com/MangoDowner/clear-le ...
- 《网页布局基础篇》HTML+CSS单列布局--水平居中,垂直居中,水平垂直居中
https://blog.csdn.net/panlu666_pl/article/details/66480433 一.水平居中 子元素在父元素中水平居中 1.使用 text-align和inlin ...
- html调用swf的语句
<div style="width: 1000px; height: 202px; margin-left: auto; margin-right: auto"> &l ...
- Spring系列.Environment接口
Environment 接口介绍 在 Spring 中,Environment 接口主要管理应用程序两个方面的内容:profile 和 properties. profile 可以简单的等同于环境,比 ...
- Sentry-CLI 使用详解(2021 Sentry v21.8.x)
内容源于:https://docs.sentry.io/platforms/javascript/guides/vue/ 系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创 ...
- Qt+Python开发百度图片下载器
一.资源下载地址 https://www.aliyundrive.com/s/jBU2wBS8poH 本项目路径:项目->收费->百度图片下载器(可试用5分钟) 安装包直接下载地址:htt ...
- 【第十九篇】- Maven NetBeans之Spring Cloud直播商城 b2b2c电子商务技术总结
Maven NetBeans NetBeans 6.7 及更新的版本已经内置了 Maven.对于以前的版本,可在插件管理中心获取 Maven 插件.此例中我们使用的是 NetBeans 6.9. 关于 ...
- split文件切片
文件上传下载过程中经常会遇到网络不稳定,或者传输软件限制传输的文件大小之类的问题.在当今换没有出现很好的软件的时候,一个available方法是将大文件切片,也就是 切成小文件,然后通过其他方法put ...