置換方法をカスタマイズする

# sWebMachineGun.exe実践編

置換方法をカスタマイズする

## はじめに

sWebMachineGun.exeは、各パラメータに様々な置換処理を行って通信するツールなので、その置換方法の作り方について記述する

## 設定画面

![r001z.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/e3e08c9e-4dc2-6d47-3c5a-30c3bcb095d3.png)

<b>「Setting」</b>⇒<b>「UseReplaceList」</b>とか
<b>「Setting」</b>⇒<b>「UseName」</b>あたり

![r005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/b6c66327-e6d1-0d61-f5c2-549751da997a.png)

<b>「GeneralSetting」</b>⇒<b>「Null Token」</b>あたり

## UseReplaceListグループ

![r002z.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/73cc520e-9d4f-c8dd-fbb8-89a69c37126e.png)

<dl>
 <dt><b>マーキング文字</b>
  <dd><b>「置換文字列」</b>の中で<b>「%s%」マクロ</b>の中身。診断会社名とか(少し長いけど)<b>「SecurityTest」</b>など(脆弱性診断とは異なる結合テストとか単体テストなど)他のテストと区別できて、かつログなどで検索しやすい名前が定番
 <dt><b>ホスト名</b>
  <dd><b>「置換文字列」</b>や<b>「URL」</b>の中で<b>「%H%」マクロ</b>の中身。SSRFの受信先サーバのホスト名が定番
 <dt><b>URL</b>
  <dd><b>「置換文字列」</b>の中で<b>「%U%」マクロ</b>の中身。SSRFの受信先サーバの秘密のURLが定番
 <dt><b>置換文字列</b>
  <dd>パラメータの値をこの文字列に置換/追加する
 <dt><b>UrlEncoded</b>
  <dd><b>「置換文字列」</b>が既にURLEncodeされているかどうか
 <dt><b>newArgs</b>
  <dd>「変数追加」という試験で、この置換文字列を使うかどうか。<a href="#newArgs">参照</a>
 <dt><b>NoCheckTarget</b>
  <dd>レスポンス中にXSSなどあるかどうかチェックするかどうか
 <dt><b>none/InduceError/ShoudCheck</b>
  <dd>後述
 <dt><b>前方追加など</b>
  <dd>置換方法を選択する。(後述)
 <dt><b>Add</b>
  <dd>追加する
 <dt><b>Clear</b>
  <dd>リストをクリアする
 <dt><b>UrlEncode</b>
  <dd>クエリ文字列やフォームへの置換時にURLエンコードするかどうか<br>
Offの場合は、最低限のURLエンコード(=とか&amp;とかCrとかLfとか+とかスペースなど)のみを実施する。以前、URLエンコードしないとXSSする対象があったので、基本的にはOffでよいと思うが、最近は逆にURLエンコードしていないとエラーとなるので、そういう対象にはOnにする必要がある
 <dt><b>ImportFile</b>
  <dd>ファイルからインポート(<font color="red">なんだったけ?あとでソースから確認する</font>)
 <dt><b>お勧め</b>
  <dd>リストをクリアして、お勧めリストにする
 <dt><b>NoneSet</b>
  <dd><b>「何もしない」</b>という置換方法を全消ししたり、数個置きに追加したり、コメントを編集したりするサブウィンドウを開く
</dl>

### 後述の参照画面

![r003z.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/578fa7ab-721c-11fb-ddbb-aa066e3655c3.png)

### UseReplaceListグループ(クロスリクエストチェック)

<b>「何もしない」</b>を正常リクエストのレスポンス、<b>「InduceError」</b>をエラーが発生した時のレスポンス、として認識して、<b>「ShoudCheck」</b>リクエストが、どちらに近いかで、blindSQLInjectionなどを検出しようと試みている判定オブジェクト向けの設定となる
さらに後述

### UseReplaceListグループ(置換方法)

まぁ、そのままだと思う

