sWebMachineGun.exe の画面説明

# sWebMachineGun.exe

HTTP 通信を好きなだけ発行できるツール

# 過去のテキスト

- [Repeater(sWebMachineGun.exe) ver1.7.0.0 以前](http://rocketeer.dip.jp/sanaki/free/free140a.htm)
- [Repeater(sWebMachineGun.exe) ver1.7.0.0](http://rocketeer.dip.jp/sanaki/free/free140b.htm)


# 基本概念

基本的には、初期アーキテクチャの説明の「[Repeater(sWebMachineGun.exe) ver1.7.0.0 以前](http://rocketeer.dip.jp/sanaki/free/free140a.htm)」と変化していない。
![3次元空間でのリクエスト送信](http://rocketeer.dip.jp/sanaki/free/WebRequest001.jpg)

または、変数の繰り返しとパターンの繰り返しをまとめて、"変数とパターン" の繰り返しとみなしてもよい。

![ターンとカウンタを合わせた2次元空間でのリクエスト送信](http://rocketeer.dip.jp/sanaki/free/WebRequest003.jpg)

# 画面例


## アプリケーションタブ

### タブ外の共通ボタンなど

![029.png](https://qiita-image-store.s3.amazonaws.com/0/182822/4e6892ca-c7c7-10e2-1060-9d3059125d97.png)

#### Execute/Stopボタン

「設定をレジストリに保存して実行」または「停止」

#### Clearボタン

レスポンスタブの結果をクリアする

#### Saveボタン

設定をレジストリに保存する

#### Macroボタン

「[マクロについて](https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#%E3%83%9E%E3%82%AF%E3%83%AD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)」を参照

#### Exitボタン

設定をレジストリに保存して、終了する

#### ClearCookieボタン

内部的に保存しているクッキー、カスタム認証のトークンをクリアする

#### Reloadボタン

設定をレジストリに保存して、再起動する

#### Proxyボタン

HTTP Proxyを経由させる必要のがある場合の設定。
Basic認証とか、Proxyの認証とか・・・なんとなくわかるよね。
.NET Framework は Windows なので、Windows 統合認証用のドメインも指定できるみたいだね。

![033.png](https://qiita-image-store.s3.amazonaws.com/0/182822/1c031839-f4ef-4327-db7e-2249a5101f8f.png)


#### Certificateボタン

未稿

#### Loglogボタン

[sPortRedirector.exe](https://qiita.com/tomoki0sanaki/items/134cea01d1274075b723)で説明する

URIとか、パラメータとかをなんとなくいい感じに出力しようとしている

### Requestタブ

![027.png](https://qiita-image-store.s3.amazonaws.com/0/182822/31189bee-4c2b-170d-45db-a0588ffc61ad.png)

![028.png](https://qiita-image-store.s3.amazonaws.com/0/182822/1dc449b2-4685-b070-94b2-c3f5be3637c8.png)

### Settingタブ(置換方法)

![040.png](https://qiita-image-store.s3.amazonaws.com/0/182822/e71b43a9-a45f-0d55-7e86-ab6038bd6b2f.png)

#### 置換方法について

<dl>
 <dt>前方追加</dt>
<dd>変数名=<b>≪ここに置換文字列が埋め込まれる≫</b>値<br>これは基本形</dd>
 <dt>後方付加</dt>
<dd>変数名=値<b>≪ここに置換文字列が埋め込まれる≫</b><br>これはNullInjectionなどに使えると思う</dd>
 <dt>完全置換</dt>
<dd>変数名=≪値自体が書き換わる≫<br>値としてマクロ文字「%S%」が使える<br>「`%S%`」だと、値全体をバッククォートで囲むという意味になる<br>
<img src="https://qiita-image-store.s3.amazonaws.com/0/182822/9870634b-395c-0ef2-0c0d-e15af0d62353.png" alt="043.png"></dd>
 <dt>文字追加</dt>
<dd>指定の仕方は独特。<img src="https://qiita-image-store.s3.amazonaws.com/0/182822/96fcaeb8-9856-d8b1-38c8-664d00535935.png" alt="042.png">
こんな感じ「(文字数)(カンマ)(文字)」で指定する</dd>
 <dt>名前の後方付加</dt>
<dd>変数名<b>≪ここに置換文字列が埋め込まれる≫</b>=値</dd>
 <dt>数値計算</dt>
<dd>使っていないじゃないかな・・・</dd>
</dl>

### Settingタブ(変数名の指定方法)

![041.png](https://qiita-image-store.s3.amazonaws.com/0/182822/28adb9e7-fcbe-83bd-f972-4e5c9489168c.png)

パスに対しても繰り返し処理ができるのだが、その仕様上の注意は、以下を参照

[System.Uri クラスの仕様と、sWebMachineGun.exe のパスに関しての仕様上の注意](https://qiita.com/tomoki0sanaki/items/62e167bba4262b071322)

### GeneralSettingタブ(その1)

![034.png](https://qiita-image-store.s3.amazonaws.com/0/182822/03f8f47e-0352-9c16-458d-8807b3b783ea.png)

- [レスポンスタブのデータグリッドビューの色分け](https://qiita.com/tomoki0sanaki/items/e557e5083486c2d0a8e2)

### GeneralSettingタブ(その2)

![035.png](https://qiita-image-store.s3.amazonaws.com/0/182822/c5455211-871c-d1a1-4113-f7b402957c53.png)

### Judge/RegExタブ

![031.png](https://qiita-image-store.s3.amazonaws.com/0/182822/d6614608-4cc1-4d5f-414e-5e13cfaa54cc.png)

### TimeoutCheckタブ

タイムアウト判定モードの際のタイムアウトしたかどうかの判定をここで設定する。

![053.png](https://qiita-image-store.s3.amazonaws.com/0/182822/f4eb7468-e08a-c616-172a-a7ac2771c41a.png)

単純文字列の有無でもいいし、正規表現で判定してもよいし、スクリプトで判定してもよい

### Scriptタブ

![030.png](https://qiita-image-store.s3.amazonaws.com/0/182822/c9d84c16-f6c7-92e3-cfcd-a915cff9f4c3.png)

ver4.8.0.0 現在

- Boo 0.9.7
- IronPython 2.7
- IronRuby 1.1
- JScript.NET
- NLua(Lua5.2)

### Responseタブ

![052.png](https://qiita-image-store.s3.amazonaws.com/0/182822/f653acbf-dc33-e8ec-f3ef-9eaa435d9fa1.png)

繰り返しした結果を表示する

簡易的な判定としては、XSS,bSQLi,CrLfInjection 程度

[Judge/RegExタブ](https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#judgeregex%E3%82%BF%E3%83%96)や[Scriptタブ](https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#script%E3%82%BF%E3%83%96)で設定した判定も「SimpleResult」欄に表示される。

#### ステータスバー

![083.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/e7af7efb-bae6-dbbc-7388-85ba9991d5a5.png)

- 「Start」は開始時間
- 「Remain」は大体の残り時間
- 現在置換中のパターン文字列や、対象パラメータ名
- 「数値 Wait... 数値」は、遅延中(待機中)の時間
- 右下の値は、プログレスバーの値/最大値ですが、「現在の位置/(想定される最大の全リクエスト数(+タイムアウトチェックの場合は待機時間を加算[分]))」

#### 簡易判定の bSQLi の仕組み

「何もしない」で「正常系」を取得。置換方法で「InduceError」フラグのあるタイプを「エラー」タイプとして記憶しておき、まず「正常系」と「エラー系」の違いを判断する(レスポンスコードの違い、同じレスポンスコードならコンテンツサイズ)
上記(「正常系」と「エラー系」が異なる)の状態で、「InduceError」フラグのない置換方法が「正常系」に近い(レスポンスコード、同じレスポンスコードの場合は、コンテンツサイズが「正常系」と「エラー系」で近い方)と判定された場合に「bSQLi」としている。
一つのURLに対しては「正常系」は一度取得後に更新しないが、「エラー系」は「InduceError」フラグのある置換方法が登場する度に更新される。

ぶっちゃけ、あまり精度は高くないので、判定としては参考程度かな。

# 使い方

## 動作モード(繰り返しの方法)

[sWebMachineGun.exeの動作モード](https://qiita.com/tomoki0sanaki/items/ecb697ad856d433a32fa)

## CSRFトークンについて

[GeneralSettingタブ](https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#generalsetting%E3%82%BF%E3%83%96%E3%81%9D%E3%81%AE1)から遷移してくる

![048.png](https://qiita-image-store.s3.amazonaws.com/0/182822/369c2a15-046f-b6d0-2796-f9a32bf84b24.png)

- 抽出方式を選択して、貼付方式を選択する。という流れ

- 抽出方式、貼付方式ともにプラグイン形式なので、拡張可能

- 抽出方式、貼付方式共に、テキストボックスが2つある
- 1つ目のテキストボックスは、対象の変数名。一般的には、抽出側はHTMLのhiddentダクの名前、貼付側はPOSTの変数名になると思う

- 2つ目のテキストボックスは、その値を XML または JSON と想定して XPath または JPath を記述する事が可能

- 1つ目のテキストボックスが空欄で、2つのテキストボックスの指定があった場合、ボディ全体を対象とする。つまり、抽出側はボディ全体が XML または JSON 形式の場合とか、貼付側は、POST するボディが XML または JSON の場合とか

- 「Double」は、抽出した値を変数名として再度実施する。という事。以前にこういうものがあった。

```html
<input type="hidden" name="csrfname" value="abcdefg">
<input type="hidden" name="abcdefg" value="xzyqwst">
```

![049.png](https://qiita-image-store.s3.amazonaws.com/0/182822/6f685539-8503-607e-b572-cc1ee5d9d5bc.png)

- 抽出方法
    - **Cookie** クッキーヘッダから抽出
    - **Hidden** HTML→hiddenタグから抽出
    - **HttpHeader** HTTPヘッダから抽出
    - **Regex** (最大2回の)正規表現で抽出
    - **ScriptTag** HTML→Scriptタグ中の文字列リテラルから抽出
    - **Script/言語** 指定したスクリプトで抽出する

- 貼付方法
    - **HttpHeader** HTTP ヘッダに貼付する
    - **None** 貼付はしない
    - **Post/Query** Postまたはクエリ文字列に貼付する
    - **Regex** (最大2回)の正規表現で貼付位置を決めて貼付する
    - **Script/言語** 指定したスクリプトで貼付する

### CSRFトークン、None について

- 抽出と貼付は**「レスポンスから抽出して、直後のリクエストに貼付」**を想定している
- 貼付方法にある**「None」**は、抽出だけ行いたい場合に使う
- 直後のリクエスト以外で、**マクロ「%csrf≪インデックス≫%%」**の置換対象となる
- 最初のリクエストで抽出だけして、(直後だけでなく)その後に続くレスポンス全てに貼付したい場合に使えると思う

<hr>

- 参考リンク : [置換したリクエストとは別のレスポンスを検査する場合(CSRFトークン)](https://qiita.com/tomoki0sanaki/items/41d68d41a70fb9057468)

## 遅延処理について

リクエスト間で、遅延が欲しい場合、指定する

[GeneralSettingタブ](https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#generalsetting%E3%82%BF%E3%83%96%E3%81%9D%E3%81%AE1)から遷移してくる


![050.png](https://qiita-image-store.s3.amazonaws.com/0/182822/34173e35-269d-70aa-67b1-29f9776a4cab.png)

説明しなくても、なんとなく分かるよね。

- 乱数発生アルゴリズムを選択して
- 最小遅延時間(ミリ秒)を指定して
- 最大遅延時間(ミリ秒)を指定するだけ

## 終了時サウンドについて

[GeneralSettingタブ](https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#generalsetting%E3%82%BF%E3%83%96%E3%81%9D%E3%81%AE1)から遷移してくる

スピーカーをオンにしておけば、繰り返し処理が終了すると、音が出る

![051.png](https://qiita-image-store.s3.amazonaws.com/0/182822/43ce530f-f1a1-ef40-0974-7a4224d20787.png)

- **「Speak」**は指定した文字列をしゃべる。(.NET Framework4 以降の標準音声合成。MS-Office2010以降がインストールされていると日本語エンジンも一覧にでると思う)
- **「Speak」**は、言語エンジンと、発声文字列、ボリュームとレートなので、説明は省略
- **「Sound」**は、wav形式を指定するとその音が繰り返し終了時に流れる
- **「Sound」**は、.NET Framework4 の標準のサウンドクラスを使っているので、wav形式だけだと思う。MP3形式とかにも対応したいけど・・・

## カスタム認証について

リクエスト・テンプレートごとに、カスタム認証を設定できる。

WebAPI の診断の時に役立つ。

セレクトボックスを選択して**「DEL」**ボタンで、**無選択状態**となる

![047.png](https://qiita-image-store.s3.amazonaws.com/0/182822/f4b77952-3032-df21-1934-185ea040dff3.png)


カスタム認証の方式は、プラグイン形式にしているので、拡張可能

![044.png](https://qiita-image-store.s3.amazonaws.com/0/182822/2a0edeb2-a91c-ad84-8dec-0484659cb0da.png)

ver4.8.0.0 現在で

- OAuth2 (www-form)
- OAuth2 (json)
- PostAccessToken
- WSSE
- WSSE Digest
- Scriptで実装
    - Boo 0.9.7
    - IronPython 2.7
    - IronRuby 1.1
    - JScript.NET
    - NLua(Lua5.2)

![045.png](https://qiita-image-store.s3.amazonaws.com/0/182822/5d51cf70-f57f-379d-071e-672a59a4e2a0.png)

OAuth2 の場合、...既定値でなんとなく設定できると思う

![046.png](https://qiita-image-store.s3.amazonaws.com/0/182822/0115cda9-44ce-6724-5c3a-7d82ddcfcbed.png)

WSSE の場合、...既定値でなんとなく設定できると思う

- 参考リンク : [ログイン画面の場合(SSO認証)](https://qiita.com/tomoki0sanaki/items/89888f497a5289359852)

## デバイスメッセージ(外部連携)

[GeneralSettingタブ](https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#generalsetting%E3%82%BF%E3%83%96%E3%81%9D%E3%81%AE1)で設定する

例えば、
`nページ目にアクセスすると、メールが送信されて、受信したメールの本文の数値をn+1ページ目のリクエストの特定の場所に埋め込んで、セッションを続ける`
というのが、「%%msg%」マクロでできる

![054.png](https://qiita-image-store.s3.amazonaws.com/0/182822/1853556f-06c6-b5aa-b3c5-559378da2b31.png)

- 使いたいオブジェクトをチェックすればいい。
- 設定が必要なオブジェクトは、ダブルクリックすると、現在の設定値が上部のテキストボックスにコピーされる
- 「Default」というボタンで、既定の設定値が上部のテキストボックスにコピーされるので、それを参考に設定してもよい
- 設定が終われば「Set!」ボタンで、オブジェクトへ反映させる
- オブジェクトはプラグイン形式なので拡張可能
- 通信するリクエストに「%%msg%」があり、どれかがチェックされていれば、上から順に実行していき、「%%msg%」が置換されてリクエストされるだろう

ver4.8.0.0 現在

- **mail** メールサーバ(POP3/IMAP4)に接続してメールを受信、メールの本文、題名から正規表現で値を返却、または添付ファイルを返却
- **TextRegularExpressions** 既に別のオブジェクトが返却した値を、正規表現でさらに整形して返却
- **ImageFilter** 既に別のオブジェクトが返却したバイナリを画像として読み込み、QRコード/Exif情報を返却(画像やPDFからの文字認識は未実装→「target=OCRは動作しない」→Office2003があれば.NETでもできるらしいorz)または、既に別のオブジェクトが返却したバイナリを音声として読み込み、.NET Framework4 標準の音声認識エンジン(あまり精度は高くない{Coltanaさんを使いたいけどorz})で音声からテキストを抽出して返却
- **Clipboard** クリップボードを監視して、テキスト/画像/サウンドを返却
- **InputMessageDialog** 入力ボックスのあるダイアログを表示して一時停止、手動で必要な値を入力すればいいのさ

`Android で、SMSをメールに送信する` というアプリを使えば、

`nページ目のリクエストで、SMS(Android)にパスコードが送信されて、n+1ページ目にその値を使って認証`
というのを自動化できると思うぞ。

- 参考リンク : [ログイン画面の場合(多要素認証)](https://qiita.com/tomoki0sanaki/items/19e0dc152acc93681d47)

## マクロについて

![032.png](https://qiita-image-store.s3.amazonaws.com/0/182822/e0689b28-3750-c76e-783f-63a0970f85e3.png)

<dl>
 <dt><b>%%[pP]≪数字≫%</b></dt>
 <dd>ページ番号に置換される。<br>数字は桁数。例えば「%%p3%」は「001」とか「002」とか</dd>
 <dt><b>%%[cC]≪数字≫%</b></dt>
 <dd>セッション番号(カウント数+ターン数)に置換される。<br>数字は桁数。例えば「%%c3%」は「001」とか「002」とか</dd>
 <dt><b>%%[gG]≪数字≫%</b></dt>
 <dd>グローバルカウント番号に置換される。<br><a href="https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#generalsetting%E3%82%BF%E3%83%96%E3%81%9D%E3%81%AE2">設定画面はここ</a>。<br>数字は桁数。例えば「%%g3%」は「001」とか「002」とか</dd>
 <dt><b>%s%</b></dt>
 <dd>置換対象文字列</dd>
 <dt><b>%s%</b></dt>
 <dd>置換対象文字列上では、変数名<br><a href="https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#%E7%BD%AE%E6%8F%9B%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">置換方法</a></dd>
 <dt><b>%M%</b></dt>
 <dd>マーキング文字<br><a href="https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#%E7%BD%AE%E6%8F%9B%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">置換方法</a></dd>
 <dt><b>%H%</b></dt>
 <dd>ホスト名<br><a href="https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#%E7%BD%AE%E6%8F%9B%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">置換方法</a></dd>
 <dt><b>%S%</b></dt>
 <dd>変数の値<br><a href="https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#%E7%BD%AE%E6%8F%9B%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">置換方法→完全置換</a></dd>
 <dt><b>%file≪インデックス≫%</b></dt>
 <dd>アップロードファイル(バイナリ)を指定する。<a href="https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#generalsetting%E3%82%BF%E3%83%96%E3%81%9D%E3%81%AE1">アップロードファイルはここで指定する</a></dd>
 <dt><b>%%byte%</b></dt>
 <dd>URLデコードされた置換対象文字列<br>入力する事はないが、結果画面で見かけるかも</dd>
 <dt><b>%%msg%</b></dt>
 <dd>ダイアログからの入力<br><a href="https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E5%A4%96%E9%83%A8%E9%80%A3%E6%90%BA">詳しい説明はここ</dd>
 <dt><b>%%csrf≪インデックス≫%</b></dt>
 <dd>CSRFトークン<br>
<a href="https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#csrf%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">設定画面はここ</a>
</dd>
 <dt><b>%%m≪インデックス≫%</b></dt>
 <dd>カスタムマクロ<br>例えば、今日はid=1234の情報使ってください、明日はid=2456の情報使ってください。とかをカスタムマクロ化しておくと、ここだけ変更すればいいので、便利かもね</dd>
</dl>

「C」、「P」や「G」は、全角数字でカウントする事も可能

- 参考リンク : [データ作成画面と削除画面3(残ったデータを削除するための連続実行)(連続してHTTPリクエストを送信する(マクロの使い方))](https://qiita.com/tomoki0sanaki/items/214b9338d850cd5e52a7)

# 実践編

- [一つのHTTPリクエスト(一番シンプル)](https://qiita.com/tomoki0sanaki/items/bf5425c33bab876b6287)
- [置換したリクエストとは別のレスポンスを検査する](https://qiita.com/tomoki0sanaki/items/65ae2d4b346bf19f6c4b)
- [置換したリクエストとは別のレスポンスを検査する場合(CSRFトークン)](https://qiita.com/tomoki0sanaki/items/41d68d41a70fb9057468)
- [並列な(互いに独立している)複数のリクエストを一斉に検査する](https://qiita.com/tomoki0sanaki/items/e672a57ab99d27430ee6)
- [ログイン画面の場合](https://qiita.com/tomoki0sanaki/items/5ea742b00dab9774fe60)
- [ログイン画面の場合(多要素認証)](https://qiita.com/tomoki0sanaki/items/19e0dc152acc93681d47)
- [ログイン画面の場合(SSO認証)](https://qiita.com/tomoki0sanaki/items/89888f497a5289359852)
- [パスワード変更画面1](https://qiita.com/tomoki0sanaki/items/3bd8b35ce03fe6f905f0)
- [パスワード変更画面2](https://qiita.com/tomoki0sanaki/items/1ca365fbc8b3a8170c48)
- [パスワード変更画面3(分割されたメールアドレス)](https://qiita.com/tomoki0sanaki/items/7287fe34efce8b259d78)
- [データ作成画面と削除画面1](https://qiita.com/tomoki0sanaki/items/e3cd70ede8053ef710d8)
- [データ作成画面と削除画面2(削除画面)](https://qiita.com/tomoki0sanaki/items/a7673dd160e79950186e)
- [データ作成画面と削除画面3(残ったデータを削除するための連続実行)(連続してHTTPリクエストを送信する(マクロの使い方))](https://qiita.com/tomoki0sanaki/items/214b9338d850cd5e52a7)
- [ディレクトリ・トラバーサルを検査する](https://qiita.com/tomoki0sanaki/items/a23d058603c90abec82a)
- [レスポンスタブのデータグリッドビューの色分け](https://qiita.com/tomoki0sanaki/items/e557e5083486c2d0a8e2)
- [置換方法をカスタマイズする](https://qiita.com/tomoki0sanaki/items/0a8cee2806165cf704d1)

# 利用に際して

当然ですが、本ツールは、デバグ用、開発用であり、悪用厳禁ですよ。

# インデックスへ戻る

[sWebTool Manual index](https://qiita.com/tomoki0sanaki/items/b8f571ae296a32f7b434)

# 以上