- テクニック 1: JS の脆弱性発掘における重要な地位
- テクニック 2: ブラウザコンソールの使用テクニックと方法
- テクニック 3: JS ブレークポイントテクニックと Hook 注入
- テクニック 4: Python と JS を組み合わせて暗号化の難題を解決
- 実戦 1: 実戦 MD5 暗号化の逆解析と暗号化パラメータの復元
- テクニック 5: 一般的な FUZZ の姿勢とツール、辞書
- テクニック 6: 未知のディレクトリ、情報漏洩、バックアップファイルなどの脆弱性における FUZZ
- テクニック 7: 弱いパスワード、隠れた変数、未知のパラメータにおける FUZZ の面白い姿勢
- テクニック 8: SQL、XSS、SSRF、CSRF などの脆弱性における FUZZ テクニック
- 実戦 2: 実戦 FUZZ によるリモート RCE 脆弱性でのコンピュータ制御(80% の src が使用される)
技術一、JS 暗号化パラメータの逆解析と利用#
1.1 テクニック一、JS の脆弱性発掘における重要な地位#
1.1.1 JavaScript#
JS:javascript は web ページのスクリプト言語で、主に HTML ページにインタラクティブな動作を追加するために使用され、以下のような役割があります:
- HTML ページに動的なテキストを埋め込む;
- ブラウザイベントに応答する;
- HTML 要素を読み書きする;
- データがサーバーに送信される前にデータを検証する;
- 訪問者のブラウザ情報を検出する。
1.1.2 HTML、JS、CSS の違い#
- HTML:未完成の家
- CSS:内装
- JS:家を動かし、スマートホームを追加する
1.1.3 JS の脆弱性発掘における重要な地位#
- JS にはプラグイン名が存在し、プラグインに基づいて対応する脆弱性を直接利用できる
- JS にはいくつかの URL リンクが存在し、URL に基づいて対応するページを見つけてさらにテストと利用ができる
- JS にはサブドメインが存在し、サブドメインに直接アクセスできる
- JS の一部のコメントはアカウントのパスワードやその他の情報を漏洩する可能性がある
1.1.4 Jsfind#
JsFind を使用して JS 内で漏洩した URL リンクとドメインを検索する(京東)
python jsfind.py -u "http://www.jd.com"
1.2 テクニック二、ブラウザコンソールの使用テクニックと方法#
ネットワークは全体のネットワークリクエストを監視するもので、トラフィックを監視できます。
- キャッシュを無効にする:チェックを入れると、毎回ブラウザからデータを取得します。ペネトレーションテストや脆弱性発掘の過程で開く必要があります。
- デバッガー(ソースコード):ウェブサイトの js コードを保存します
- 右下の
{}
をクリックするとフォーマットされます - ブレークポイントを設定できます
- 右下の
- コンソール:js 内の関数に対していくつかの操作を行うことができます
1.3 テクニック三、JS ブレークポイントテクニックと Hook 注入#
Hook:python を使用してクローリングやペネトレーションを行い、画像認証を回避するために使用します。
1.3.1 JS ブレークポイントデバッグ#
JS でブレークポイントを設定し、ブレークポイントに到達すると実行が停止します。ステップインを選択すれば大丈夫です。
1.3.2 ブレークポイントの見つけ方#
キーワードに従ってデバッガーでグローバル検索を行い、必要な位置にジャンプし、js 行をクリックすると青色に変わります。
注意:MD5 関数はカスタマイズ可能で、パスワードを解読する際には実際に使用されている MD5 関数を見つける必要があります。
1.4 テクニック四、python と JS を組み合わせて暗号化の難題を解決#
-
JS コード test.js
# js 暗号化関数 function encryptByDES(message) { var encrypted = message; encrypted = encrypted + "asdfdsaf"; return encrypted; }
-
python を使用して js ファイル内の関数を呼び出す
# execjsをインストール pip install pyexecjs # pyexecjsは2018年にメンテナンスを終了しましたが、現在はjs2pyを代わりに使用できます import execjs with open('test.js', 'r') as f: a = execjs.compile(f.read()) # test.jsファイル内のencryptByDES関数を呼び出し、引数はpassword result1 = a.call('encryptByDES', 'password') print(result1)
1.5 実戦、MD5 暗号化の逆解析と暗号化パラメータの復元#
-
bp を使用して情報を取得する
-
ブラウザコンソールでキーワード
password
に基づいて検索し、password
を処理するjs
関数を見つける; -
python
コードを使用してjs
内のpassword
を処理する関数を呼び出し、エラーメッセージに基づいてfunction
と他のパラメータを補完する; -
python
で得られた値とbp
で取得した値を比較し、同じかどうかを確認する; -
同じ場合、
python
を使用してパスワード辞書を処理し、その後bp
を使用してブルートフォース攻撃を行うことができます。
技術二、FUZZ の精美なアート、成果の直線的向上(技術)#
テクニック五、一般的な FUZZ の姿勢とツール、辞書(テクニック)#
2.1.1 FUZZ
ファジングテスト#
FUZZ:名詞としては「毛羽立ち;ぼやけ;細毛;警官」と訳されます。
核心思想:一部の条件しか知らない場合、非常にあいまいなテストを行い、異なるものを使用して繰り返しテストを行い、望ましい結果を得るまで続ける。
例えば:支付宝での大額送金には、一部の情報を入力する必要があります。
2.1.2 fuzz
のテクニックはどこで使用できますか?#
- パスワードを解読する際
- ディレクトリをスキャンする際
- パラメータをスキャンする際
- 脆弱性をテストする際
- WAF を回避する際
- 見えるすべてのパラメータは、実際に
FUZZ
でテストできます - 。。。たくさん、どこでも
fuzz
できます
FUZZ
をうまく使えば、脆弱性は少なくなります。
ディレクトリスキャンやブルートフォース攻撃の核心思想はFUZZ
であり、多くの場合、ツールでは解決できない問題は手動でFUZZ
すれば、予想外の結果が得られることがあります。
2.1.3 優れた FUZZ のケーススタディ#
2.1.3.1 パラメータFUZZ
実戦脆弱性#
-
ある
src
脆弱性発掘の過程で、興味深いファイルhttp://36...*/upload_image.php
を発見し、アクセス時に内容が空白でした。 -
このようなページに対しては、間違いなくパラメータを
FUZZ
してそのパラメータをFUZZ
し、do
というパラメータフィールドを発見しました。http://360...*/upload_image.php?do
が使用可能であることを発見しました。
-
次に
do
というパラメータをFUZZ
し、bp
を使用します。 -
http://xxxxx/image_upload.php?do=upload
を構築し、アクセスすると、アップロードフォームが正常に表示され、次のような画面が得られました。 -
ファイルをアップロードした後、
FUZZ
アップロードパスを行います。http://36.*.*.*/uppload -------> 403 続けてfuzz http://36.*.*.*/upload/images ------->403 。。。。 ファイルパスを発見し、URLを構築 http://36.*.*.*/upload/images/skr_anti.php
-
その後、リモートコントロールツールを使用して相手のサーバーに接続します。
2.1.3.2 FUZZ 隠れたパラメータとフィールド#
-
ディレクトリスキャンで次のようなファイルを発見しました。
-
そのファイルを特定します。
-
ディレクトリアクセスを構築します。
提示された情報をURLに構築してアクセスします。 http://....../start/face_xxx インターフェースにアクセスすると、Method Not Allow、405エラーが表示されます。明らかに、POSTでパラメータを送信する必要があります。
-
POST
で適当なパラメータを送信すると、インターフェースがRequest error, content-type was unsupported
と表示されます。
-
引き続き
FUZZ
content-type ヘッダーを行います。 -
FUZZ
の結果、application/json
のcontent-type
ヘッダーが使用可能であることがわかりました。したがって、JSON
を構築してFUZZ
を続け、JSON
データパラメータを送信します。 -
この場所の
SSRF
を利用して、内部ネットワークのRedis
に対してパスワードスプレーとリバースシェルを一括で行い、境界を突破することができます。
2.1.3.3 JS と FUZZ の組み合わせ#
-
ログインページにアクセスします。
-
アカウントとパスワードを設定し、パスワードのブルートフォース攻撃を開始します。
-
テストしたアカウントとパスワードでログインしても反応がなく、ログインページはただのログインページです。
-
諦めるわけにはいかず、ディレクトリを
FUZZ
し、/JS/ディレクトリ
が存在することを発見し、その中のものをFUZZ
し始めます。 -
発見したリンクに基づいて URL を構築し、アクセスすると新しいページが表示されました。
ここには
logout
があり、ログインしていない場所にどうして存在するのか?そこで、下のアカウントとパスワードは先ほどのブルートフォースで得たものであると推測しましたが、どうやらあまり役に立たないようです。 -
次に
JS
ファイルを発見し、次のような規則性を見つけました。 -
次にドメインを
FUZZ
し、展示ページを発見しました。 -
次に
bp
を使用してパケットをキャプチャし、返されたデータを変更してログインに成功しました。 -
サイトに成功裏にアクセスしました。
テクニック六、未知のディレクトリ、情報漏洩、バックアップファイルなどの脆弱性における FUZZ(テクニック)#
2.2.1 未知のディレクトリ#
- ウェブサイトのディレクトリとファイルを段階的に
FUZZ
します; FUZZ
で得られたパスに基づいて、パラメータとパスをそれぞれFUZZ
します;- 繰り返し
FUZZ
を行い、望ましい結果が得られるまで続けます。
テクニック七、隠れた変数、未知のパラメータにおけるFUZZ
の面白い姿勢#
- 得られた
url
に基づいて初期ディレクトリとパラメータをFUZZ
します; - その後、
FUZZ
の結果に基づいて大胆に予測し、予測に基づいてFUZZ
します; - 前のステップで得られた結果に基づいて新しい
URL
を構築し、アクセスし、再度FUZZ
します; - 上記の操作を繰り返し、望ましい結果が得られるまで続けます;
- 注意:重要なのは忍耐、細心の注意、大胆な予測であり、徐々に辞書の数を増やすことです。
テクニック八、SQL、XSS、SSRF、CSRF などの脆弱性における FUZZ テクニック#
靶場:phpStudy/PHPTurorial/www/pikaqiu/pikachu
実際のペネトレーションテストの過程で、WAF を回避する必要がある場合、FUZZ
を使用して内容をフィルタリングできます。すべての内容をbp
にインポートしてテストし、結果の中から WAF によってフィルタリングされていないものを見つけることができます。
2.4.1 ケーススタディ:pikaqiu
靶場のsql
注入脆弱性を発掘#
-
どのパラメータを
FUZZ
できますかFUZZ
できるパラメータ:GET
行のパラメータCookie
行のパラメータ- その他のパラメータ
-
bp
を使用して辞書をインポートし、FUZZ
します。 -
bp
から得られた結果に基づいて URL を構築し、望ましい結果を得ます。
実戦二、実戦 FUZZ によるリモート RCE 脆弱性でのコンピュータ制御#
-
ブラウザを使用して指定されたアドレスにアクセスし、ブラウザコンソールを開きます。
赤い枠の中がウェブサイトのディレクトリファイルと
JS
ファイルであり、ディレクトリとファイルの中に必要な情報があるかどうかを確認します。 -
情報がない場合、
FUZZ
JS
ディレクトリを行います(通常、JS
ディレクトリがある場合、最初にFUZZ
JS
ディレクトリを行うことができます)。-
完全な
JS
URL
を構築します; -
bp
を使用してインターセプトします; -
辞書をインポートして攻撃します;
-
bp
攻撃の結果に基づいて二次分析を行い、望ましい情報が得られない場合は、二次FUZZ
を続け、上記のステップを繰り返します; -
bp
の結果を分析し、URL を構築してアクセスし、結果を得ます。 -
bp
の結果表示
-
-
FUZZ
JS
ディレクトリで結果が得られなかった場合は、上記の手順を使用して他のディレクトリをFUZZ
し続けます。 -
注意:
FUZZ
の過程で、異なるパラメータ、異なるディレクトリ、異なるcontent-type
などに対して繰り返しFUZZ
を行う必要があり、毎回bp
から得られた結果を注意深く確認する必要があります。 -
最終的な結果:ウェブサイトの
getshell
権限を取得し、アップロード可能なURL
を得た後、bp
内のリクエストデータを変更し、マルウェア(例えば:ワンライナーのマルウェア)を対応するURL
に送信し、ブラウザでアクセスして最終的な結果を得ます。<?php system("whoami") ?>
<?php phpinfo(); ?>