尝试对使用Docker官方镜像建立的WordPress站点进行Burp主动扫描,并根据结果采取了一些安全防护措施

这是2018年12月15日的《C.A. Advance》圣诞日历文章。

你好。
我是C&A Advance技术总部的@asami-H-Ishi。
虽然我在入职时没有开发经验,但我已经在公司工作3年了,其中有大约2年从事诊断员的工作。
目前,我负责协调工作,涉及诊断团队和开发部门的漏洞诊断工作。

首先

我在第6天的文章中使用了Docker的官方镜像快速启动了WordPress,并进行了WPScan以验证对其结果采取的对策。因此,我想进一步测试一下我们在漏洞诊断中使用的Burp Suite Professional的自动诊断工具会有什么结果,于是我决定进行尝试。

准备事项(我的环境)

    • Docker for Mac

 

    • ターミナル

 

    • テキストエディタ(VSCode)

 

    Burp Suite Professional v1.7.37

使用Docker官方镜像来启动WordPress。

    我会创建下面的yml文件。
version: '3'
services:
  wordpress:
    image: wordpress:5.0.0-apache
    ports: 
      - "8080:80"
    environment:
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: mysql_user
      WORDPRESS_DB_PASSWORD: mysql_pw
    restart: always
    depends_on:
      - mysql
  mysql:
    image: mysql:5.7
    environment: 
      MYSQL_ROOT_PASSWORD: root_pw
      MYSQL_DATABASE: wordpress
      MYSQL_USER: mysql_user
      MYSQL_PASSWORD: mysql_pw
    restart: always
    volumes:
      - mysql_data:/var/lib/mysql
volumes:
    mysql_data:
    1. 在终端上使用cd命令导航到存放yml文件的目录,然后使用docker-compose up -d来启动WordPress。

 

    1. 在浏览器中访问localhost:8080以完成WordPress安装,但不要登录,只显示WordPress界面。

 

    1. 使用ifconfig en0命令确认正在运行WordPress的本地环境的内部IP。

 

    1. inet下的IP是本地环境的内部IP。

 

    将浏览器中访问的localhost替换为ifconfig en0确认的IP,并进行访问。应该显示与localhost:8080相同的内容。

我将在这个状态下运行ActiveScan。

如果您已登录WordPress并进入了仪表盘,那么请登出并以非管理员身份访问WordPress页面。

通过Burp进行了ActiveScan的结果。

首先,如果仍然使用localhost:8080作为地址,Burp将无法与其进行通信。
您需要将其更改为本地IP,并在Burp的Proxy选项卡>选项选项卡>匹配和替换中,将Response body中的localhost:8080替换为(ifconfig en0所获取的本地IP):8080,这样才能正常进行爬行并将URL保存到历史记录中。
如果您想在Burp中进行实际尝试,请进行相应的设置。

同时与Burp进行通信,爬取整个WordPress网站。

此外,由于本文并未关注Burp Suite的使用方法,因此不会提及Burp界面和操作。

ActiveScanの結果

非常出现了(д) ゚ ゚

逐一确认结果。

1. Cleartext submission of password
Severity:  High/Confidence:  Certain

由于HTTP通信没有加密,所以密码可以以明文的形式进行传输。这是一个问题,所以我们要将其加密为SSL!因此,我们需要获取一个合适的证书并将其公开在网上。
→在网上发布时,这是我们首先要解决的问题,但由于这是一个本地环境,我们会忽略这一点。

2. Form does not contain an anti-CSRF token
Severity:  High/Confidence:  Tentative

这是一个关于未设置CSRF令牌的表单的指摘,但是在查看每个在Issue中检测到的URL的详细信息时,它指的是首页的搜索表单和登录页面的登录表单。
因为两者在获取的响应主体中都没有包含CSRF令牌的FORM,所以这是一个报告,表明没有特别的安全漏洞。
我认为这是一个误报。

3. Request vulnerable to Cross-site Request Forgery
Severity:  High/Confidence:  Tentative

在Burp的问题中,有一个关于CSRF的说明,内容如下:

跨站请求伪造(CSRF)是指攻击者通过利用社交工程(例如通过电子邮件或聊天发送链接)来强迫用户在当前已经认证的Web应用程序中执行不必要的操作。攻击者可以通过这种方式攻击Web应用程序的用户,并使其执行攻击者所选择的操作。当CSRF漏洞被利用时,用户的数据可能会被侵害,并且攻击者可能会接管用户的帐户。如果目标用户是管理员账户,整个Web应用程序可能会受到威胁。

