バグハンターのためのクライアントサイドJavaScriptの静的解析
はじめに
JavaScriptは、最新のWebブラウザで最も普及した技術の1つになっています。AngularJS、ReactJS、Vue.jsなどのクライアントサイドJavaScriptフレームワークを使用して構築されたアプリケーションは、多くの機能とロジックをフロントエンドに提供します。そしてロジック、機能の増加によってクライアントサイドのAttack Safaceも増加します。これらのAttack Safaceを理解し、脆弱性を発見する方法を身に着けることが必要です。
このブログ記事では、効率よくWebアプリケーションの脆弱性を発見するために、クライアントサイドJavaScriptの静的解析に注目して説明します。
今回は脆弱性を探す対象はOWASP Juice Shopです。Juice ShopはJavaScript製の意図的に脆弱に作られたアプリケーションです。
何を探すか?
セキュリティ上の問題を探す目的で、クライアントサイドのJavaScriptの静的解析を行う際には、以下の情報に注目します。
- 攻撃の対象となる情報(URL、ドメインなど)
- 機密情報(パスワード、APIキー、ストレージなど)
- コード内の潜在的に危険な場所(eval、dangerouslySetInnerHTMLなど)
- 既知の脆弱性を持つコンポーネント(古いバージョンのフレームワークなど)
静的解析の実行手順
静的解析は、以下の手順に分けて行います。
- アプリケーションでJavaScriptファイルを識別して収集する
- 収集したJavaScriptコードを読みやすくする(Unminify/Deobfuscate)
- セキュリティ上の問題を発見に繋がる可能性のある情報を特定する
JavaScriptファイルの収集
アプリケーションをテストするためにBurp Suiteを使用する場合、アプリケーション内のすべてのJavaScriptファイルを収集する方法はいくつかあります。
- JavaScriptファイルのURLを収集する
Find Scriptを使用して、すべてのスクリプトをエクスポートする(Burp Suite Professionalのみ)
JavaScriptファイルのURLを収集する
通信がBurpSuiteを介して行われている間、ユーザーはアプリケーションのリクエストを洗い出します。リクエストの洗い出しが終わったら以下の方法でJavascriptファイルを取り出すことがきます。
- Proxyタブを開く
- Historyタブを開く
- フィルター設定の
Filter by file extension > Show onlyにチェックを入れ、jsと入力する
- フィルタリング後に表示されるすべてのJavaScriptファイルのURLをコピーする

Find Scriptを使用して、すべてのスクリプトをエクスポートする(Burp Suite Professionalのみ)
Burp Suite Professionalを使用している場合は、アプリケーション内のすべてのJavaScriptファイルのURLをコピーするだけでなく、すべてのスクリプトをエクスポートすることもできます。
Target > Site mapで対象のサイト上で右クリックEngagement tools > Find scriptsをクリック

この機能を使用すると、そのアプリケーション内のすべてのスクリプトをエクスポートしたり、URLをコピーしたりすることができます。
収集したJavaScriptコードを読みやすくする
収集したJavaScriptが難読化(Obfuscation)、またはMinifyされていて読みにくいことがあります。 静的解析の時には、まずこれらの処理が行われたJavaScriptコードを読みやすいようにします。
Unminify/Deobfuscateができるツールは様々ですが以下に一つ紹介します。
- JS Beautifierは、特定の難読化を解除したり、難読化することができるツールです。このツールは、node.js、python、オンライン、またはVSCodeなどで使用できます。

難読化されたJavaScriptの解析について、より詳しく知りたい場合は以下のURLご覧ください。
obfuscation - How to deobfuscate an obfuscated javascript file like this? - Reverse Engineering Stack Exchange
JavaScriptファイルからエンドポイントを特定する
JavaScriptファイルで検索する重要な情報の1つは、フルURL、相対パスなどです。相対パス、フルURLを特定することで、より多くの脆弱性を発見するのに役立ちます。
relative-url-extractor
relative-url-extractorは、JavaScriptファイル内のすべての相対パスを特定するのに非常に便利です。 このツールはローカルとリモートの両方、MinifyされたJavaScriptコードでも動作します。

LinkFinder
LinkFinderは、JavaScriptファイル内のすべてのエンドポイントとそのパラメータを特定するのに非常に便利です。このツールは、MinifyされたJavaScriptでも動作し、JS Beautifierを使用してJavaScriptをun-minifyします。ドメインに対して実行して、すべてのJavaScriptファイルを列挙することもできます。
python linkfinder.py -i https://example.com -d -o cli

JS Parser
JS ParserはJSファイルのエンドポイントを探すのに役立つPython2.7スクリプトです。 このツールもMinifyされたJavaScriptでも動作します。使用するには以下のコマンド実行し、http://localhost:8008にアクセスし、URLリストを入力します。 Web上で操作でき、カスタムヘッダの付与も簡単に行えます。
python handler.py


潜在的な脆弱性を特定する
JavaScriptファイルを調べるときは、コード内の危険な場所、セキュリティ上の問題につながるような場所を特定することが重要です。
ESLint
セキュリティリンターと静的セキュリティスキャナーを使用することで、JavaScriptコードの脆弱性を発見しやすくなります。 ESLintは、非常に人気のあるJavaScriptリンターの1つです。 ESLintには、Angular、Reactなどの最新のフレームワークをターゲットにしたカスタムセキュリティルールが多数用意されています。


ここに、いくつかのセキュリティルールをリストします
- eslint-plugin-angularjs-security-rules
- eslint-plugin-react
- eslint-plugin-scanjs
- eslint-plugin-security
- eslint-plugin-no-wildcard-postmessage
- eslint-plugin-no-unsanitized
もちろん、特定の危険な場所をソースコードファイルから検索する場合に、 grepなどを使用することも非常に強力です。
Retire.js
脆弱性を探す際には、アプリケーションで使用されている古いJavaScriptフレームワークや脆弱なJavaScriptフレームワーク、またはライブラリを特定することもポイントです。それらの脆弱性を悪用できる場合があるからです。 Retire.jsは、使用されている古いJavaScriptフレームワークを識別できるツールです。RetireJS Burp Extensionは、ユーザー主導でテストを実行する場合に特に便利です。

まとめ
この記事では、効率よくJavaScriptの静的解析を行い、効率よく脆弱性を発見するためのアプローチについて紹介しました。 みなさんのバグハントに役立ててれれば嬉しいです。Happy Hunting!