Docker版OWASP ZAPを使用してWebアプリの簡易的な脆弱性診断をしてみた

Docker版OWASP ZAPを使用してWebアプリの簡易的な脆弱性診断をしてみた

Clock Icon2020.09.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部の若槻です。

最近Webアプリケーション向けのセキュリティ診断ツールについて調べてみたところ、OWASP ZAPというオープンソースツールが定番としてよく使われているそうです。

今回は、Docker版OWASP ZAPを使用してWebアプリのログインページの簡易的な脆弱性診断を行ってみました。

なぜDocker版を使ったのか

OWASP ZAPにはWindows、Mac、Linuxで使えるインストーラー版およびパッケージ版と、Docker版があります。

当初はMac向けインストーラー版を使おうとしましたが、Macのセキュリティによりインストールできなかったため断念しました。
image.png

よってインストールを要しないDocker版を使うこととしました。

やってみた

今回は次のようなAmplify(CloudFront) + Reactにより実装したログインページを診断対象としました。
image.png

コマンドでDockerイメージowasp/zap2docker-stableをプルします。

% docker pull owasp/zap2docker-stable
Using default tag: latest
latest: Pulling from owasp/zap2docker-stable
423ae2b273f4: Pull complete
de83a2304fa1: Pull complete
f9a83bce3af0: Pull complete
b6b53be908de: Pull complete
dfa4c0ed9f01: Pull complete
0d0271dc7f26: Pull complete
ba10134fb40f: Pull complete
a5566afd045d: Pull complete
7b60e2849bd0: Pull complete
daf051f52216: Pull complete
3600cd933995: Pull complete
a1d63c5e9c9f: Pull complete
86279da9d5e1: Pull complete
61d20517a689: Pull complete
b645cc4494b6: Pull complete
87a41273fa00: Pull complete
dcd8983ba399: Pull complete
424fa8727c16: Pull complete
Digest: sha256:3563ecc53448ad224262ccea185cff8360c999c52d9c4b78630d9344dc1c3fd6
Status: Downloaded newer image for owasp/zap2docker-stable:latest
docker.io/owasp/zap2docker-stable:latest

Docker版ZAPのスキャンタイプにはいくつかの種類がありますが、今回は攻撃および負荷のあるアクセスを伴わない1分間の静的スキャンを実施するBaseline Scanを行いました。次のコマンドで実行が可能です。

docker run -t owasp/zap2docker-stable zap-baseline.py -t <対象ページのURL>

ログインページhttps://example.com/loginに対してBaseline Scanを実行してみます。

% docker run -t owasp/zap2docker-stable zap-baseline.py -t https://example.com/login
2020-09-10 09:03:38,813 Params: ['zap-x.sh', '-daemon', '-port', '38996', '-host', '0.0.0.0', '-config', 'api.disablekey=true', '-config', 'api.addrs.addr.name=.*', '-config', 'api.addrs.addr.regex=true', '-config', 'spider.maxDuration=1', '-addonupdate', '-addoninstall', 'pscanrulesBeta']
_XSERVTransmkdir: ERROR: euid != 0,directory /tmp/.X11-unix will not be created.
Sep 10, 2020 9:03:40 AM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
Total of 13 URLs
PASS: Cookie No HttpOnly Flag ```10010
PASS: Cookie Without Secure Flag ```10011
PASS: Cross-Domain JavaScript Source File Inclusion ```10017
PASS: Content-Type Header Missing ```10019
PASS: X-Frame-Options Header Scanner ```10020
PASS: X-Content-Type-Options Header Missing ```10021
PASS: Information Disclosure - Debug Error Messages ```10023
PASS: Information Disclosure - Sensitive Information in URL ```10024
PASS: Information Disclosure - Sensitive Information in HTTP Referrer Header ```10025
PASS: HTTP Parameter Override ```10026
PASS: Information Disclosure - Suspicious Comments ```10027
PASS: Open Redirect ```10028
PASS: Cookie Poisoning ```10029
PASS: User Controllable Charset ```10030
PASS: User Controllable HTML Element Attribute (Potential XSS) ```10031
PASS: Viewstate Scanner ```10032
PASS: Directory Browsing ```10033
PASS: Heartbleed OpenSSL Vulnerability (Indicative) ```10034
PASS: Strict-Transport-Security Header Scanner ```10035
PASS: HTTP Server Response Header Scanner ```10036
PASS: Server Leaks Information via "X-Powered-By" HTTP Response Header Field(s) ```10037
PASS: X-Backend-Server Header Information Leak ```10039
PASS: Secure Pages Include Mixed Content ```10040
PASS: HTTP to HTTPS Insecure Transition in Form Post ```10041
PASS: HTTPS to HTTP Insecure Transition in Form Post ```10042
PASS: User Controllable JavaScript Event (XSS) ```10043
PASS: Big Redirect Detected (Potential Sensitive Information Leak) ```10044
PASS: Retrieved from Cache ```10050
PASS: X-ChromeLogger-Data (XCOLD) Header Information Leak ```10052
PASS: Cookie Without SameSite Attribute ```10054
PASS: CSP Scanner ```10055
PASS: X-Debug-Token Information Leak ```10056
PASS: Username Hash Found ```10057
PASS: X-AspNet-Version Response Header Scanner ```10061
PASS: PII Disclosure ```10062
PASS: Timestamp Disclosure ```10096
PASS: Hash Disclosure ```10097
PASS: Cross-Domain Misconfiguration ```10098
PASS: Weak Authentication Method ```10105
PASS: Reverse Tabnabbing ```10108
PASS: Modern Web Application ```10109
PASS: Absence of Anti-CSRF Tokens ```10202
PASS: Private IP Disclosure ```2
PASS: Session ID in URL Rewrite ```3
PASS: Script Passive Scan Rules ```50001
PASS: Insecure JSF ViewState ```90001
PASS: Charset Mismatch ```90011
PASS: Application Error Disclosure ```90022
PASS: Loosely Scoped Cookie ```90033
WARN-NEW: Incomplete or No Cache-control and Pragma HTTP Header Set ```10015 x 6
	https://example.com/login/ (200 OK)
	https://example.com/login/robots.txt (200 OK)
	https://example.com/login/sitemap.xml (200 OK)
	https://example.com/login/manifest.json (200 OK)
	https://example.com/login/static/css/2.73fa334c.chunk.css (200 OK)
WARN-NEW: Content Security Policy (CSP) Header Not Set ```10038 x 2
	https://example.com/login/ (200 OK)
	https://example.com/login/sitemap.xml (200 OK)
FAIL-NEW: 0	FAIL-INPROG: 0	WARN-NEW: 2	WARN-INPROG: 0	INFO: 0	IGNORE: 0	PASS: 49

診断結果として2つのwarningが検出されました。アラートについての詳細な説明は次のページに記載されています。

今回はレスポンスにCache-ControlContent-Security-Policyなどのセキュリティヘッダーを含めていなかったため、脆弱性のリスクがあると判定されたようです。

今回のような構成でセキュリティヘッダーを追加する場合は次の記事を参考にLambda@Edgeを実装すると良いとのことなので試してみたいと思います。

おわりに

Docker版OWASP ZAPを使用してWebアプリのログインページの簡易的な脆弱性診断を行ってみました。

脆弱性診断というとセキュリティ企業に依頼して有料で行うイメージがありましたが、今回のようなオープンソースツールで簡単に実施できて、しかもちゃんと脆弱性を発見できることを知れたのは良かったです。

なお、AWSに対する脆弱性診断はポリシーに適合している場合を除いて許可されていないため、実施する場合は次のページを要確認の上ご自身の責任で行ってください。

参考

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.