第三方介面 駭客怎麼愛你都不嫌多
0x01 寫在前面
本文總結了烏雲主站最近提交的 由於第三方介面程式導致的高危漏洞 本文例項都是使用率高,且在近期爆出漏洞的API,具有一定現實意義
在程式中嵌入第三方程式,可以追溯到discuz!。後來的各種SNS程式,CMS,BBS都紛紛效仿,他們或由官方 或由站長自己新增了各種外掛和api,一方面 這些指令碼增加了使用者體驗,然而在駭客眼中,實則是增大了入侵機率。
各種介面的新增,一般是在整站程式開發週期之後,那麼開發全域性觀的不同步是顯而易見的後果,簡而言之,前期種種過濾和安全防護,可能由於後期開發對第三方外掛盲目的信任,被徹底繞過,導致漏洞形成。
0x02 例項分析
看看那些廠商都是怎麼被出賣的
第一彈 Alipay支付外掛那碎一地的節操
影響程式:Ecshop,Dedecms,Cmseasy ...
lib\plugins\pay\alipay.php
我們看看cmseasy怎麼被自己人幹掉的吧 在alipay.php中 自己定義的資料庫函式在rec_update中
#!php
public function rec_update($row , $where){ ... 省略無關程式碼 ...
$sql="UPDATE `".$this->tablename."` SET ".$sqlud." WHERE ".$where; //漏洞出在這裡 一隻裸體的$where
return $this->simpledb->execute($sql);
}
可以看到 where 是沒有單引號的,我們看看where從哪裡能傳進來。
#!php
public static function changeorders($id,$orderlog) {
//file_put_contents('logs.txt', $id);
$where=array();
$where['id']=$id;
$where['status']=4;
//$where['orderlog']=serialize($orderlog);
$update=orders::getInstance()->rec_update($where,$id);
if($update<1) {
exit('改變訂單狀態出錯,請聯絡管理員');
}
}
繼續追蹤changeorders
#!php
function respond() {
if (!empty($_POST)) {
foreach($_POST as $key =>$data) {
$_GET[$key] = $data;
}
}
$payment = pay::get_payment($_GET['code']);
$seller_email = rawurldecode($_GET['seller_email']);
$order_sn = str_replace($_GET['subject'],'',$_GET['out_trade_no']);
$order_sn = trim($order_sn);
....省略....
pay::changeorders($order_sn,$_GET);
看到沒$order_sn 沒有過濾 注入於是產生了 由於沒有顯示點 延時注入即可。
第二彈 Tenpay支付外掛也瘋狂
lib\plugins\pay\tenpay.php
阿里巴巴那麼瘋狂,BAT的三弟騰訊怎麼能示弱? 組隊坑廠商什麼的最有愛了~ 由於Cmseasy最信任外掛了。。所以又是他受傷。。。
#!php
class tenpay {
......
function respond() {
require_once ("tenpay/PayResponseHandler.class.php");
$resHandler = new PayResponseHandler();
$sp_billno = $resHandler->getParameter("sp_billno"); //騰訊的函式,類似於$_GET['sp_billno']或者$_POST['sp_billno']
//上面談到GET不受過濾影響,本地問價內包含POST,GET提交都可,但是注入的話必須提交POST,因為GET是URL碼.
//sp_lillno=sp_billno=-1-1-../../../demo 包含根目錄的demo.php
preg_match_all("/-(.*)-(.*)-(.*)/isu",$sp_billno,$oidout);
$paytype = $where['pay_code'] = $oidout[3][0];
include_once ROOT.'/lib/plugins/pay/'.$paytype.'.php';//匹配上面正則就行,包含之,觸發,但是實在找不到能截斷的PHP檔案了,所以雞肋了。
$pay = pay::getInstance()->getrows($where); //SQL隱碼攻擊,跟進0x02
......
}
看到where沒? 難道又是一隻裸體動物? 答案是NO 這次是Cmseasy本身程式碼和API共同狼狽為奸 看getrows
#!php
function getrow($condition,$order='1 desc',$cols='*') {
$this->condition($condition); //OMG跟進,又是這個函式
return $this->rec_select_one($condition,'*',$order);
}
function condition(&$condition) {
if (isset($condition) &&is_array($condition)) {
$_condition=array();
foreach ($condition as $key=>$value) {
$value=str_replace("'","\'",$value);//問題函式在這裡 MARK
$_condition[]="`$key`='$value'";
}
$condition=implode(' and ',$_condition);
}
......
}
試想一下,當我們POST提交'evalsql
由於gpc作用 會變成 \'evalsql
經過剛剛mark的那一行程式碼 就變成了 \\'evalsql
單引號被解救了 - -
所以賣隊友成功
第三彈 騰訊連彈 換個姿勢我們們繼續賣隊友
微信sdk介面(weixin.php) 影響程式:數不清,這個太多了點,從大到小
挑個超級典型的物件 PHPYUN
/phpyun的全域性過濾堪稱典範 所有特殊字元入庫一律被替換成´ 再加上360wscan 銅牆鐵壁的防禦
那麼壯士yun是不是革命成功? 錯! 汪精衛weixin笑而不語。。。/
這裡引入一個古老而又粗暴的漏洞 XML實體注入,也許下一篇drop文就是這個的科普
#!php
//weixin/model/index.class.php
private 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);
$time = time();
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
if(!empty( $keyword ))
{
$msgType = "text";
$contentStr = "Welcome to wechat world!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
首先介紹下
$GLOBALS["HTTP_RAW_POST_DATA"]
這個變數是講POST提交來的資料原封不動的接收 比如POST a=1
$GLOBALS["HTTP_RAW_POST_DATA"]
就是“a=1” 不受gpc 360wscan的影響 然後接收到$postStr之後 又沒有處理 於是乎...
#!php
if($MsgType=='event')
{
$MsgEvent = $postObj->Event;
if ($MsgEvent=='subscribe')
{
$centerStr = "<Content><![CDATA[歡迎您關注".iconv('gbk','utf-8',$this->config['sy_webname'])."!\n 1:您可以直接回復關鍵字如【銷售】、【南京 銷售】、【南京 銷售 XX公司】查詢您想要的職位\n繫結您的賬戶體驗更多精彩功能\n感謝您的關注!]]></Content>";
$this->MsgType = 'text';
}elseif ($MsgEvent=='CLICK')
{
$EventKey = $postObj->EventKey;
if($EventKey=='我的帳號'){
$centerStr = $this->bindUser($fromUsername);
傳進bindUser之後 最終到達
#!php
isBind private function isBind($wxid='')
{
if($wxid)
{
$User = $this->obj->DB_select_once("member","`wxid`='".$wxid."'","`uid`,`username`");
wxid就是一開始POST來的資料裡面的引數 注入赤果果的產生
微信團隊開發這個API的時候,其實是驗證了來源的
驗證了signature(簽名)
驗證的條件是 檢查signature是否非空 非空 非空...
0x03 卷尾語
這樣的第三方外掛 應該成為程式設計師或者白帽子重點檢查物件,原因如上0x02 這貨們如同後門一般有魅力...
一般來講 造成此類漏洞的原因有兩種
一,雙方相互信任 (你不打單引號,我們不過濾,好基友一起死)
二,簽名未設定或者驗證
為各位客官提供點思路
相關文章
- 紅客、駭客、駭客有什麼區別?駭客守則注意事項!2022-09-09
- 駭客偷你的密碼幹什麼?2022-11-27密碼
- CopyOnWriteArrayList你都不知道,怎麼拿offer?2019-01-19
- 黑吃黑——駭客組織透過駭客工具攻擊其他駭客2022-11-27
- 網站存在漏洞被駭客入侵了怎麼解決2020-03-20網站
- 愛客CRM系統排名?愛客CRM辦公系統怎麼選?什麼是使用者口碑最好的愛客CRM系統?2022-03-18
- 2.3萬個MongoDB資料庫遭駭客比特幣勒索,你中招了嗎?中招怎麼辦?2020-07-03MongoDB資料庫比特幣
- 《親愛的客棧2》愛奇藝影片怎麼轉換MP42018-11-19
- 駭客動態播報|果然,駭客也用上了ChatGPT……2023-02-27ChatGPT
- 面試官:你連RESTful都不知道我怎麼敢要你?2020-01-11面試REST
- 谷歌駭客語法2018-08-07谷歌
- [原創]雲上挖礦大資料:駭客最鍾愛門羅幣2019-01-21大資料
- 如果讓你帶一個什麼都不懂的人入門學前端,你應該怎麼帶他?2024-11-29前端
- LastPass 遭駭客攻擊2022-09-29AST
- Apache Mesos為什麼會失敗?(駭客新聞)2021-04-15Apache
- 你上家公司的介面是怎麼管理的?2024-11-28
- 駭客型別有哪些?他們有什麼區別?2023-11-16型別
- 為什麼釣魚郵件備受駭客青睞2020-07-21
- 你連存活到JDK8中著名的Bug都不知道,我怎麼敢給你加薪2020-03-10JDK
- 1 億銀行使用者資訊失竊之謎:駭客是怎麼找到漏洞的?2019-08-06
- 藍芽耳機千萬不要這樣用?不然你的聽力怎麼損傷你都不知道!2020-11-17藍芽
- WireShark駭客發現之旅--開篇2020-08-19
- 知名駭客組織Anonymous(匿名者)2022-11-27
- 你喜歡大海我愛過你什麼梗 你喜歡大海我愛過你出處2018-08-02
- api介面怎麼用?2023-05-05API
- AIP介面怎麼弄?2020-05-27AI
- 美國空軍舉辦駭客大賽,讓駭客黑掉它的在軌道衛星2022-11-28
- 世界駭客大賽Pwn2Own:駭客攻破微軟、特斯拉、macOS,奪取百萬美元獎金2023-03-24微軟Mac
- 西班牙19歲天才駭客被逮捕,該駭客自稱能訪問九成西班牙公民資訊2023-04-07
- 領導說“我都不知道你擅長什麼”2024-03-20
- 2023年最流行的道德駭客工具2023-04-02
- 《紐約客》封面:學會愛你的機器人寶寶2018-11-26機器人
- 你肯定連變數都不會2022-01-22變數
- 戀愛遊戲該怎麼做?戀愛遊戲+可以是什麼?2021-03-10遊戲
- 你為什麼不愛遊戲了?2019-07-24遊戲
- 介面測試怎麼做2020-06-10
- 揭秘最為知名的駭客工具之一: Netcat!適用安全測試、滲透測試、駭客攻擊!2024-09-18
- api介面怎麼對接?你只需要注意這4點2023-02-28API