前言: Ecshop是国内的一款开源的电商框架,在国内应用较为广泛,当前最新版本为4.0.0,最近对其代码进行了简单的分析,发现可以绕过其filter触发XSS。

一、漏洞利用方式

发送GET请求包如下:

GET/CMS/ECShop_V4.0./user.php http/1.1Referer:https://127.0.0.1" /><a href=j&#97v&#97script:&#97lert('Cyc1e_test')><imgsrc="http://www.52bug.cn/hkjs/xxxxxUser-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) ApplewebKit/537.21 (KHTML, like Gecko)Chrome/41.0.2228.0 Safari/537.21Cookie:ECS_ID=17b608d2a679cf2c7e8611581478e6929dbfb34b;ECS[visit_times]=2Connection:keep-aliveAccept: */*Accept-Encoding:gzip,deflateHost: 127.0.0.1 

%0A

%0A%E5%85%B6%E4%B8%AD%E6%BC%8F%E6%B4%9E%E8%A7%A6%E5%8F%91%E4%BB%A3%E7%A0%81%E4%B8%BA%EF%BC%9A%0A

%0A

Referer:https://127.0.0.1" /><ahref=j&#97v&#97script:&#97lert('Cyc1e_test')><imgsrc="http://www.52bug.cn/hkjs/xxxxx 

%0A

%0A%E5%AE%9E%E7%8E%B0%E7%BB%95%E8%BF%87%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99%EF%BC%8C%E8%A7%A6%E5%8F%91XSS%E6%BC%8F%E6%B4%9E%E7%9A%84%E6%95%88%E6%9E%9C%E3%80%82%0A

%0A

%0A%E4%BA%8C%E3%80%81%E7%9B%B8%E5%85%B3%E7%8E%AF%E5%A2%83%0A

%0A

%0A%E7%89%88%E6%9C%AC%EF%BC%9AECShop4.0.0%0A

%0A

%0A%E6%BC%8F%E6%B4%9E%E7%B1%BB%E5%9E%8B%EF%BC%9A%E5%8F%8D%E5%B0%84%E5%9E%8BXSS%0A

%0A

%0A%E6%9C%AC%E5%9C%B0%E7%8E%AF%E5%A2%83%EF%BC%9Aphp5.6.27+ Apache + Mysql%0A

%0A

%0A%E4%B8%89%E3%80%81%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%0A

%0A

%0A%E8%AF%A5XSS%E6%BC%8F%E6%B4%9E%E8%B7%AF%E5%8F%A3%E7%82%B9%E5%9C%A8user.php%E6%96%87%E4%BB%B6%EF%BC%8C%E6%9F%A5%E7%9C%8Buser.php%EF%BC%9A328%E8%A1%8C%0A

%0A

%0Auser.php

在用户登入界面的处理代码中,首先变量$action赋值为login进入主体代码,若变量$back_act为空并且请求包中存在REFERER字段,则将REFERER字段中的内容赋值给变量$back_act,这是导致该漏洞的直接原因,对$back_act变量赋值过后传入assign函数进行处理,其中$smarty是模版类cls_template的实例化:/includes/init.php:170行

/includes/init.php

所以查看assign函数时跟进到模版类cls_template中查看:/includes/ cls_template.php:70行/includes/ cls_template.php对传入变量名和变量值进行变量注册,我们可以传入非数组数据对$back_act进行变量注册,注册完毕回到user.php代码,继续跟进模版类中的display函数:/includes/ cls_template.php:100行/includes/ cls_template.php调用fetch函数进行user_passport.dwt文件的页面显示,也就是显示用户登入页面,其中在user_passport.dwt文件中:user_passport.dwt$back_act值被赋值给input标签中的value,所以我们控制了$back_act变量值便可以在html页面中插入js代码。

四、绕过全局Waf触发XSS

Ecshop中定义了全局安全过滤规则,查看代码:/includes/safety.php/includes/safety.php这个过滤规则比较简单粗暴,利用’on[a-zA-Z]{3,15}’ 过滤了所有的on开头js事件,所以用事件触发是较为困难了,并且<script、alert、eval、data、Javascript等敏感字符,继续查看代码:

E7.jpg

$back_act的值如果不是数组便传入filter()函数中利用preg_match进行字符校验,这里利用了/i,所以不区分大小写,无法利用大小写的方式进行绕过,不过这里的敏感字符过滤也不全,例如对于弹窗的js函数confirm就可以被利用,所以主要考虑的是如何绕过过滤检测。

我利用了HTML的实体编码来进行绕过,在 HTML 中,某些字符是预留的,比如不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用字符实体,如需显示小于号,我们必须这样写:< 或 <,其中’< ‘便是小于号(<)的HTML实体编码,并且不仅是 “<””>” 这样的能编码,所有字符均能编码,a-zA-Z的HTML实体编码方式是&#[字符ACCII编码],例如a->&#97。

所以可以利用这一编码方式进行构造POC:

Referer: [https://127.0.0.1](https://127.0.0.1)"/><a href=j&#97v&#97script:&#97lert('Cyc1e_test')><imgsrc="http://www.52bug.cn/hkjs/xxxxx 

%0A

%0A%E5%85%B6%E4%B8%ADj&#97v&#97script:&#97lert(%E2%80%98Cyc1e_test%E2%80%99)%E5%8F%AF%E4%BB%A5%E7%BB%95%E8%BF%87xss%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99%E7%9A%84%E5%8C%B9%E9%85%8D%E4%BB%8E%E8%80%8C%E7%BB%95%E8%BF%87%E6%9C%8D%E5%8A%A1%E7%AB%AF%E7%9A%84%E5%AE%89%E5%85%A8%E8%BF%87%E6%BB%A4%E6%A4%8D%E5%85%A5html%E9%A1%B5%E9%9D%A2%E4%B8%AD%EF%BC%8C%E7%BB%8F%E8%BF%87html%E7%BC%96%E7%A0%81%E8%A7%A3%E6%9E%90%E4%BC%9A%E6%81%A2%E5%A4%8D%E6%88%90javascript:alert(%E2%80%98Cyc1e_test%E2%80%99)%EF%BC%8C%E4%BB%8E%E8%80%8C%E8%A7%A6%E5%8F%91%E6%89%A7%E8%A1%8C%EF%BC%8C%E6%95%88%E6%9E%9C%E5%A6%82%E5%9B%BE%EF%BC%9A%0A

%0A

%0AXSS代码植入通过点击图片可以直接触发

XSS代码执行

漏洞绕过触发的方式不唯一。

五、总结

漏洞挖掘主要在于一定的技术基础,充分的经验积累以及一些运气所在,挖掘的漏洞不在大小,每一漏洞都是一次成长,新手挖掘文章,希望大牛们批评指正。

*本文原创作者:Cyc1ing

声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。