在CTF比赛中发现的PHP远程代码执行0day漏洞

在这里插入图片描述

众所周知,CTF比赛都是人为构造漏洞环境,人为制造安全漏洞,供安全从爱好者研究,好磨练和增强自己的安全技能。

参加CTF比赛,通常你需要明白出题人的想法,按照出题人的意图来解开谜题。

但是,就像所有的游戏一样,在一些未知的地方,总是存在BUG。有时候参赛人员出人意料的行为和动作,会接触到一些从未有人探索过的领域——0day。这是出题人从未预料到的,这就像在一场比赛中参赛者找到了一条比官方航线更好的路线,在一片特别危险的丛林中发现了一个知识宝库。

意外发现的PHP漏洞

我们的故事开始于Realworld CTF比赛,时间为2019年9月14日到9月16日。Wallarm的安全研究员Andrew Danau在攻克一个CTF任务时偶然发现了一个不寻常的PHP交互行为。

当Andrew Danau往URL中插入了%0a(换行)字符,然后发送给服务器,但服务器的响应很奇怪,它返回的数据比料想的要多,并且这些额外的数据与URL中%0a之后的字节数有关。

通常来说,这种异常响应与内存损坏有关,这应该是一种信息泄露攻击。这说明它可能会导致敏感数据的泄露。更糟糕的是,尽管没有直接出现,但这种异常行为可能隐藏着远程代码执行。

Andrew没有找到解决这个CTF关卡的方法。他决定和队友就这一不同寻常的发现进行深入研究,希望能够理解其中的缘由,开发成一个远程代码执行漏洞。

这个异常的原因是关于Nginx+fastcgi的底层,特别是fastcgi_split_path指令以及涉及换行符的正则表达式的特点。对于%0a字符,Nginx会将其设为一个空值,但fastcgi+PHP不期望这样。

由于Emil对哈希表使用了一些“黑魔法”,所以可以放置任意FastCGI变量,比如PHP_VALUE。我强烈建议你通过学习Emil的脚本来了解更多,利用脚本链接[https://github.com/neex/phuip-fpizdam/](https://github.com/neex/phuip-fpizdam/)。如果你想了解源码,链接在这:

https://github.com/php/php-src/blob/master/sapi/fpm/fpm/fpm_main.c#L1142

以上一切意味着你可以调用任意的PHP代码——在本例中,通过使用Nginx配置文件中的fastcgi_split_path指令来处理任何用户的数据,比如URL。

在进一步的调查中,我们在GitHub上发现有大量代码涉及fastcgi_split_path(超过6千):

https://github.com/search?q=fastcgi_split_path&type=Code

防御方法

在得知Andrew的发现后,我们立刻据此测试了一些安全解决方案,如Wallarm Cloud Native WAF,并确认Wallarm的WAF能拦截这个漏洞。

而我们在后续研究中也发现可以通过一些简单的方法拦截攻击,比如你正在使用ModSecurity安全软件,那么就可以通过过滤URL中的%0a/%0d来防御这种攻击,相关的mod_security规则如下:

SecRule REQUEST_URI "@rx %0(a|d)" "id:1,phase:1,t:lowercase,deny"

此外我们还建议你通过执行以下简单的bash命令来识别是否可能存在漏洞,它可以识别在你的Nginx配置中是否有错误配置:

egrep -Rin --color 'fastcgi_split_path' /etc/nginx/

最后,在PHP发布相关补丁时,要及时安装。

结论

有时候,思考偏离轨道并不是坏事,Andrew Danau无意中为安全做出了大贡献。我们也相信PHP的开发团队能迅速修复该漏洞。

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场:https://nosec.org/home/detail/3083.html
来源:https://lab.wallarm.com/php-remote-code-execution-0-day-discovered-in-real-world-ctf-exercise/
### 回答1: CTF 比赛常见的文件包含漏洞的做法包括: 1. 在文件嵌入恶意代码,例如 PHP 文件嵌入 PHP 后门。 2. 在文件嵌入解压后执行恶意代码的压缩包,例如在一个图片文件嵌入 zip 压缩包。 3. 在文件包含指向恶意网站的链接。 4. 在文件包含指向恶意文件的路径,例如在一个文本文件包含指向加密垃圾文件的路径。 最常见的文件包含漏洞的类型是 PHP 和其他服务器端脚本语言,因为它们可以在服务器上执行恶意代码。但也有可能在其他类型的文件发现文件包含漏洞,例如 PDF、Office 文档等。 ### 回答2: 在CTF比赛,文件包含漏洞是一种常见的攻击方式。文件包含漏洞主要出现在动态网页,它指的是在文件引用其他文件时,未经有效的过滤或验证,导致恶意用户可以通过构造特定的请求,获取系统的敏感信息或执行任意代码。 首先,一个常见的做法是利用路径遍历来获取敏感文件。攻击者通过构造包含../的文件路径,让服务器读取到位于网站根目录之外的敏感文件。例如,攻击者可能会访问config.php,其包含数据库的用户名和密码。 其次,攻击者也可能利用文件包含漏洞实现远程文件包含,进一步扩大攻击面。如在引入文件的地方,通过传递网络路径的方式,将远程服务器上的恶意文件包含到受影响的网站上,从而执行任意代码。这种方式被称为远程文件包含(RFI)攻击。 除此之外,攻击者还可以通过利用用户的输入来实现文件包含漏洞。在某些情况下,网站可能会动态地引入用户提交的内容,例如通过GET或POST参数。攻击者可以构造恶意的参数值,使得网站将用户输入的内容当作文件路径进行解析,从而执行恶意代码或访问敏感文件。 为了防止文件包含漏洞,开发者需要进行严格的输入验证和过滤。例如,可以使用白名单机制,只允许系统访问指定目录内的文件。此外,对于用户输入的参数,要进行充分的校验和过滤,确保其只包含允许的字符和路径。 总之,在CTF比赛,常见的文件包含漏洞攻击方式主要包括路径遍历、远程文件包含和用户输入导致的漏洞。为了保护系统安全,开发者需要进行合适的输入验证、输出过滤和权限控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值