<dl>
 <dt><b>前方追加</b>
  <dd>既存の値の前方に追加する。文字列を前方から何文字で切る。とかいう処理があるので、試験文字列は前方に与えるのが基本だと思う
 <dt><b>後方付加</b>
  <dd>既存の値の後方に追加する。Null<b>(%00)</b>インジェクションの確認とか、Perlのopen関数のcmdインジェクション<b>(;ifconfig|)</b>などに使える
 <dt><b>完全置換</b>
  <dd>既存の値を完全に置換する。例えば、既存の値が<b>「TEST」</b>で、置換文字列が<b>「`echo%20%S%`」</b>だと、値は<b>「`echo TEST`」</b>に置き換わる
 <dt><b>文字追加</b>
  <dd>置換文字列を<b>「文字数,文字」</b>として、文字を追加する。例えば、置換文字列が<b>「5000,a」</b>だとすると、5000個の「a」が追加されるので、BoF(バッファオーバーフロー)の検査に使えると思う
 <dt><b>名前の後方付加</b>
  <dd>パラメータの名前の後方に追加する。例えば、パラメータが<b>「name=value」</b>で、置換文字列が<b>「[TEST]」</b>だと、パラメータは<b>「name[TEST]=value」</b>に置き換わる
 <dt><b>何もしない</b>
  <dd>そのまま何もしない。HTTPセッションが保持されているかどうか確認するとか、認証時のロックアウト回避を目的とした<b>&quot;とりあえず認証&quot;</b>などに使えると思う
 <dt><b>BeforeAtMark/AfterAtMark</b>など
  <dd><b>「@」</b>など特定の記号の前か後ろに置換文字列を追加する。これは、メールアドレスの右側(ドメイン部分)だけXSSした。というレアなケースがあったため。特定の記号がない場合は置換リストとしてパスされる
</dl>

## UseNameグループ

![r004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/6cea3013-1571-2e53-1cfb-c2333f5146bf.png)

基本的には、WWW-Form形式、MIME形式、JSON/BSON形式、XML形式、WWW-Form/MIMEの中のJSON/BSON形式、WWW-Form/MIMEの中のXML形式、text/Plain形式には対応していると思う

<dl>
 <dt><b>対象</b>
 <dd>対象のパラメータの場所、、、クエリ文字列とか、パスとか、ポストとか、クッキーとか、ヘッダとか・・・
 <dt><b>対象リクエストページ</b>
 <dd>何番目のリクエストが置換対象なのか
 <dt><b>何もしない</b>
 <dd>設定が正しいかどうか、一番最初に「何もしない」を実施するかどうか<br>
