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

image.png

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

こんにちは、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に対する脆弱性診断はポリシーに適合している場合を除いて許可されていないため、実施する場合は次のページを要確認の上ご自身の責任で行ってください。