[GKCTF 2021]easycms

0x00 前言

源码下载链接

日常刷题
给了一个蝉知cms
hint:后台密码五位
在这里插入图片描述
没扫 凭经验试了几个 后台 /admin.php
admin 12345

0x01 brain.md

一开始想的就是基础文件上传getshell
一些上传logo的地方都被ban了
在设计模块中可以自定义网站头部的php源代码
在这里插入图片描述
通过在服务器创建文件判断管理员身份
在这里插入图片描述
在组件素材库处可以上传txt文件
在这里插入图片描述
拦一下包看看

POST /chanzhi/www/admin.php?m=file&f=editsource&fileID=1 HTTP/1.1
Host: 192.168.2.26
Content-Length: 290
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.2.26
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryNMMMY8BhfGvBoBai
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.2.26/chanzhi/www/admin.php?m=file&f=browsesource
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
Cookie: adminsid=pvbj0olrrghhe6tmmgq7r8vspl; adminLang=zh-cn; adminDevice=desktop; theme=default; currentGroup=design
Connection: close

------WebKitFormBoundaryNMMMY8BhfGvBoBai
Content-Disposition: form-data; name="filename"

wipqq
------WebKitFormBoundaryNMMMY8BhfGvBoBai
Content-Disposition: form-data; name="upFile"; filename=""
Content-Type: application/octet-stream


------WebKitFormBoundaryNMMMY8BhfGvBoBai--

源码跟进到函数
在这里插入图片描述
D:\phpStudy\PHPTutorial\WWW\chanzhi\system\module\file\control.php

public function editSource($fileID)
    {
        $this->file->setSavePath('source');
        $file = $this->file->getById($fileID);
        if(!empty($_POST))
        {
            if(!$this->file->checkSavePath()) $this->send(array('result' => 'fail', 'message' => $this->lang->file->errorUnwritable));
            if($this->post->filename == false or $this->post->filename == '') $this->send(array('result' => 'fail', 'message' => $this->lang->file->nameEmpty));

            $filename = $this->post->filename;
            if(!validater::checkFileName($filename)) $this->send(array('result' => 'fail', 'message' => $this->lang->file->evilChar));

            if(!$this->post->continue)
            {
                $extension    = $this->file->getExtension($_FILES['upFile']['name']);
                $sameUpFile   = $this->file->checkSameFile(str_replace('.' . $extension, '', $_FILES['upFile']['name']), $fileID);
                $sameFilename = $this->file->checkSameFile($this->post->filename, $fileID);
                if(!empty($sameUpFile) or !empty($sameFilename))$this->send(array('result' => 'fail', 'message' => $this->lang->file->sameName));
            }

            $result = $this->file->editSource($file, $filename);
            if($result) $this->send(array('result' => 'success','message' => $this->lang->saveSuccess, 'locate' => $this->createLink('file', 'browseSource')));
            $this->send(array('result' => 'fail', 'message' => dao::getError() ));
        }
        $this->view->title      = $this->lang->file->edit;
        $this->view->modalWidth = 500;
        $this->view->file       = $file;
        $this->display();
    }

跟进checkfilename
D:\phpStudy\PHPTutorial\WWW\chanzhi\system\lib\base\filter\filter.class.php
没有过滤 /

public static function checkFileName($var)
    {
        return !preg_match('/>+|:+|<+/', $var);
    }

跟进$this->file->editSource
D:\phpStudy\PHPTutorial\WWW\chanzhi\system\module\file\model.php

public function editSource($file, $fileName)
    {
        $files = $this->getUpload('upFile', $file->objectType);
        $uploadPath = $this->app->getDataRoot();
        if(!empty($files))
        {
            /* Use post fileName as file title. */
            $_FILES['upFile']['name'] = $fileName . '.' . $file->extension;

            $replaceResult = $this->replaceFile($file->id, 'upFile');
            if(!$replaceResult) return false;
        }

        if($fileName != $file->title) 
        {
            $file = $this->getByID($file->id);
            if(!file_exists($file->realPath)) return false;
            $newPath = dirname($file->realPath) . DS . $fileName . '.' . $file->extension;
            $result = copy($file->realPath, $newPath);
            if(!$result) return false;
            @unlink($file->realPath);
            
            $newPathname = str_replace($uploadPath, '', $newPath);
            $this->dao->update(TABLE_FILE)->set('title')->eq($fileName)->set('pathName')->eq($newPathname)->where('id')->eq($file->id)->exec();
        }

        return !dao::isError();
    }

