1.Discuz!ML 3.x任意代码执行漏洞之大佬分析之后我分析
2.「原创」萌新也能看懂的码漏ThinkPHP3.2.3漏洞分析
3.ThinkPHP多语言rce复现分析
4.Goby漏洞发布 | XAMPP Windows PHP-CGI 代码执行漏洞(CVE-2024-4577) 漏洞复现
5.关于ThinkPHP framework 任意代码执行漏洞预警
6.烽火狼烟丨PHP远程代码执行漏洞(CVE-2022-31625、CVE-2022-31626)风险提示
Discuz!ML 3.x任意代码执行漏洞之大佬分析之后我分析
首先附上米斯特安全大佬们文章的码漏链接,刚开始有些东西我没看的码漏太懂,于是码漏我就再添了点东西,希望像我一样的码漏小白也能看懂。
一、码漏腾讯云UI源码漏洞综述
漏洞类型:代码执行漏洞
影响系统及版本:Discuz!ML V3.2-3.4
漏洞原因:Discuz!ML 系统对cookie中的码漏l接收的language参数内容未过滤,导致字符串拼接,码漏从而执行php代码。码漏
二、码漏漏洞分析
根据米斯特大佬们提供的码漏报错界面,我对其中的码漏三个报错点一一进行了分析,三个报错点如下图所示(还有米斯特大佬们的码漏水印)。
2.1 报错点一分析
发现首先是码漏portal.php函数出错,把这张图放大看,码漏发现是对cookie中的language参数进行拼接而导致的报错,根据这个参数的语义判断应该是调用语言模板的时候因为找不到相应的模板而发生的错误,那么先定位portal.php报错的第行,该文件路径:
紧接着定位libfile函数,文件加载路径函数。
函数介绍:
libfile($libname, $folder = ”),包含2个参数:$libname 和 $folder,该函数读取source目录下的$folder子目录作为基础部分。
libfile函数源代码如下图所示:
DISCUZ_ROOT为定义网站根目录的常量,realpath函数为返回绝对路径函数,到此处第一个报错就已经分析完毕,原因是系统因为找不到一个php文件而报的错。
2.2 报错点二分析
还是先根据错误定位到引用函数文件,文件路径source/module/portal/portal_index.php,然后定位到源函数所在的文件,引用的地方好定位,位置在/source/function/function_core.php,直接上图
然后这个函数写的还贼长,哎,没得办法,这个时候只能靠运气了,搏一搏,单车变摩托,首先百度,这个函数的作用也就是个调用模板的函数。
然而这个函数写了行代码,找个大表哥的写的代码注释吧,先扔个参考链接 discuz.net/thread-...
此时我发现了思路有些繁琐,然后就去找第三个错误的提示内容,为了找到是哪里出了问题,我把这段代码放到了txt文件中,根据第三个错误提示的信息开始了全文搜索,终于,根据关键字tpl.php值搜索到一处与language这个函数语义有关的东西DISCUZ_LANG。
既然是爱直销源码语言参数出了问题,还是个常量,那就去找找常量定义的地方,全局搜DISCUZ_LANG,跟踪到/source/class/discuz/discuz_application.php
可以看到,将$lng的值给了DISCUZ_LANG,追踪$lng在何处定义,全局搜索$lng,找到了定义$lng的地方(图中第一个箭头)
到此为止,又出现个var,这是个啥,我只知道var[‘cookie’][‘language’]的意思就是cookie中的language的值。
以上可以分析出,从获取language到DISCUZ_LANG拿到值的过程中,并没有对其进行过滤。
那么现在必须确定报错问题是怎么出现的了,看下图:
出现了这样的代码,直接拼接,然后RCE
拼接单引号和'.phpinfo().'
按理来说可以RCE
总结下大概流程从cookie中获取了language的值,然后给了$lng,接着$lng又给了DISCUZ_LANG,系统通过template函数调用模板文件,template函数执行,执行到$cachefile的时候,执行构造的代码。
三、漏洞复现
访问站点www.***.com/forum.php,刷新页面抓包
*本文作者:xxx,转载请注明来自 FreeBuf.COM在language参数处'.phpinfo().'
返回内容:
复现成功。
看起来复现大佬们的漏洞还是挺有意思的,开心。
「原创」萌新也能看懂的ThinkPHP3.2.3漏洞分析
ThinkPHP是一个高效、兼容且简单的轻量级PHP开发框架,支持Windows/Unix/Linux服务器环境,正式版本要求PHP5.0或更高版本,并兼容MySql、PgSQL、Sqlite多种数据库以及PDO扩展。
佳哥在i 春秋论坛分享了自己学习ThinkPHP3.2.3漏洞分析过程的完整记录,内容适合初学者,未经许可,严禁转载。
本文将详细解析ThinkPHP3.2.3中的几个常见漏洞:where注入、exp注入、bind注入、find/select/delete注入、order by注入和缓存漏洞。
在控制器中使用字符串方式作为where参数时,存在where注入漏洞。通过在变量user处设置断点并使用PHPSTROM F7进入,网站源码集合可以看到I方法获取了传入的参数。重点在于过滤函数,首先使用htmlspecialchars过滤参数,然后利用think_filter过滤常规SQL函数。在where方法中,将$where的值放入到$options["where"]数组中。继续跟进查看find方法,最终生成完整SQL语句。关键在于parseWhere方法的执行,进而解析出具体的注入payload。
exp注入漏洞中,使用全局数组进行传参,可以激活漏洞。直接在$user处设置断点,F7跟进,跳过where方法,继续跟进find、select、buildSelectSql、parseSql和parseWhere方法。在跟进parseWhereItem方法时,参数$val为数组形式,{ ‘exp’,‘sql注入exp’}。此时,当$exp满足exp时,参数与值进行拼接,最终payload为sql注入exp。
bind注入漏洞中,使用save方法进行演示。生成SQL语句在update方法中,在parseSet方法中,传入的参数被替换成:0。在bindParam方法中,将参数值包裹在冒号(:)中。继续跟进parseWhere和parseWhereItem方法,当exp为bind时,参数值前面会加上冒号(:)。由于SQL语句中已有冒号,因此在excute方法中,:0被替换成了第二个参数的值,最终payload为。
find注入中,当传入id[where]=1p时,导致不能执行_parseType方法转化数据。继续跟进select、buildSelectSql、parseSql和parseWhere方法,传入的$where为字符串,直接执行了if语句。综合授权源码当传入id=1p时,无法执行注入,原因在于find、_parseOptions、_parseType方法将传入的参数强转化为整形。
select和delete注入的原理与find方法相似,但delete方法多了一个判断是否为空的步骤。
order by注入漏洞中,首先在控制器中编写漏洞演示代码。在user变量处设置断点,F7跟进find、select、buildSelectSql和parseSql方法。当$options['order']参数不为数组时,直接返回order by + 注入payload,最终payload为。
缓存漏洞中,ThinkPHP3.2提供F方法和S方法用于缓存操作。S方法通过set方法写入缓存,然后使用filename方法获取写入文件的路径,保存在../Application/Runtime/Temp目录下。最后,将S传入的name进行md5值作为文件名,通过file_put_contents函数将内容写入文件。
总结,本文详细解析了ThinkPHP3.2.3的几个重要漏洞,并提供了具体的实现步骤和payload示例。为了确保安全,开发者应仔细审查代码,确保参数安全过滤,并在开发过程中遵循最佳实践。实际操作中,尝试复现这些漏洞,并在安全环境中进行验证,可以加深对ThinkPHP框架及其安全性的理解。
ThinkPHP多语言rce复现分析
前言
最近对 ThinkPHP 多语言远程代码执行 (RCE) 漏洞进行了一番深入学习,该漏洞在特定版本的 ThinkPHP 中存在,本文将详细分析其利用条件、环境搭建、漏洞流程以及漏洞复现的过程。
一、漏洞信息
利用该漏洞,需满足以下条件:
1. 确保已安装 ThinkPHP,并知道 pearcmd.php 文件的位置(默认为 /usr/local/lib/php/pearcmd.php,Docker 版本镜像中 pear 默认已安装)
2. 需开启 php.ini 中的 register_argc_argv 选项(Docker 的 PHP 镜像是默认开启的)
3. ThinkPHP 需开启多语言功能
影响范围:
主要影响 ThinkPHP 版本在 6.0.1、5.0.0、5.1.0 以下至对应补丁修复版本的用户。
二、环境搭建
首先,压扁小鸟源码从 GitHub 下载 ThinkPHP 源码(例如,版本为 6.0.),解压后,通过 composer 安装依赖。在 app/middleware.php 文件中取消注释以开启多语言功能。接着,通过 go-pear.phar 或 Docker 安装 pear。
三、漏洞分析
漏洞主要在于 LoadLangPack 类中的 handle 函数,该函数先通过 detect() 方法检查请求参数是否设置了语言,之后将设置值返回并用于切换语言集。在传递给 load() 函数后,参数又传入 parse() 函数,直接用 include 包含文件,此为漏洞触发点。从获取参数到传入 parse() 函数前,均未对内容进行过滤。
四、漏洞复现
在测试环境中(macOS、PHP 7.3、Apache 2.4),通过以下步骤进行复现:
1. 验证 pearcmd 的存在,获取正确路径(当前环境为 /usr/local/pear/share/pear/pearcmd.php)。
2. 了解如何利用 pear,在开启 register_argc_argv 选项后,参数将作为 $_SERVER['argv'] 的一部分传入。
3. 使用 poc 测试,在 /tmp 目录下写入 admin.php 文件,确保正确写入,验证参数解析过程。
4. 利用文件包含访问写入的文件,实现漏洞复现。
注意,除了使用 config-create 命令,还可以使用 Install 命令进行下载操作。若喜欢本文,别忘了点赞与收藏。关注雷石安全实验室,获取更多网络安全知识与技术文章。
Goby漏洞发布 | XAMPP Windows PHP-CGI 代码执行漏洞(CVE--) 漏洞复现
PHP是一种在服务器端执行的脚本语言,在 PHP 的 8.3.8 版本之前存在命令执行漏洞,由于 Windows 的 “Best-Fit Mapping” 特性,在处理查询字符串时,非ASCII字符可能被错误地映射为破折号(-),导致命令行参数解析错误,当 php_cgi 运行在Windows平台上,且代码页为繁体中文、简体中文或日文时,攻击者可以通过特定的查询字符串注入恶意参数,从而执行任意代码。
CVSS core: 9.8
漏洞危害:攻击者可以通过特定的查询字符串注入恶意参数,从而执行任意代码,以至于接管服务器。
危害等级:高
影响版本:
PHP 8.3 < 8.3.8
PHP 8.2 < 8.2.
PHP 8.1 < 8.1.
其他版本官方已停止维护,可根据实际情况采取相应的措施
解决方案:
1.更新到PHP官方发布的最新PHP版本: php.net/downloads
2.对于无法升级PHP的用户:以下重写规则可用于阻止攻击。需要注意的是,这些规则仅对繁体中文、简体中文和日语语言环境起到临时缓解作用。在实际操作中,仍然建议更新到补丁版本或迁移架构。 RеᴡิตеEnɢіnе On Rеᴡɪté Cоd %{ QUERY_STRING} ^%аd [NC] Rеᴡɪté Rulе .? - [F,L]
3.对于使用 XAMPP fоr Windоᴡs 的用户:如果确认不需要 PHP CGI 功能,可以通过修改以下 Aрасhе H
TTP Sеrvеr 配置(httpd-xampp.conf )来避免受到该漏洞的影响: 找到相应的行:ScriptAlias /php-cgi/ "C:/xampp/php/" 并将其注释掉:# ScriptAlias /php-cgi/ "C:/xampp/php/"
关于ThinkPHP framework 任意代码执行漏洞预警
最近官方发布了一个安全补丁,官方表述是:该URL安全漏洞会造成用户在客户端伪造URL,执行非法代码。
可是貌似大多数开发者和使用者并没有注意到此漏洞的危害性,应者了了,更不用说有多少人去升级了。随后我对其进行了分析,发现此问题果然是一个非常严重的问题,只要使用了thinkphp框架,就可以直接执行任意php代码。特此发帖预警各位。
我们来分析一下官方的补丁:
/trunk/ThinkPHP/Lib/Core/Dispatcher.class.php
复制代码
代码如下:
- $res = preg_replace('@(w+)'.$depr.'([^'.$depr.'/]+)@e', '$var['/1']="/2";', implode($depr,$paths));
+ $res = preg_replace('@(w+)'.$depr.'([^'.$depr.'/]+)@e', '$var['/1']='/2';', implode($depr,$paths));
这个代码是把pathinfo当作restful类型url进行解析的,主要作用是把pathinfo中的数据解析并合并到$_GET数组中。
然而在用正则解析pathinfo的时候,主要是这一句:
复制代码
代码如下:
$res = preg_replace('@(w+)'.$depr.'([^'.$depr.'/]+)@e', '$var['/1']="/2";', implode($depr,$paths));
这里明显使用了preg_replace的/e参数,这是个非常危险的参数,如果用了这个参数,preg_replace第二个参数就会被当做php代码执行,作者用这种方式在第二个参数中,利用PHP代码给数组动态赋值。
复制代码
代码如下:
'$var['/1']="/2";'
而这里又是双引号,而双引号中的php变量语法又是能够被解析执行的。因此,攻击者只要对任意一个使用thinkphp框架编写的应用程序,使用如下方式进行访问,即可执行任意PHP代码:
复制代码
代码如下:
index.php/module/action/param1/${ @print(THINK_VERSION)}
由于是双引号执行,这里为了保险起见,不给出更有危害性的代码,利用这个还是需要点技巧的。
总之这个问题非常严重,找了一下,发现目前没有修补漏洞的网站还是很多的。而ThinkPHP框架的特征其实非常好识别,有意者直接写个scanner进行扫描也未必不可能。
为了不造成更大损失,特地发帖希望引起各位使用thinkphp做开发的同学关注。尽早升级官方的安全补丁
作者:GaRY
烽火狼烟丨PHP远程代码执行漏洞(CVE--、CVE--)风险提示
PHP官方已发布关于存在远程代码执行漏洞的通告,漏洞编号为CVE--、CVE--。CVE--漏洞是由于PHP_FUNCTION中分配在堆上的数组清除不及时,错误调用php_pgsql_free_params()函数可能导致远程代码执行。CVE--漏洞源于PHP的mysqlnd拓展堆缓冲区溢出,攻击者通过诱导主机以mysqlnd主动连接恶意服务器,实现缓冲区溢出并执行远程代码,影响包括Adminer、PHPmyAdmin在内的基于php的数据库管理软件。WebRAY安全服务产品线建议用户采取防护措施并升级到最新版本。PHP是一种多用途开源脚本语言,用于Web开发和嵌入HTML。WebRAY将持续关注该漏洞,提供最新信息。此漏洞风险评级为高危。官方已发布安全版本,建议用户及时下载更新。盛邦安全成立于年,是国内领先的网络安全产品及服务供应商,专注于网络空间地图、业务安全、供应链安全、应用防御和脆弱性检测领域。
由Typecho 深入理解PHP反序列化漏洞
深入理解PHP反序列化漏洞及Typecho利用实例
PHP反序列化漏洞,又称为PHP对象注入,是一种常见的安全漏洞。其根本原因在于程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,从而引发代码执行、getshell等一系列不可控后果。这类漏洞不仅存在于PHP语言中,也出现在Java、Python等其他语言中,但原理基本相同。
了解PHP反序列化漏洞,首先需要掌握序列化与反序列化的基本概念。序列化允许将变量转换为字符串形式,便于在脚本文件间传递数据。相反,反序列化则将字符串还原为原始变量。在这个过程中,魔术方法如__construct、__destruct、__toString等发挥了关键作用。魔术方法在特定场景下被自动调用,例如对象创建时调用__construct,对象销毁时调用__destruct,对象转换为字符串时调用__toString。
为了更直观地理解这些概念,我们通过几个例子展示PHP序列化与反序列化的实际操作。例如,创建一个TestClass类,实例化类并调用成员函数。在代码中添加几个魔术方法,观察其在对象创建和销毁过程中的自动调用。
序列化过程可以通过serialize函数实现,而unserialize函数用于将序列化后的字符串还原为对象。在实例中,我们通过添加序列化操作来展示PHP对象序列化的格式。然后,通过unserialize函数重建对象,验证序列化与反序列化过程的正确性。
在漏洞利用过程中,攻击者可以通过构造特定的反序列化字符串,利用魔术方法,实现代码执行。例如,通过在类中设置魔术方法,让对象在特定条件下调用eval函数执行恶意代码。这种利用方式形成了一条ROP(Return-oriented programming)攻击链,攻击者通过精心设计的代码片段实现漏洞利用。
以Typecho为例,利用漏洞发生在其install.php文件的referer检测部分。攻击者绕过检测后,通过特定的序列化字符串触发漏洞。在Typecho中,序列化的数据被用于构建对象实例,进而触发漏洞利用过程。攻击者通过构造特定的序列化字符串,利用魔术方法如__destruct、__toString、__get等,最终实现任意代码执行。
在Typecho的实例中,攻击者关注的关键点在于__construct、__toString、__get等魔术方法的利用。通过全局搜索这些方法,找到可利用的实例,进而构造漏洞利用的POC(Proof of Concept)。在实际利用过程中,需要确保漏洞利用过程能够成功执行,同时避免触发异常或错误,导致利用失败。
总之,深入理解PHP反序列化漏洞以及其在Typecho等应用中的利用方法,对于提高网络安全意识和防范措施具有重要意义。通过分析漏洞利用流程和防御策略,我们可以更好地保护系统免受此类攻击。
thinkphp 3.2.3 exp注入漏洞分析
在官网下载thinkphp3.2.3,配置MySQL账号密码于Convention.php文件,添加一行用于打印SQL语句。漏洞代码通过特定的HTTP请求触发,如:http://.0.0.1/index.php?id[0]=exp&id[1]==1 or sleep(5)。通过断点调试,跟踪至Model类的select函数,进而深入至其内部处理逻辑,发现$exp的值即为传入的exp,该值被直接拼接到后续SQL语句中,形成SQL注入。
使用I函数可以防止注入攻击,原因在于ThinkPHP\Common\functions.ph中的think_filter函数会将特殊关键字(如EXP、OR等)加上空格,避免进入if语句进行SQL字符拼接。
对于普通的SQL注入,thinkphp3.2.3会通过解析数据库字段类型来防止注入。在Model类的_parseType()函数中,对于字段类型为int()的字段,会将传入的值转化为整数类型,使得注入语句失效。对于字符型注入,系统在Think\Db\Driver.class.php中的escapeString()函数中对特殊符号进行转义,实现防御。
除了exp注入,还有bind注入方法。bind注入通过在SQL语句中插入特殊符号,导致SQL错误进行攻击。虽然实现较为复杂,但由于think_filter函数未对bind进行过滤,因此即使使用了I函数获取参数,仍有可能实现bind注入。
针对此漏洞的修复策略包括:1. 尽量在应用中使用I函数获取用户输入的参数;2. 修复代码,将安全补丁整合到index.php入口文件中,确保应用从源头开始执行安全措施。
漏洞分析ThinkPHP5任意代码执行分析全记录
ThinkPHP是轻量级的PHP开发框架,具有免费开源、快速、简单且面向对象的特点。然而,在5.*版本中存在安全隐患,因为控制器名过滤不严格,导致可能出现getshell漏洞。受影响的版本包括5.0和5.1。
漏洞分析中,我们发现该漏洞源于ThinkPHP5框架底层对控制器名过滤不严。测试人员可以通过url调用框架内部的敏感函数,出现getshell漏洞。具体代码实现如下:
在thinkphp/library/think/App.php文件中,首先看到routecheck代码,由于默认按照图一的方式进行解析调度,如果开启强制路由模式,会直接抛出错误,这时通过Route::import命令加载路由,继续跟进路由。
thinkphp/library/think/Route.php文件显示tp5在解析URL时,只是将URL按分割符分割,并没有进行安全检测。测试人员最为关心的是Exchange对外提供的访问接口以及使用的加密验证类型。
在thinkphp/library/think/App.php文件中,由于程序并未对控制器进行有效的安全过滤和检查,测试人员可以通过引用“\”来调用任意方法。跟进到module方法时,测试时注意使用一个已存在的module,否则会抛出异常,无法继续运行。此处直接从之前的解析结果中获取控制器名称以及操作名,无任何安全检查。
跟进到实例化Loader控制器方法时,可以看到如果控制器名中有“\”,就直接返回。回到“thinkphp/library/think/App.php”的module方法,正常情况下应该获取到对应控制器类的实例化对象,而现在得到了一个“\think\App”的实例化对象。通过url调用其任意的public方法,同时解析url中的额外参数,当作方法的参数传入。我们可以调用invokeFunction这个方法,构造payload。
所有基于tp5.0框架建设的网站都受此漏洞影响。测试该漏洞点是否被修复时,网址后面直接拼接以上代码,执行之后发现出现phpinfo页面,说明漏洞存在。在public目录下创建insfo.php,修改漏洞利用代码,直接在public目录下创建一个名为insfo.php的一句话木马。删除insfo.php文件。
解决方案中,直接添加补丁,升级ThinkPHP版本,开启强制路由。在ThinkPHP5.0版本的thinkphp/library/think/App.php文件中,在Module类的获取控制名处添加正则过滤代码。