站长被黑了,简单说下Flarum的的渗透思路吧
Flarum这程序我完全没玩过。我只能简单说说。
以前在看雪论坛瞎逛的时候,经常看见有大佬“赞扬”PHP是漏洞王。不少内网渗透大佬就是被PHP养活的。
和\"小学生\"不同,你看在论坛发帖研究ddos和cc攻防,其实我是在这个领域知之甚少,所以才研究的。我了解渗透比ddcc多一些。
渗透防御,最经常遇到的就是“某X”放大话说要“日你站”,结果他日不下来,于是对你的站进行ddcc。“既然日不了,就打你,让你也无法用”,于是开始研究ddcc这些的。
来这里的乐趣,就是看着站长被打,然后帮站长出主意,同时学习一些防御技术。
首先先说几个普遍的点
根据多年的经验,web服务器,除了nginx的漏洞最少,其他服务器漏洞挺多了(OpenLiteSpeed没用过),尤其是加载apache这种加载外部组件越多的,漏洞越多。
(apache你禁止上传php,他可以上传php5。你禁止上传php5,他可以上传php3。你禁止上传php3,他上传php/x00/x0a截断符。你禁止php*,他直接上传.htaccess,让jpg以php格式执行),特别难防
第二,php尽量使用fastCGI方式执行,不要使用LSAPI或者内置于web server lib.so的方式,这种很容易造成安全问题,比如内存安全,逻辑安全等等。
fastCGI可以动静态分离,只用不犯傻,配置了错误的$.php执行规则。基本上别人上传的文件直接以静态处理,就不会照成别人恶意上传的php被执行。
我简单说下Flarum,问题,其实这个我研究的很少的。
Flarum最新的漏洞库为CVE-2024-21641,允许任何第三方重定向到任意链接。暂时不知道如何使用。
首先是文件上传功能,Flarum仅有三处支持文件上传的逻辑,分别是网站Logo、Favicon和用户头像……是的,作为一个论坛社区,发帖默认不支持上传附件和图片,需要安装扩展来实现。可以排查。
但是
看了一下三处图片上传的代码,文件名无法控制,后缀写死成.png,文件内容也会使用GD库转换成png格式保存,基本上是水泄不通的。比如这是上传用户头像的部分代码:
/**
* @param User $user
* @param Image $image
*/
public function upload(User $user, Image $image)
{
if (extension_loaded('exif')) {
$image->orientate();
}
$encodedImage = $image->fit(100, 100)->encode('png');
$avatarPath = Str::random().'.png';
$this->removeFileAfterSave($user);
$user->changeAvatarPath($avatarPath);
$this->uploadDir->put($avatarPath, $encodedImage);
}
如果自己没用瞎搞,插件没用修改的话。
Flarum没有动态执行用户传入的类和函数,而是通过router的方式分发路由,比如:
return function (RouteCollection $map, RouteHandlerFactory $route) {
// Get forum information
$map->get(
'/',
'forum.show',
$route->toController(Controller\\ShowForumController::class)
);
......
}
可以排查一下这里
反序列化漏洞
经过分析,Flarum中存在反序列化的有两个地方,一是session,二是缓存
Flarum有个有趣的地方是其支持Less语法。
Less是一个完全兼容CSS的语言,并在CSS的基础上提供了很多高级语法与功能,比如CSS中不支持的条件判断与循环,相当于是CSS语言的超集。前端开发者使用Less编写的程序,可以通过编译器转换成合法的CSS语法,提供给浏览器进行渲染。
Flarum使用了less.php这个第三方库来编译Less,在其README页面很容易看到下面这段警告:
wikimedia/less.php
The LESS processor language is powerful and includes features that may read or embed arbitrary files that the web server has access to, and features that may be computationally exensive if misused.
In general you should treat LESS files as being in the same trust domain as other server-side executables, such as PHP code. In particular, it is not recommended to allow people that use your web service to provide arbitrary LESS code for server-side processing.
See also SECURITY.
看起来less.php也说在渲染的过程中可能存在一些安全隐患。
在Less中,data-uri函数用于读取文件并转换成data协议输出在css中。可以看下less.php中相关的实现:
public function datauri( $mimetypeNode, $filePathNode = null ) {
$filePath = ( $filePathNode ? $filePathNode->value : null );
// ...
if ( file_exists( $filePath ) ) {
$buf = @file_get_contents( $filePath );
} else {
$buf = false;
}
。。。。。。。。
}
一个可以控制完整路径的文件读取方式
尝试在后台修改CSS,可以尝试一些其他操作:
.test {
content: data-uri('/etc/passwd');
}
具体的就不详细说了
其他可能的漏洞
phar://反序列化
phar是PHP中类似于Jar的包格式,而其中保存的metadata信息在读取的时候会被自动反序列化。这样,如果攻击者可以控制文件操作的完整路径,并能够在服务器上上传一个文件,将可以利用phar://协议指向这个文件进而执行反序列化操作。
对于文件包含漏洞来讲,只需要控制任意一个文件中的一部分即可,对于文件格式、是否有脏字符等没有要求;而phar反序列化场景下,需要这个文件内容满足一定的格式才能成功被加载,进行反序列化。
phar文件可以是下面三种格式:
这三者都是archive格式,可以使用phpgcc这款工具来生成一个phar文件,并将反序列化利用链插入其中:
php phpggc -o evil.phar Monolog/RCE6 system id
因为Flarum使用了monolog,选择Monolog/RCE6这条利用链,本地测试可以正常触发反序列化。
需要将这个phar文件上传到服务器上才能利用,这么上传?
Flarum前面分析过,存在三处图片上传的功能,而phar是可以伪造成图片文件格式的,phpggc也贴心地提供了这个功能,-pj参数:
php phpggc -pj example.jpg -o evil.jpg Monolog/RCE6 system whoami
使用该参数即可将phar文件和example.jpg图片制作成一个“图片马”,在上传时可以被识别成图片,但使用PHP解析时又可以识别成phar文件。
另外phar文件在php8.0以上是默认强行禁用的,如果不手贱打开基本是没用问题的。
less.php 的 @import 漏洞
在CSS或Less中,@import用于导入外部CSS,类似于PHP中的include(‘xxxxxxx’)
在Less.php底层,@import时有如下判断逻辑:
如果发现包含的文件是less,则对其进行编译解析,并将结果输出在当前文件中
如果发现包含的文件是css,则不对其进行处理,直接将@import这个语句输出在页面最前面
在解析@import语句的代码中,可以看到这样一段if语句:
if ( $this->options['inline'] ) {
// todo needs to reference css file not import
//$contents = new Less_Tree_Anonymous($this->root, 0, array('filename'=>$this->importedFilename), true );
Less_Parser::AddParsedFile( $full_path );
$contents = new Less_Tree_Anonymous( file_get_contents( $full_path ), 0, array(), true );
if ( $this->features ) {
return new Less_Tree_Media( array( $contents ), $this->features->value );
}
return array( $contents );
}
当$this->options[‘inline’]为true时进入if语句,并使用file_get_contents读取此时的URL,直接作为结果返回。而众所周知的是,file_get_contents是支持data:协议的,可以通过data:协议来控制读取的文件内容。
让$this->options[‘inline’]为true的条件也很简单,在@import语句后面指定inline选项即可。
于是可以通过通过@import (inline)和data:协议的方式可以向assets/forum.css文件的开头写入任意字符,再通过data-uri(‘phar://…’)的方式包含这个文件,触发反序列化漏洞。
另外,关于Flarum的渗透教程,可以参考这篇例子,可以学到经验:https://xz.aliyun.com/t/13499
php权限问题,php执行器使用fastCGI运行,j不要与web server共用同一linux user(如:www-data)这样php程序直接就能删除掉nginx之类的日志。权限问题可以加入相同的用户组实现。如:web server ==> nginx:www-data ,php ==>php_md:www-data。这样可以避免php失陷直接把nginx一锅端了。
另外,使用docker严格隔离环境能省很多事,注意不要把docker的api暴露在0.0.0.0了。不然100%被日。
经验之谈:nginx在我见过的web server中漏洞是最少的,nginx最大的漏洞是管理员的配置漏洞。