1. ThinkPHP
ThinkPHP是一个开源免费的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。同时遵循Apache2开源许可协议发布,意味着你可以免费使用ThinkPHP,甚至允许把你基于ThinkPHP开发的应用开源或商业产品发布/销售
ThinkPHP (TP)
算是国内主流的一个PHP框架,首先上手快,资料多,学习成本很低,而且也是我第一个接触的MVC框架。
TP主要分为以下几个版本: TP3
、 TP5
、 TP6
大可能出现漏洞的范围,或者说常见的漏洞(肯定不全,一般的思路):
- TP3
- SQLi
- TP5
- RCE
- TP6
- 任意文件操作
由于 TP
是个国内较为主流的框架,在SRC或者众测中经常遇到基于 TP
的业务系统,那么接下来,我会以案例讲解我渗透 TP
的思路。
1.1 确定版本
对于确定版本信息,一般可以在xxx/index.php/index/
任意字符
一般就会出现无法找到控制器的报错信息,就可以确定版本(如果没自定义错误页面的话)。
2. 案例1- .SVN
-> SQLi
-> GetShell
2.1 .SVN
在挖掘某SRC
时,直接一个登陆界面,简单查看url
为: xxxx/index.php/Home/Login
,初步判定 TP
框架
随手加上 .SVN
,403 ,稳了。 SVN
泄露,利用:svnexploit/ 把源码download
下来:
某些关键字可能与SRC有关,因此隐去。
├── Application 应用目录(一般前后台两个应用)
│ ├── Admin
│ │ ├── Action 控制器 (重要)
│ │ ├── Common
│ │ ├── Conf
│ │ ├── Model
│ │ ├── View
│ │ └── index.html
│ ├── Common (公共配置文件)│ ├── Home
│ │ ├── Action 控制器(重要)
│ │ ├── Common
│ │ ├── Conf
│ │ ├── Model
│ │ ├── View
│ │ └── index.html
│ └── Lib (库)
├── Public 公开资源,例如js,css,或者上传的image
│ ├── css
│ ├── font-awesome
│ └── js
├── ThinkPHP TP的程序,只要看到版本就ok
│ ├── Common
│ ├── Conf
│ ├── LICENSE.txt
│ ├── Lang
│ ├── Library
│ ├── Mode
│ ├── ThinkPHP.php
│ ├── Tpl
│ └── logo.png
├── Uploads 在该SRC中,上传存放此处
│ ├── Uploads
│ └── files
├── index.html
├── index.php 入口文件
其他没写出来的,不是不重要,是我一般不太看(大笑)。
2.2 SQLi
对于前台的话,我建议先看Home
,因为这里的一般不需要登陆,没有鉴权。直接看登陆的方法
(有一些变量可能和SRC
有关,就此用x
代替)
很明显,x
存在SQLi
。
payload
如下:
1 |
|
当然sqlmap
指定x
是跑部出来的,需要对payload
做些处理:
1 | Host: 127.0.0.1 |
ok,将一部分转换成*
,sqlmap
指定,就可以跑出来,如图盲注。
2.3 Getshell
TP
的代码审计,我不想讲太多,对于TP3
的话,我的建议是先找敏感函数吧。因为不是专门代码审计的文章,我们SQLi
有了,账号密码盲注的话还是太慢了,当然我跑出来了,但是密码无法解出,没关系,我们源码都有了,直接找Getshell
的点吧。
一般全局查找upload
关键字:
在这里的时候就发现,Admin应用下存在上传点:
这里任意文件上传,已弃用,但是没删掉。黑人问号????
注意第三行代码:
1 | class ManageAction extends BaseAction |
BaseAction
为权限控制类,那么这个控制器里的方法必须要登陆才可以访问。我们的SQLi
虽然解不出来,但是可以插入新的数据,于是我插入了一条管理员的账号,成功登陆。
1 | public function uploadPic() |
注意这一句: $image_name = time() . rand(1000, 9999) . "." . end(explode(".", $_FILES['pic']['name'])); //图片名称
时间加随机数,可以爆破的,但是作为有代码有SQLi的咱们,并不需要那么复杂。
1 | $data['title'] = $_POST['title']; |
他这里有将文件名路径插入数据库的操作,上传shell之后,直接去数据库查询即可。Getshell
:
当然这里还有个小问题,为了照顾新学习tp的童鞋,如何访问控制器里的方法:
一般是 xxxxx/index.php/应用名称/控制器名/方法名
在这里就是:xxx/index.php/Admin/Manage/loginPic
这个路径,当然,具体还是看tp是怎么配置的,一般是这样。在这里师傅们肯定发现,这种情况会有新的fuzz情况产生。 (在该案例中,由于一getshell之后,没做免杀,立马被src
的edr
识别拦截,后悔不已。PS:内网漏洞价格比较高)
3. 案例2 Fuzz TP方法。
xxx/index.php/Admin/Manage/loginPic
如果后台某些控制器权限控制不严格,可能会有未授权的产生,在这里可以对 loginPic
进行Fuzz。在挖掘某SRC时,就遇到这个情况,也是TP的框架,直接Fuzz
方法(或者控制器名称都可):
这里图片没有体现,在当时是fuzz
出来一个upload
控制器的,简单测试之后直接getshell
。
4. 日志泄漏
TP
日志泄露http://127.0.0.1/Application/Runtime/Logs/Admin/20_10_28.log
(没有找到相关案例)
5. 结尾
TP3框架的挖掘姿势很多。
以上案例均由我与@v1gle 协作完成。
(首发先知)