被检测到的URL是使用WordPress评论功能发送的。Burp的问题报告中有关于修复此问题的以下描述。

应用程序在执行任何需要改变应用程序状态、添加/修改/删除内容的操作时,都需要实施反CSRF令牌。反CSRF令牌必须是每个用户独有的长随机值,以防止攻击者轻易地进行暴力攻击。当应用程序处理用户请求时,验证CSRF令牌非常重要。应用程序必须确认请求中存在令牌,并且与用户当前的令牌相匹配。如果这些检查中任何一个失败,应用程序应该拒绝该请求。

然而,这个功能是WordPress本身的默认功能,因此可以考虑以下两种解决方案。

    • (今作っているWordPressで作成するサイトにコメント機能が必要ないなら)コメント機能そのものをダッシュボードから操作して削除する

 

    nonceをつける

由于我这次没有足够的时间来进行验证,所以我决定在整个网站上安装一个插件,可以禁止接受评论。有关步骤等,请参考下面的URL链接。您可以使用”Disable Comments” 插件来消除压力来源、负面评论和垃圾评论。

4. Password field with autocomplete enabled
Severity:  Low/Confidence:  Certain

德丸先生在“揭开安全的都市传说”这张幻灯片的第42页左右提到,由于无法禁用自动完成功能,所以我们并没有特别采取对策。

5. Unencrypted communications
Severity:  Low/Confidence:  Certain

这是与1号相同的指出。

6. Browser cross-site scripting filter misconfiguration
Severity:  Low/Confidence:  Certain

浏览器的XSS过滤器配置错误,建议进行修正。
进行设置X-XSS-Protection: 1; mode=block 头部。

7. Content Sniffing not disabled
Severity:  Low/Confidence:  Certain

根据Burp的问题描述

如果没有此标头,某些浏览器即使这些属性被正确定义,也会尝试识别响应内容的类型和编码。这可能会导致Web应用程序容易受到跨站脚本攻击(XSS)。

ということなので、 `X-Content-Type-Options: nosniff` ヘッダの設定をします。

    1. 详细错误信息被公开显示了。严重程度:低/可信度:确定。

错误信息的详细内容可能成为攻击者的线索,所以我们希望将其隐藏起来。
不过,经过确认似乎是误报,所以我们会忽略这个问题。

9. Client-side HTTP parameter pollution (reflected) 
Severity:  Low/Confidence:  Firm

这是误报,并没有出现指向外部网站或者 XSS 攻击等情况。

10. Cross-domain POST
Severity:  Information/Confidence:  Certain

这是一个关于指出本地主机和本地IP具有不同域名的误报的提醒,看起来是误检测。

11. Input returned in response (reflected)
Severity:  Information/Confidence:  Certain

经过对全部问题的检查,特别是没有发现与链接和脚本有关的受影响元素,因此可以确定这是误报。

12. Cross-domain Referer leakage
Severity:  Information/Confidence:  Certain

我们将逐个确认在Issue中检测到的域名。
鉴于我们使用WordPress,如果您熟悉WordPress官方网址或使用的外部服务的域名,可以直接保留,不必担心。
如果有令人担忧的域名,我们将进行谷歌搜索,以确定是否需要保留,并进行删除判断。

13. Cross-domain script include
Severity:  Information/Confidence:  Certain

这是第十个选项。

14. Cookie without HttpOnly flag set
Severity:  Information/Confidence:  Certain

如果cookie没有设置HttpOnly标志,会引发以下问题。
如果网站存在跨站脚本攻击(XSS),攻击者可能窃取会话cookie,因此应该在会话cookie上设置HttpOnly标志。

15. Frameable response (potential Clickjacking)
Severity:  Information/Confidence:  Firm

需要设置X-Frame-Option头。由于WordPress功能已设置为SAMEORIGIN,因此将其设置为整个网站同样适用。

关于相应的内容

根据以上的结果,本次想要处理的事项是

    レスポンスヘッダに下記設定を入れたい
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Option: SAMEORIGIN

由于头部漏洞是进行弱点扫描时必定会出现的问题,所以在定制WordPress过程中最好提前处理。设置可以像使用WPScan时一样,事先写入Dockerfile,并在启动WordPress时使用这些设置。以下是包含所有设置的Dockerfile和yml文件。希望对您有所帮助。

