php写入webshellphpini
作者:休闲 来源:热点 浏览: 【大 中 小】 发布时间:2026-10-17 06:14:37 评论数:
PHP的ini_set函数,在很多人眼里就是个设置运行环境的工具。但在我眼里,它是一把能撬开服务器大门的细长撬棍。别急着反驳,听我说个真实案例。
去年某次授权渗透测试,目标站是个老旧的CMS。代码审计时发现一处文件上传,过滤了后缀名,但没过滤.htaccess。常规思路是传个.htaccess把.jpg解析成PHP。但服务器用的是Nginx,.htaccess根本不起作用。正当我准备放弃时,瞥见上传目录里有个PHP文件,内容里写着ini_set('extension', '...')。那一刻我意识到,这才是真正的入口。
你猜怎么着?PHP的ini_set能动态修改配置,其中有个参数叫auto_prepend_file。它能在每个PHP脚本执行前,自动包含一个文件。如果我能通过上传点写入一个内容可控的文件,再用ini_set把它设为auto_prepend_file,那服务器上所有PHP页面,都会先执行我的代码。这比直接传个Webshell隐蔽得多,因为日志里看不到任何可疑的请求参数。
具体操作不复杂。先上传一个内容为<?php @eval($_POST['x']);?>的文件,后缀名改成.log。接着找个能触发PHP错误的地方,比如访问一个不存在的PHP文件,让框架抛异常。在异常处理逻辑里,如果开发者写了ini_set来调整错误日志路径,我就可以把路径指向我上传的.log文件。但更直接的做法是,利用文件上传功能本身,如果上传后页面会回显文件路径,我就在上传时构造文件名,让路径中含有auto_prepend_file=php://input之类的字符串,然后配合POST数据流注入代码。
这招的狠劲在于,它绕过了所有对Webshell文件特征的检测。安全狗、D盾查的是脚本文件内容,但我根本没上传PHP脚本——只是一个普通的日志文件。真正执行恶意代码的是服务器上原本就合法的PHP文件,只是被ini_set临时改了执行流程。就像你家里的门锁没问题,但有人把备用钥匙藏在了你每天都会踩的地毯下面。
防护思路其实也简单。第一,禁用ini_set里高危参数,在php.ini里设置disable_functions=ini_set,或者用open_basedir限制文件包含路径。第二,上传目录坚决不执行PHP,Nginx里配location ~* \.(php|log)$ { deny all; }。第三,也是最根本的——别让用户上传的文件名和内容有任何机会影响配置指令。开发者总以为ini_set是给自己用的,忘了它也可能被利用。
那次测试最后,我用这个法子拿到了服务器权限。但说实话,心里挺不是滋味。一个配置函数而已,却在特定场景下成了致命漏洞。PHP的灵活是它的优点,也是它的软肋。你永远不知道哪行看似无害的代码,会被拼凑成一把钥匙。写代码的时候多问一句:如果这个值来自用户输入,会发生什么?答案往往让你后背发凉。
