はまやんはまやんはまやん

hamayanhamayan's blog

WebセキュリティにおけるJavaScript難読化問題への傾向と対策

本まとめはセキュリティコンテスト(CTF)で使えるまとめを目指すのが主です。
悪用しないこと。勝手に普通のサーバで試行すると犯罪っぽいです。

JavaScript難読化問題

クライアントサイドで動くJavaScriptコードは全てユーザーに丸見えになってしまう。
なので難読化を施してロジックを分からなくするといったことが行われる。
セキュリティ上の問題で難読化をするのは悪手であるが、
ロジックを隠匿したい場合や場合によっては圧縮効果がある場合もある。(これは難読化という観点で紹介するのは微妙だけれど)

CTFでは難読化が施されていても中身のロジックは根性で分かってしまいますよというのが問題の趣旨。
防犯目的で自動で明かりがつくようなものを玄関に取り付けるくらいの心理的気休めと思った方がいい。

難読化手法

Javascript Obfuscator

javascript-obfuscator/javascript-obfuscator: A powerful obfuscator for JavaScript and Node.js
よく見るし、業界標準?(業界人でないので分からないが、資料はたくさん出てくる)

var _0x2302 = [
    'oAFaE',
    'foo\x20',
    'RDjIM',
    'ZhYJQ',
    'split',
    'vWUAR',
    'YIYCI',
    'map',
    'log',
    '8|7|0|2|9|'
];
(function (_0x27f028, _0xd47344) {
    var _0x335bc0 = function (_0x29965a) {
        while (--_0x29965a) {
            _0x27f028['push'](_0x27f028['shift']());
        }
    };
    _0x335bc0(++_0xd47344);
}(_0x2302, 0xaee + -0x1 * 0xa63 + -0x7 * -0x1f));
var _0x2384 = function (_0x27f028, _0xd47344) {
    _0x27f028 = _0x27f028 - (0xaee + -0x1 * 0xa63 + -0x1 * 0x8b);
    var _0x335bc0 = _0x2302[_0x27f028];
    return _0x335bc0;
};

こういうリソースを出力する謎関数を作成する。
手作業で分解するのはだいぶつらいので、Chromeデベロッパーツールでブレークして、
使われている_0x2384('0x3')みたいなやつの中身を見ていくのがオススメ。

JSFuck

[]+[+[[][]]]みたいなやつはJSFuckという難読化形式。
https://enkhee-osiris.github.io/Decoder-JSFuck/
ここで解除可能。

難読化解除テク(と言ってもほぼ根性)

フォーマッタ

Chromeのローカルオーバーライド

これを使うと、ページを再読み込みしても修正されたjsなどを実行できる。

  1. やりたいサイトでデベロッパーツールを開く
  2. SourceパネルのOverridesタブを開く、適当なフォルダを指定する(どこでもいい)
  3. Pageタブを開き、修正をローカルで永続化しておきたいファイルを右クリックして、Save for overridesを選択する
  4. これでオーバーライドできたので、適当に修正して、実行する

javascriptであれば、オーバーライド後に、Networkパネルから目的のjsファイルを選択して、Previewタブを開くと、ちょっときれいになったjsが得られるので、
それを持ってきて、オーバーライドしたところで上書きするとちょっと幸せになる。
console.log(見たい変数);でバンバン入れて、中身を見ていこう。

何を探すか

  • jsだと暗号化とかも自前でやってるから、encryptとかdecryptとかのキーワードで探してみると何か出てくるかも
  • どこかで外部からデータを持ってきているなら、SQLiができるかもしれない
    • httpとかで検索したら良い感じのURL出てくるかも

参考

CTF Writeups

あったら書く

Practicalな話

実装時に気を付けること

特にないけど、難読化は気休めです。

(CTFじゃ使えないけど)テストツール

脆弱性じゃないか…