No1zy Web Security Blog

Webセキュリティについてのブログ

バグハンターのためのクライアントサイドJavaScriptの静的解析

はじめに

JavaScriptは、最新のWebブラウザで最も普及した技術の1つになっています。AngularJS、ReactJS、Vue.jsなどのクライアントサイドJavaScriptフレームワークを使用して構築されたアプリケーションは、多くの機能とロジックをフロントエンドに提供します。そしてロジック、機能の増加によってクライアントサイドのAttack Safaceも増加します。これらのAttack Safaceを理解し、脆弱性を発見する方法を身に着けることが必要です。

このブログ記事では、効率よくWebアプリケーションの脆弱性を発見するために、クライアントサイドJavaScriptの静的解析に注目して説明します。

今回は脆弱性を探す対象はOWASP Juice Shopです。Juice ShopはJavaScript製の意図的に脆弱に作られたアプリケーションです。

何を探すか?

セキュリティ上の問題を探す目的で、クライアントサイドのJavaScriptの静的解析を行う際には、以下の情報に注目します。

  1. 攻撃の対象となる情報(URL、ドメインなど)
  2. 機密情報(パスワード、APIキー、ストレージなど)
  3. コード内の潜在的に危険な場所(eval、dangerouslySetInnerHTMLなど)
  4. 既知の脆弱性を持つコンポーネント(古いバージョンのフレームワークなど)

静的解析の実行手順

静的解析は、以下の手順に分けて行います。

  1. アプリケーションでJavaScriptファイルを識別して収集する
  2. 収集したJavaScriptコードを読みやすくする(Unminify/Deobfuscate)
  3. セキュリティ上の問題を発見に繋がる可能性のある情報を特定する

JavaScriptファイルの収集

アプリケーションをテストするためにBurp Suiteを使用する場合、アプリケーション内のすべてのJavaScriptファイルを収集する方法はいくつかあります。

  • JavaScriptファイルのURLを収集する
  • Find Scriptを使用して、すべてのスクリプトをエクスポートする(Burp Suite Professionalのみ)

JavaScriptファイルのURLを収集する

通信がBurpSuiteを介して行われている間、ユーザーはアプリケーションのリクエストを洗い出します。リクエストの洗い出しが終わったら以下の方法でJavascriptファイルを取り出すことがきます。

  1. Proxyタブを開く
  2. Historyタブを開く
  3. フィルター設定のFilter by file extension > Show onlyにチェックを入れ、jsと入力する f:id:neko0206:20181105151726p:plain
  4. フィルタリング後に表示されるすべてのJavaScriptファイルのURLをコピーする f:id:neko0206:20181105152144p:plain

Find Scriptを使用して、すべてのスクリプトをエクスポートする(Burp Suite Professionalのみ)

Burp Suite Professionalを使用している場合は、アプリケーション内のすべてのJavaScriptファイルのURLをコピーするだけでなく、すべてのスクリプトをエクスポートすることもできます。

  1. Target > Site mapで対象のサイト上で右クリック
  2. Engagement tools > Find scriptsをクリック

f:id:neko0206:20181105161543p:plain

f:id:neko0206:20190310091251p:plain この機能を使用すると、そのアプリケーション内のすべてのスクリプトをエクスポートしたり、URLをコピーしたりすることができます。

収集したJavaScriptコードを読みやすくする

収集したJavaScriptが難読化(Obfuscation)、またはMinifyされていて読みにくいことがあります。 静的解析の時には、まずこれらの処理が行われたJavaScriptコードを読みやすいようにします。

Unminify/Deobfuscateができるツールは様々ですが以下に一つ紹介します。

f:id:neko0206:20181105181613p:plain

難読化された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コードでも動作します。

f:id:neko0206:20181105183225p:plain

LinkFinder

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

python linkfinder.py -i https://example.com -d -o cli

f:id:neko0206:20181105184014p:plain

JS Parser

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

python handler.py

f:id:neko0206:20181105214049p:plain

f:id:neko0206:20181105214124p:plain

潜在的脆弱性を特定する

JavaScriptファイルを調べるときは、コード内の危険な場所、セキュリティ上の問題につながるような場所を特定することが重要です。

ESLint

セキュリティリンターと静的セキュリティスキャナーを使用することで、JavaScriptコードの脆弱性を発見しやすくなります。 ESLintは、非常に人気のあるJavaScriptリンターの1つです。 ESLintには、Angular、Reactなどの最新のフレームワークをターゲットにしたカスタムセキュリティルールが多数用意されています。

f:id:neko0206:20181105214333p:plain

f:id:neko0206:20181105214545p:plain

ここに、いくつかのセキュリティルールをリストします

もちろん、特定の危険な場所をソースコードファイルから検索する場合に、 grepなどを使用することも非常に強力です。

Retire.js

脆弱性を探す際には、アプリケーションで使用されている古いJavaScriptフレームワークや脆弱なJavaScriptフレームワーク、またはライブラリを特定することもポイントです。それらの脆弱性を悪用できる場合があるからです。 Retire.jsは、使用されている古いJavaScriptフレームワークを識別できるツールです。RetireJS Burp Extensionは、ユーザー主導でテストを実行する場合に特に便利です。

f:id:neko0206:20181105220611p:plain

まとめ

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

参考