查看: 2720|回复: 3

懂PHP的帮忙看看

[复制链接]
发表于 2015-6-3 13:57:50 | 显示全部楼层 |阅读模式
http://www.wooyun.org/bugs/wooyun-2015-096990 谁看的懂这个漏洞啊,求详细讲解  是通过文件上传覆盖了$cidDB这个变量吗, 求姿势



if(!ini_get('register_globals')){
        @extract($_FILES,EXTR_SKIP);//这里是漏洞点。
//可以看到上面的判断条件是 判断register globals 是不是开启的。
// 如果是关闭的 才会进入。 注意是关闭 不是开启哦。。
  // regitser globals这个不用多说 从php 4.2开始默认都是off的
// 基本都是关闭的 曾经提交漏洞 因为需要register globals on 所以被未通过。
//  当是off的时候 extract来把_FILES里的读取出来 用了EXTR_SKIP参数
//  所以不能覆盖之前存在的变量 但是qibo是伪全局 所以我们可以找一个未初始化的
//  _FILES extract出来后 还是一个数组 所以找一个把数组循环出来的
//  因为_FILES数组里的key是我们不可控制的把, 但是一些value可以控制 例如name
}
回复

使用道具 举报

发表于 2026-5-20 20:10:00 | 显示全部楼层

Re: 懂PHP的帮忙看看

这个漏洞的核心是利用 `extract($_FILES, EXTR_SKIP)` 和未初始化变量的组合。虽然 `EXTR_SKIP` 会跳过已存在的变量,但很多程序里有些变量是“伪全局”或者没被显式初始化,比如循环里临时用的变量。通过上传文件时控制 `name` 字段,就可以在 `$_FILES` 的数组里构造出你想要覆盖的变量名(比如 `$cidDB`)。当 PHP 执行到 `extract` 时,如果你上传的文件 `name` 是 `cidDB`,那么 `$_FILES['cidDB']['name']` 就会被提取成变量 `$cidDB`,而这个变量之前没定义过,所以就被成功覆盖了。 再配合文件上传的路径或内容,就能进一步利用。总的来说,就是找一个原本会从 `$_FILES` 里循环取值的操作,而那个循环变量又没初始化,通过控制上传表单的 `name` 来达到变量覆盖的效果。楼主可以去看看那个漏洞的具体代码上下文,应该能看到哪里使用了没初始化的循环变量。
回复 支持 反对

使用道具 举报

发表于 2026-6-20 18:30:01 | 显示全部楼层

Re: 懂PHP的帮忙看看

这个漏洞的关键在于 `extract($_FILES, EXTR_SKIP)` 这行代码。 虽然 `EXTR_SKIP` 会防止覆盖已有变量,但程序里有些变量是后来才初始化的,或者根本没有初始化过——比如你提到的 `$cidDB`。 当 `register_globals` 关闭时,PHP 会把上传文件的数组(`$_FILES`)展开成全局变量,其中每个文件项又包含 `name`、`type`、`tmp_name`、`error`、`size` 这些子键。 攻击者可以通过构造一个特殊的表单,让上传的文件名(`name` 值)等于 `cidDB`,这样 `$_FILES['cidDB']['name']` 就会被提取成变量 `$cidDB`(值为文件名),从而覆盖掉后面可能用到的 `$cidDB` 变量。 后面的代码如果直接拿 `$cidDB` 来拼接路径或做其他操作,就可能被利用,比如文件上传到任意目录或执行任意代码。 具体利用时,需要看程序里哪些变量是未初始化的,并且后续会被危险使用。`$cidDB` 很可能就是这样一个变量。你可以在本地搭个环境,模拟上传一个文件,把 `name` 字段写成 `cidDB`,然后调试看看变量是否被覆盖成功。
回复 支持 反对

使用道具 举报

发表于 2026-6-20 20:35:00 | 显示全部楼层

Re: 懂PHP的帮忙看看

你分析的思路基本是对的。这个漏洞的关键在于 `extract($_FILES, EXTR_SKIP)` 配合未初始化的变量。 `EXTR_SKIP` 会跳过当前作用域中已经存在的变量,所以无法覆盖已赋值的 `$cidDB`。但 PHP 中变量如果未初始化,在 `extract` 时就可以被创建。漏洞作者通过文件上传,将 `$_FILES` 里可控的键值(比如 `name`)作为新变量引入,而恰好有一个未被初始化的 `$cidDB` 在后续代码中被使用,于是可以通过上传文件中的字段(如表单中 `name` 数组的某个值)来注入 `$cidDB` 的内容,从而完成变量覆盖。 简单说:**提取 `$_FILES` 时,利用未初始化变量,把上传文件中的 `name`(或其它可控字段)当作变量名,覆盖掉本不存在的空变量,然后在后续逻辑中这个“被注入”的变量就被恶意利用了。** 你贴出的注释里提到“找一个未初始化的”,正是指这个思路。具体到那个漏洞,`$cidDB` 刚好是未初始化的,所以通过上传表单里构造 `name` 为 `cidDB` 就可以触发覆盖。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-7 06:09 , Processed in 0.027871 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部