FROM wordpress:5.0.0-apache

# phpのバージョン情報を隠せた
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
RUN sed -i -e "s|expose_php = On|expose_php = Off|" "$PHP_INI_DIR/php.ini"

# apacheのバージョンを隠す
RUN echo "ServerSignature Off" >> /etc/apache2/apache2.conf
RUN echo "ServerTokens Prod" >> /etc/apache2/apache2.conf

# 不要ファイルの削除
RUN rm -rf /usr/src/wordpress/readme.html /usr/src/wordpress/xmlrpc.php

# meta
RUN bash -c 'echo -e "remove_action(\"wp_head\",\"wp_generator\");" >> /usr/src/wordpress/wp-content/themes/twentynineteen/functions.php'
RUN bash -c 'echo -e "foreach ( array( \"rss2_head\", \"commentsrss2_head\", \"rss_head\", \"rdf_header\",    \"atom_head\", \"comments_atom_head\", \"opml_head\", \"app_head\" ) as \$action ) {    if ( has_action( \$action, \"the_generator\" ) )        remove_action( \$action, \"the_generator\" );}" >> /usr/src/wordpress/wp-content/themes/twentynineteen/functions.php'

# バージョン消す
RUN bash -c 'echo -e "function vc_remove_wp_ver_css_js(\$src){if(strpos(\$src,\"ver=\".get_bloginfo(\"version\")))\$src=remove_query_arg(\"ver\",\$src);return \$src;}" >> /usr/src/wordpress/wp-includes/functions.php'
RUN bash -c 'echo -e "add_filter(\"style_loader_src\", \"vc_remove_wp_ver_css_js\", 9999);" >> /usr/src/wordpress/wp-includes/functions.php'
RUN bash -c 'echo -e "add_filter(\"script_loader_src\", \"vc_remove_wp_ver_css_js\", 9999);" >> /usr/src/wordpress/wp-includes/functions.php'

# ヘッダの設定をする
RUN bash -c 'echo "Header append X-XSS-Protection: \"1; mode=block\"" >> /etc/apache2/apache2.conf'
RUN bash -c 'echo "Header append X-Content-Type-Options: nosniff" >> /etc/apache2/apache2.conf'
RUN bash -c 'echo "Header append X-Frame-Options: SAMEORIGIN" >> /etc/apache2/apache2.conf'
RUN bash -c 'a2enmod headers'
version: '3'
services:
  wordpress:
    build: .
    ports: 
      - "3000:80"
    environment:
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: mysql_user
      WORDPRESS_DB_PASSWORD: mysql_pw
    restart: always
    depends_on:
      - mysql
  mysql:
    image: mysql:5.7
    environment: 
      MYSQL_ROOT_PASSWORD: root_pw
      MYSQL_DATABASE: wordpress
      MYSQL_USER: mysql_user
      MYSQL_PASSWORD: mysql_pw
    restart: always
    volumes:
      - mysql_data:/var/lib/mysql
volumes:
    mysql_data:

如果你有任何类似的建议,比如”还是这样做比较好”或者”我们应该更带重视这个地方”,请告诉我,我会非常感激!!!!

特别感谢

    • ストレスの原因、ネガティブコメントやスパムを「Disable Comments」プラグインで無効化する

 

    • 徳丸さんの「セキュリティの都市伝説を暴く」というスライドの42pページあたり

@togana さん(検証のときにDockerがわからないわたしを助けてくれた同僚)

@328 さん(同じく検証のときにDockerがわからないわたしを助けてくれた勉強会仲間)

最后

在第六天的文章中,对于无法及时应对的问题,实际上已经在Dockerfile里面写好了。
总之,很高兴在圣诞节日历的文章中解决了一些问题(为了自己在参加开发培训时能够理解,这个目标在中途被放置起来整理了)。
然而,尝试在平时不熟悉的Docker环境中进行验证对于开发经验较少的我来说是一项很大的挑战,非常感谢这两位非常给力的人。
虽然时间超过并且更新有些迟缓,但我确实获得了一个很好的机会。
我感觉和Docker有了一点点亲近,并且对于WordPress的不熟悉也大大减少了。
祝你们有一个愉快的圣诞节,新年快乐。

广告
将在 10 秒后关闭
bannerAds