首页 > 其他分享 >buuctf-web 解题过程

buuctf-web 解题过程

时间:2024-07-18 14:20:16浏览次数:14  
标签:web buuctf name admin clazz 解题 file new POST

[SUCTF 2019]Upload Labs 2

源码

// admin.php
<?php
include 'config.php';

class Ad{

    public $cmd;

    public $clazz;
    public $func1;
    public $func2;
    public $func3;
    public $instance;
    public $arg1;
    public $arg2;
    public $arg3;

    function __construct($cmd, $clazz, $func1, $func2, $func3, $arg1, $arg2, $arg3){

        $this->cmd = $cmd;

        $this->clazz = $clazz;
        $this->func1 = $func1;
        $this->func2 = $func2;
        $this->func3 = $func3;
        $this->arg1 = $arg1;
        $this->arg2 = $arg2;
        $this->arg3 = $arg3;
    }

    function check(){

        $reflect = new ReflectionClass($this->clazz);
        $this->instance = $reflect->newInstanceArgs();

        $reflectionMethod = new ReflectionMethod($this->clazz, $this->func1);
        $reflectionMethod->invoke($this->instance, $this->arg1);

        $reflectionMethod = new ReflectionMethod($this->clazz, $this->func2);
        $reflectionMethod->invoke($this->instance, $this->arg2);

        $reflectionMethod = new ReflectionMethod($this->clazz, $this->func3);
        $reflectionMethod->invoke($this->instance, $this->arg3);
    }

    function __destruct(){
        system($this->cmd);
    }
}

if($_SERVER['REMOTE_ADDR'] == '127.0.0.1'){
    if(isset($_POST['admin'])){
        $cmd = $_POST['cmd'];

        $clazz = $_POST['clazz'];
        $func1 = $_POST['func1'];
        $func2 = $_POST['func2'];
        $func3 = $_POST['func3'];
        $arg1 = $_POST['arg1'];
        $arg2 = $_POST['arg2'];
        $arg2 = $_POST['arg3'];
        $admin = new Ad($cmd, $clazz, $func1, $func2, $func3, $arg1, $arg2, $arg3);
        $admin->check();
    }
}
else {
    echo "You r not admin!";
}
// func.php
<?php
include 'class.php';
if (isset($_POST["submit"]) && isset($_POST["url"])) {
    if(preg_match('/^(ftp|zlib|data|glob|phar|ssh2|compress.bzip2|compress.zlib|rar|ogg|expect)(.|\\s)*|(.|\\s)*(file|data|\.\.)(.|\\s)*/i',$_POST['url'])){
        die("Go away!");
    }else{
        $file_path = $_POST['url'];
        $file = new File($file_path);
        $file->getMIME();
        echo "<p>Your file type is '$file' </p>";
    }
}
?>
// class.php
<?php
include 'config.php';

class File{

    public $file_name;
    public $type;
    public $func = "Check";

    function __construct($file_name){
        $this->file_name = $file_name;
    }

    function __wakeup(){
        $class = new ReflectionClass($this->func);
        $a = $class->newInstanceArgs($this->file_name);
        $a->check();
    }
    
    function getMIME(){
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $this->type = finfo_file($finfo, $this->file_name);
        finfo_close($finfo);
    }

    function __toString(){
        return $this->type;
    }

}

class Check{

    public $file_name;

    function __construct($file_name){
        $this->file_name = $file_name;
    }

    function check(){
        $data = file_get_contents($this->file_name);
        if (mb_strpos($data, "<?") !== FALSE) {
            die("&lt;? in contents!");
        }
    }
}

题目分析

flag的位置在admin.php中的__destruct
但是要实例化admin.php中的Ad类,必须是127.0.0.1登录,所以我们必须找到ssrf的利用点~~
实例化(instantiate)是指在面向对象的编程中,把用类创建对象的过程称为实例化。
是将一个抽象的概念类,具体到该类实物的过程。实例化过程中一般由类名 对象名 = new 类名(参数1,参数2...参数n)构成。
在面向对象的编程中,通常把用类创建对象的过程称为实例化,其格式如下:
如 Date date=new Date();
就是用日期类创建了一个日期的对象,就叫对象的实例化。
多数语言中,实例化一个对象就是为对象开辟内存空间,或者是不用声明,直接使用new 构造函数名,建立一个临时对象。
我们看到class.php中的__wakeup(),可以实例化任意类,所以我们要找到发序列化的点
在func.php中我们知道,当我们查看我们的上传文件时,会调用getMIME,而finfo_open也会触发phar反序列化

BUU XXE COURSE 1[xxe]

参考:https://blog.csdn.net/I_ET5u5/article/details/137650668

靶场界面

查找关键

打开网络,鼠标随便点空白处,出来一个login.php

抓包

可以看到有一个内嵌的xml