これは、クロスリクエストチェックの「何もしない」となるので、Offにしない方がよいと思う 
 <dt><b>最後に何もしない</b>
 <dd>検査(置換したリクエスト)が終わって、最後に「何もしない」を実施するかどうか。これで、HTTPセッションがまだ生き残っているか、検査途中で死んでしまったかを判断できると思う
 <dt><b>数値計算を行う</b>
 <dd>既存の値が数値の場合、計算式の置換を実施するかどうか。例えば、既存の値が<b>「12」</b>だと、値は<b>「13-1」</b>に置き換わるので、<b>「13」</b>のレスポンスなのか<b>「13-1=12」</b>のレスポンスなのか調べることができる
 <dt><b>数値に文字</b>
 <dd>既存の値が数値の場合、文字列(マーキング文字)に置換を実施するかどうか。例えば、既存の値が<b>「12」</b>だと、値は<b>「【マーキング文字】」</b>に置き換わるので、数値が要求されているのか、既存の値がたまたま数値だったのかを調べることができる
 <dt><b>数値に文字を付与</b>
 <dd>既存の値が数値の場合、文字列(マーキング文字)を後方に追加する置換を実施するかどうか。例えば、既存の値が<b>「12」</b>だと、値は<b>「12【マーキング文字】」</b>に置き換わるので、数値化できる範囲で数値化しているかどうかを調べることができる
 <dt><b>UrlEncode</b>
 <dd><font color="red">未稿</font>
 <dt><b>CSRFToken名は除外する</b>
 <dd>CSRFTokenとして設定したパラメータは置換対象から除外するかどうか。大抵はCSRFTokenをいじっても効率がよくないことが多い。
 <dt><b>マーキングは除く</b>
 <dd>既存の値にマーキング文字が含まれているパラメータは置換対象から除外するかどうか。Webブラウザ側(HTTPリクエストを取得した元)から検査文字列を入力したパラメータは検査対象外にできる。
 <dt><b>配列無視</b>
 <dd>配列のパラメータについて、一つだけ実施するか、全部実施するか
 <dt><b><a name="newArgs">変数追加</a></b>
     <dd><b>「newArgs」</b>がOnの置換方法、それを使って新パラメータを追加する。例えば、既存のポスト・フォームが<b>「name=value&amp;name1=value1」</b>だとして、<b>「newArgs」付き置換方法の置換文字列</b>が<b>「&quot;&#39;&gt;&lt;s&gt;TEST&lt;/s&gt;」</b>だとすると、ポスト・フォームは<b>「name=value&amp;name1=value1&amp;&quot;&#39;&gt;&lt;s&gt;TEST&lt;/s&gt;=&quot;&#39;&gt;&lt;s&gt;TEST&lt;/s&gt;」</b>となる。時々、任意のパラメータでXSSする場合があるので、それを検知できると思う
 <dt><b>除外変数名</b>
 <dd>置換対象から除外するパラメータ名。ASP.NETの暗号化パラメータとかは検査しても効率悪いからね...
 <dt><b>CSV変数名</b>
 <dd>CSV形式のパラメータの名前を指定。なるべく自動化したいのだが、CSV形式の自動認識についてはなかなかに難しいので、操作者自ら「このパラメータはCSVです」と指定する必要がある。指定されたパラメータは、デリミタで分解されて、個々に置換される。画面では<b>「csv_file」</b>というパラメータがCSV形式であり、デリミタは<b>「,(カンマ)」</b>となっている。
 <dt><b>Duplication</b>ボタン
 <dd>確認のメールアドレスとか、もう一度パスワードとか、複数のパラメータで同一値が必要とされるパラメータの設定、詳細は以下を参照してほしい
 <ul>
 <li><a href="https://qiita.com/tomoki0sanaki/items/3bd8b35ce03fe6f905f0">パスワード変更画面の場合1</a>
 <li><a href="https://qiita.com/tomoki0sanaki/items/1ca365fbc8b3a8170c48">パスワード変更画面の場合2</a>
 <li><a href="https://qiita.com/tomoki0sanaki/items/7287fe34efce8b259d78">パスワード変更画面の場合3(分割されたメールアドレス)</a>
 </ul>
</dl>

### パスについて

![r006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/7be55bd0-5026-eaf1-750f-e0f797ac985e.png)

URLのファイルパス部分は、あまりパラメータとして使われることはないのだけど、

- example.com/app.php/<b>name/value</b>
- example.com/app/<b>name=value</b>
- example.com/app/user/<b>12345</b>/delete

のようなパターンもあるので、そういう場合はパスも有効にするとよいだろう。

<dl>
 <dt><b>数値のみ</b>
 <dd>数値のみのフォルダ名を対象にする
 <dt><b>最後のみ</b>
 <dd>パスの最後のフォルダ名を対象にする
 <dt><b>UUID/Hashのみ</b>
 <dd>UUID/Hashっぽいフォルダ名を対象にする
 <dt><b>「★」を含むパスのみ</b>
 <dd>これは、隣のテキストボックスに入っている記号が含まれているフォルダ名を対象にする(画面例では<b>「=(イコール)」</b>となっている)
 <dt><b>「★」以降をクエリとする</b>
 <dd>画面例では、<b>「.php」</b>または<b>「.cgi」</b>以降もパスの場合は、それらをパラメータとして捉えて置換の対象とする。その際に<b>「/名前/値/名前/値...」</b>なのか<b>「/値/値/値...」</b>なのかをドロップダウンリストボックスで指定する
</dl>

## Null CSRFToken

![r005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/b6c66327-e6d1-0d61-f5c2-549751da997a.png)

画面は再掲だけど、このチェックをOnにすると、CSRFトークンのクロスリクエストチェックが動作する

仕組みとしては、トークンをなくす、空文字にするという2パターンを実施し、「何もしない」と比較する

# sWebMachineGun.exe Index

[sWebMachineGun.exe のメインメニューに戻る](https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3)