最后的newPath只是做了简易的拼接
存在目录穿越
web端的存储路径只是相对路径 所以还是得把源码包down下来仔细看一下
/var/www/html/www/data/source/default/blank/
目标目录
/var/www/html/system/tmp/
所以在这里插入图片描述
在这里插入图片描述

0x02 rethink

水平不济 看源码时可能纰漏很多

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: [gkctf 2021]rrrrsa 是一道RSA加密相关的题目,需要解密出明文。具体的解题思路可以参考以下步骤: 1. 首先,我们需要获取到题目中给出的公钥和密文。公钥包括两个参数:n和e,密文为c。 2. 接下来,我们需要对公钥进行分解,得到p和q两个质数。可以使用工具或算法进行分解,比如使用yafu等工具。 3. 然后,我们可以计算出phi(n) = (p-1) * (q-1)。 4. 接着,我们需要求出d,即私钥。可以使用扩展欧几里得算法求解,也可以使用工具进行计算。 5. 最后,我们可以使用私钥d对密文c进行解密,得到明文m。 具体的实现过程可以参考RSA加密算法的原理和实现方法。需要注意的是,在实际的CTF比赛中,可能会对RSA加密算法进行一些变形或者加入一些附加条件,需要根据具体情况进行调整和处理。 ### 回答2: [gkctf 2021]rrrrsa 是 2021GKCTF信息安全比赛中的一道题目。这是一道RSA算法的题目,题目中给定了两个密文和两个公钥,要求参赛者求出明文。 要解决这道题目,需要对RSA算法有一定的了解,RSA算法是目前公认比较安全的加密算法之一,其基本原理是利用大数的分解难题来实现加密和解密。 在这道题目中,给出了两个密文和两个公钥,首先需要利用公钥将密文解密得到明文,然后用相应的算法求解出两个私钥。在RSA算法中,私钥的求解需要知道两个质数p和q,故需要对公钥进行分解并求出其中的两个质数。一旦求出两个私钥,则可用私钥解密密文得到明文。 在这道题目中,给出的密文是以十六进制表示的大数,而公钥是由两个大质数乘积构成的。根据RSA算法的基本原理,通过对密文使用公钥进行解密,即可得到明文,但需要注意的是,密文和公钥都需要进行处理,才能保证它们能够正确地被计算机所处理。 因此,参赛者需要熟练地掌握RSA算法的原理及应用,同时还需要具备一定的计算机处理能力,才能够成功地解决这道[gkctf 2021]rrrrsa的挑战。 ### 回答3: [gkctf 2021]rrrrsa是一道RSA密码学题目,在这道题目中,我们需要通过分解RSA公钥中的N来找到是否存在两个相同的质因数,从而破解RSA加密的密文,获得明文。 首先,我们可以通过给定的公钥N、e和密文c,利用RSA加密算法求出c的解密结果m。但是,这样显然并不是题目要求我们做的事情,因为我们无法知道RSA公钥中的质数。 那么,如何判断公钥中是否存在两个相同的质数呢?我们可以利用RSA加密算法的一个性质:当我们选择两个质数p和q,然后对它们进行乘法运算得到N时,我们再进行分解N时能得出的两个质数就是p和q。 因此,我们可以对给定的公钥N进行分解得到它的质数因子p和q,如果存在两个质因子相等,则说明存在两个相同的质数,这就意味着我们可以破解RSA加密的密文。 具体地说,在这道题目中,我们可以利用Python的gmpy2工具库中的下列函数来分解公钥N: gmpy2.factor(n) 接着,我们可以利用Python脚本进行以下步骤: 1. 读入给定的公钥N,调用函数factor分解出p和q; 2. 计算φ(N) = (p-1)*(q-1); 3. 计算d = e^-1 mod φ(N); 4. 调用Python库中的pow函数计算c^d mod N,得到明文m。 最后,我们就能够通过这些步骤,破解出RSA加密的密文c,获得明文m,完成这道[gkctf 2021]rrrrsa的挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值