添加外部实体

root根元素(可以理解为类),为其添加一个外部实体(可以理解为类下的方法)

<!DOCTYPE root [  
<!ENTITY admin SYSTEM "file:///flag"> ]> 

这样在根元素root下有了一个外部实体admin,admin含有一个SYSTEM关键字,XML的解释器会在后续引用admin的时候,将会打开flag的内容并对username内的内容进行替换

在root根元素中对其进行引用

&admin;

send


[NCTF2019]Fake XML cookbook

分析


send

BUU XSS COURSE 1(XSS获取cookie登录)

尝试

可以看到留言可以保存,或许会储存xxs点

Cookie的一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,(如果该Cookie尚未到期)浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。

xss尝试

输入,提交

进入这个网址
什么都没有

可能

标签:web,buuctf,name,admin,clazz,解题,file,new,POST
From: https://www.cnblogs.com/fupo1/p/18302937

相关文章

  • Symfony框架详解:构建高效、可维护的Web应用
    引言Symfony是一个由SensioLabs开发并维护的PHP框架,遵循MVC(Model-View-Controller)设计模式。它不仅提供了一系列强大的工具和功能,还能通过其组件(如HttpFoundation、Routing、DependencyInjection等)单独使用。Symfony的设计目标是让开发者能够高效地构建高质量的Web应用程序,同......
  • yearning订阅webhook发送到企业微信个人或群(思路)
    yearning的默认webhook格式支持钉钉,默认格式不支持企业微信。本文的目的是讲工单流程节点变更通知到企业微信个人或群。本文假设读者已具备以下技能1、pythonflask2、企业微信接口对接1)到群比较简单,直接转到指定URL即可2)到个人,需要脚本内换access_token,并且需要有效......
  • ctfshow web入门 xss web327--web333 存储型和七七八八的
    存储型漏洞web327这道题貌似和反射型的xss差不多,直接打就行web328body和svg的好像不行<script>window.open('http://ceye地址/'+document.cookie)</script><script>window.open('http://hrcgnc.ceye.io/'+document.cookie)</script>先注册,密码多于6位很明显在这......
  • 深入浅出Spring Web MVC:从零开始构建你的第一个Web应用
    深入浅出SpringWebMVC:从零开始构建你的第一个Web应用大家好,今天我们来聊聊SpringWebMVC,这是一个非常强大的框架,用于构建JavaWeb应用。我们将从零开始,逐步构建一个简单的Web应用,帮助大家理解SpringWebMVC的核心概念和使用方法。什么是SpringWebMVC?SpringWebMVC是Spri......
  • 【Web服务与Web应用开发】【C#】VS2019 创建ASP.NET Web应用程序,以使用WCF服务
    目录0.简介1.环境2.知识点3.详细过程1)创建空项目2)添加Web表单3)使用Web表单的GUI设计4)添加服务引用5)在Web的button函数中调用服务,获取PI值6)测试0.简介本文属于一个系列中的第二篇文章,这个系列会实现一个项目,这个项目主要使用VisualStudio2019作为开发工具,创建WC......
  • 攻防世界WEB(新手模式)3-unserialize3
    进题目,可以发现这是一个反序列化的题目。这段代码定义了一个名为xctf的类,其中包含一个公共属性$flag,初始值为'111',并且定义了一个__wakeup()魔术方法。魔术方法__wakeup()__wakeup()方法在对象反序列化时被调用。这段代码中,当该类对象被反序列化时,将立即调用exit('badreq......
  • test_web3
    web3题目更简单的web题分析代码出现include,猜测是文件包含漏洞。通过data://数据流+php命令执行函数查询当前工作目录下的内容,使用hackbar需要先进行url编码:得到flag文件名和首页文件:?url=data://text/plain,%3C%3Fphp%0Asystem('catctf_go_go_go')%3B%......
  • test_web4
    web4题目分析和上一题显示的页面一样,用同样的方法尝试注入:出现报错:看来这题相比上一题增加了过滤。使用shell_exec同理:换个思路,尝试使用一句话木马连接服务器后台。根据发回的响应包可以确定这题使用的是nginx服务器:看看访问日志先,?url=/var/log/nginx/acc......
  • test_web4_2
    根据发回的响应包可以确定这题使用的是nginx服务器:看看访问日志先,?url=/var/log/nginx/access.log:尝试使用日志包含写入一句话木马,往User-Agent字段传入一句话木马<?php@eval($_POST['web4']);?>传入后的日志增加一条记录:使用中国蚁剑连接日志文件,在/var/www/f......
  • test_web4_1
    web4题目分析和上一题显示的页面一样,用同样的方法尝试注入:出现报错:看来这题相比上一题增加了过滤。使用shell_exec同理:换个思路,尝试使用一句话木马连接服务器后台。......