Destoon 20140530最新版超全局变量覆盖导致的安全问题(官方demo演示)

文章目录

代码片段0x1 /common.inc.php行17

这里的逻辑是 如果 post get cookie 请求中的$$key和$value相等 就unset掉$$key
如果我们向1.php?x=1提交一个POST请求 内容为_GET[x]=1
因为?x=1 所以$_GET内容为 array(‘x’=>’1’)
当开始遍历$_POST的时候 $__k是_GET[x] 所以$$__k 就是$_GET[x]也就是array(‘x’=>’1’)
$__v是POST上来的一个数组 内容也是array(‘x’=>’1’)
$$__k == $__v成立所以 我们的超全局变量 $_GET就这么华丽丽的被unset了

代码片段0x2 /common.inc.php行65

由于我们的$_GET已经在前面被unset了 所以即使加了EXTR_SKIP extract($_POST)仍然能够正常的初始化$_GET extract($_GET)的值就成功绕过了全局的strip_sql 和strip_key函数的检查。

短时间没有找到合适的注入点,却发现了另外一个问题
其实不光光是$_GET,$_FILES也是可以覆盖的。

$_FILES的覆盖比$_GET要稍微复杂一些,因为$_FILES初始值是array()且只在有文件上传的时候才会重新初始化
因为上面判断是$$__k == $__v而能跟array() ==的只有null、false和array()很明显这些我们都无法用get post或者cookie提交上去
如果我们真的上传了一个文件 那$_FILES[file][tmp_name]又是一个未知量 所以 这里我把上传的包改了 删掉了filename
这样上传就会出错,$_FILES就会被初始化成

array(
‘name’=>”,
‘type’=>”,
‘size’=>0,
‘tmp_name’=>”,
‘error’=>4
)

这个数组我们就可以伪造了,伪造一个相同的数组之后,$_FILES就被unset了 我们就能用$_POST 或者$_GET来重新初始化它
来看下利用的地方:
代码片段0x3 /upload.php行66

可以看到$_FILES直接丢给了upload类 然后直接save了
代码片段0x4 /include/upload.class.php行43

这里除了用到move_uploaded_file外 还尝试了copy
我们知道 move_uploaded_file是会检查第一个参数的 如果不是合法的上传文件就会返回false
而copy就简单粗暴的多了 不管你是哪的 直接给你拷贝过去
$this->file其实就是$_FILES[file][tmp_name] 而这个值现在是可以自己构造的了,所以这里就可以读取任意文件了
POC如下:

这里用$_GET配合上传unset了$_FILES然后在extract($_POST)的时候重新初始化了$_FILES
随便选个文件提交拦下数据包 修改
Content-Disposition: form-data; name=”file”; filename=””
中的filename字段为空 如图就返回了我们要读取的文件了

漏洞证明:

0713583277e175c610684f0f278c9e82be3a4253

 

07135849d8cb80a5bd0d920edd9d5dfa59763f91

 

原文链接:,转发请注明来源!

发表评论

要发表评论,您必须先登录

  • 6 Responses to “Destoon 20140530最新版超全局变量覆盖导致的安全问题(官方demo演示)”
    • 明天的风

      老大,请问你演示的时候,用的是什么工具?为什么我用burp不行呢?

      • 有的补上了~

        • 是的呀,我后来测试了20几个站,没有一个是成功的,可能是我的操作流程有问题,我post过后就用浏览器打开那个rar文件,结果不像老大在文章中说的那样可以看到config.inc.php

          明天的风
        • 老大,我还有个疑问想问您下:是不是我的操作步骤有问题?我的操作步骤是首先上传一个文件,然后通过浏览器get打开这个文件,否则按照教程中说的步骤没法上传空文件名,会提示没有任何文件被上传~!

          明天的风
    • 逆天

      这个应该是 $_GET[x] 被unset了吧, 不可能是$_GET被unset, 不然你后面的extract 都不执行。

    • 深夜的放逐

      测试成功上传rar文件,请问怎样拿shell?
      因为上传php文件还是会提示上传类型不对的。