send_request_cgi
send_request_cgi は HttpClient の CGI 互換 HTTP リクエスト API です。実装は lib/msf/core/exploit/remote/http_client.rb、opts の定義は lib/rex/proto/http/client.rb / client_request.rb です。
| ページ | 内容 |
|---|---|
| オプション一覧 | 渡せる opts / datastore の一覧 |
| HTTP メソッドとパラメータ | GET / POST / PUT / raw query / encode |
| 認証と Cookie | Basic / フォームログイン / 自己登録 / Cookie jar / CSRF |
| 本文と multipart | JSON / 生の本文 / MIME / vars_form_data |
| リダイレクトと生リクエスト | send_request_cgi! / send_request_raw |
| 応答とデバッグ | 応答処理、パーサ、RCE 成功判定、HttpTrace |
res = send_request_cgi( { 'method' => 'GET', 'uri' => normalize_uri(target_uri.path, 'index.php'), 'vars_get' => { 'q' => '1' } }, 20 # timeout)return if res.nil?メソッドの引数は次のとおりです。
send_request_cgi(opts = {}, timeout = 20, disconnect = true)| 引数 | 意味 |
|---|---|
opts | リクエスト内容の Hash |
timeout | 秒。datastore['HttpClientTimeout'] を渡すことも多い |
disconnect | 応答後に切断するか。既定値は true |
タイムアウト / 接続失敗時は nil が返ります。必ず確認します。
send_request_cgi と send_request_raw の使い分け
Section titled “send_request_cgi と send_request_raw の使い分け”| API | 向いていること |
|---|---|
send_request_cgi | vars_get / vars_post / フォーム / Cookie jar |
send_request_raw | 仕様外メソッド、壊した HTTP、非 HTTP 風 |
send_request_cgi! | 30x リダイレクトを追う |
パターン早見
Section titled “パターン早見”| やりたいこと | 使うキー / API |
|---|---|
| query 付き GET | vars_get |
| フォーム POST | vars_post |
| 生 query 文字列 | query |
| JSON / 任意本文 | data + ctype |
| multipart 手動 | Rex::MIME::Message + data + ctype |
| multipart 簡易 | vars_form_data |
| Basic 認証 | authorization / basic_auth |
| フォームログイン継続 | keep_cookies |
| 自己登録 → ログイン | 登録 POST → ログイン POST + keep_cookies |
| 認証後の JSON API | ログイン時に keep_cookies、JSON 送信時に data + ctype |
| Cookie 固定 | cookie |
| 追加ヘッダ | headers |
| Host 上書き | vhost |
| 別ホストへ一時送信 | rhost / rport / SSL |
| リダイレクト追従 | send_request_cgi! |
| エンコード無効 | encode_params: false |
Content-Type と Accept
Section titled “Content-Type と Accept”ctypeは送信する本文の形式を Content-Type ヘッダで指定します。JSON の場合は'ctype' => 'application/json'を使います。POST で省略するとapplication/x-www-form-urlencodedが付きます。Acceptは受け取りたい応答の形式を指定します。JSON を要求する場合は'headers' => { 'Accept' => 'application/json' }を使います。ctypeを指定してもAcceptは自動で付かないため、コンテンツネゴシエーションが必要な API では両方を指定します。

