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

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

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

0day漏洞php在CTF竞赛中发明的PHP长途代码履行0day破绽 JavaScript

意外创造的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/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/

白帽汇从事信息安全,专注于安全大数据、企业威胁情报。

公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。

为您供应:网络空间测绘、企业资产网络、企业威胁情报、应急相应做事。