时间:2021-07-01 10:21:17 帮助过:2人阅读
- <br>PHP_FUNCTION(session_regenerate_id) <br>{ <br>... <br>if (PS(id)) { <br>... <br>efree(PS(id)); <br>} <br>PS(id) = PS(mod)->s_create_sid(&PS(mod_data), NULL TSRMLS_CC); <br>PS(send_cookie) = 1; <br>php_session_reset_id(TSRMLS_C); <br>RETURN_TRUE; <br>} <br>RETURN_FALSE; <br>} <br> <br>但是此分配操作不是一个原子操作。因此可被如内存限制冲突操作来中断,另外,根据PHP配置,生成器可触发PHP错误也可导致一个中断。 <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS) <br>{ <br>... <br>switch (PS(hash_func)) { <br>... <br>default: <br>php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid session hash function"); <br>efree(buf); <br>return NULL; <br>} <br>... <br>if (PS(hash_bits_per_character) < 4 <br>|| PS(hash_bits_per_character) > 6) { <br>PS(hash_bits_per_character) = 4; <br>php_error_docref(NULL TSRMLS_CC, E_WARNING, "The ini setting hash_bits_per_character..."); <br>} <br>... <br> <br>通过注册一个恶意用户空间错误处理器可比较容易的利用此问题。当此处理器调用一个HASH表分配到前会话识别器相同的地方,然后恶意错误处理器可以通过调用session_id()函数和分配包含伪造HASH表到HASH表相同地方,这样来触发另一个之前的会话识别器的释放操作。当用户错误处理器完成后会解构覆盖的HASH表而调用攻击者提供的代码。 <br>http://www.php-security.org/MOPB/MOPB-22-2007.html <br>测试方法: <br>[www.sebug.net] <br>本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! <br>http://www.php-security.org/MOPB/code/MOPB-22-2007.php <br>SEBUG安全建议: <br>目前没有解决方案提供:</li><li> </li><li> </li></ol></pre>