PHP会话变量不当使用可导致任意代码执行,包括:一、session_decode反序列化触发魔术方法;二、$_SESSION值直传eval等函数;三、会话变量控制include路径引发文件包含;四、自定义session处理器中执行用户输入;五、旧版PHP中preg_replace的/e修饰符执行会话内容。

如果在PHP应用中,会话变量被不当使用或与动态代码执行函数结合,可能导致任意PHP代码被执行。以下是几种实际存在的触发方式:
当会话数据以序列化格式存储且未严格校验时,攻击者可构造恶意序列化字符串,利用session_decode解析后触发__wakeup或__destruct魔术方法中的危险操作。
1、在PHP配置中启用session.serialize_handler=php_serialize,确保会话以serialize格式写入。
2、在用户可控输入点(如Cookie中的PHPSESSID)注入恶意序列化字符串,例如:O:8:"BadClass":1:{s:4:"code";s:16:"system('id');";}。
立即学习“PHP免费学习笔记(深入)”;
3、在服务端调用session_start()后立即执行session_decode($_COOKIE['PHPSESSID']),导致反序列化触发代码执行。
当开发者将$_SESSION中的值未经过滤直接传入eval、assert或create_function等动态执行函数时,会话变量内容会被当作PHP代码解析执行。
1、设置会话变量:$_SESSION['payload'] = 'phpinfo();';
2、在后续逻辑中存在类似代码:eval('echo ' . $_SESSION['payload']);。
3、会话恢复后,该eval语句执行phpinfo()函数。
若会话变量用于动态包含文件路径且未限制目录范围或白名单校验,可导致远程或本地文件包含进而执行PHP代码。
1、设置会话变量:$_SESSION['module'] = '../shell.php';
2、服务端存在类似逻辑:include $_SESSION['module'] . '.inc';。
3、当shell.php存在于Web根目录下且包含PHP代码,该代码将在包含时执行。
当使用session_set_save_handler注册自定义会话处理器,并在open、read、write等方法中引入用户可控的会话键名或值时,可能在会话生命周期中触发执行逻辑。
1、定义一个类,其read方法中对$key参数进行eval:eval($key);。
2、调用session_set_save_handler(new CustomHandler())并启用会话。
3、通过伪造Session ID使$key参数落入攻击者控制范围,例如ID为'a";phpinfo();//',在read中被拼接执行。
在旧版PHP中,若会话变量被用作preg_replace第三个参数且正则使用/e修饰符,其内容将被当作PHP代码执行。
1、设置会话变量:$_SESSION['pattern'] = '.*';
2、服务端存在类似调用:preg_replace('/' . $_SESSION['pattern'] . '/e', 'system("ls")', 'test');。
3、该正则表达式在匹配时执行system("ls")命令。
以上就是会话变量如何触发php代码执行_会话变量触发php代码执行方法【实例】的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号