尝试对使用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:
-
- 在终端上使用cd命令导航到存放yml文件的目录,然后使用docker-compose up -d来启动WordPress。
-
- 在浏览器中访问localhost:8080以完成WordPress安装,但不要登录,只显示WordPress界面。
-
- 使用ifconfig en0命令确认正在运行WordPress的本地环境的内部IP。
-
- 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界面和操作。
非常出现了(д) ゚ ゚
逐一确认结果。
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` ヘッダの設定をします。
-
- 详细错误信息被公开显示了。严重程度:低/可信度:确定。
错误信息的详细内容可能成为攻击者的线索,所以我们希望将其隐藏起来。
不过,经过确认似乎是误报,所以我们会忽略这个问题。
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的不熟悉也大大减少了。
祝你们有一个愉快的圣诞节,新年快乐。