ディープラーニングを使用してXSSを検出する方法

ディープラーニングを使用してXSSを検出する方法

1. はじめに

周知のとおり、ディープラーニングはコンピュータービジョン、自然言語処理、人工知能などの分野で大きな進歩を遂げており、セキュリティ分野でも登場し、実用化に向けて動き始めています。この記事で行った実験は、主にテキスト分類法とディープラーニングを使用してXSS攻撃を検出します。私は初心者なので、アルゴリズム自体を明確に理解していないのは避けられません。そのため、この記事では、シンプルで一般的な方法でアルゴリズムを紹介し、誤解を招かないようにあまり詳細を説明しません。

2. データセット

セキュリティ分野の公開データセットは非常に少ないです。この記事で提供される実験データは、xssed からクロールされた 40,000 以上のブラック サンプル (ポジティブ サンプル) と、約 200,000 の通常の http get リクエスト レコード (ネガティブ サンプル) の 2 つの部分で構成されています。データのセキュリティを確保するために、URL 内のホスト、パス、その他の情報は削除され、ペイロード部分のみが保持されます。

上記データは URL エンコードされ、CSV 形式で保存されています。元データの一部は URL エンコードされているため、使用するには 2 回 URL デコードする必要があります。

良い例:

  1. topic=http://gmwgroup.harvard.edu/techniques/ index .php?topic=<script>alert(document.cookie)</script>
  2. siteID= ';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//--></SCRIPT>">' ><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
  3. js='" --></style></script><script>alert(/meehinfected/)</script></title><marquee><h1>XSS :)</h1><marquee><strong><blink>XSSTEST</blink></strong></marquee><h1 >XSS :) </h1></marquee>  

否定的な例:

  1. _=1498584888937/&リスト=FU1804、FU0、FU1707、FU1708、FU1709、FU1710、FU1711、FU1712
  2. hid=sgpy-windows-generic-device-id&v=8.4.0.1062&brand=1&platform=6&ifbak=0&ifmobile=0&ifauto=1&type=1&filename=sgim_privilege.zip
  3. iid=11491672248&device_id=34942737887&ac=wifi&channel=huawei&aid=13&app_name=news_article&version_code=621&version_name=6.2.1&device_platform=android&ssmix=a&device_type=FDR-A03L&device_brand=HUAWEI&language=zh&os_api=22&os_version=5.1.1&uuid=860947033207318&openudid=fc19d05187ebeb0&manifest_version_code=621&resolution=1200*1848&dpi=240&update_version_code=6214&_rticket=1498580286466

3. 分詞

テキスト分類を使用する方法には、当然ながらテキストをセグメント化する方法が含まれます。上記の肯定的な例を観察して、人々がどのように XSS を識別するかを確認してください。パラメータには、実行可能な完全な HTML タグと DOM メソッドが含まれています。したがって、サポートされる単語分割の原則は次のとおりです。

一重引用符と二重引用符で囲まれた内容は「xss」です

http/https リンク

<script> タグ

<>はじめに<h1

パラメータ名トピック=

関数本体アラート(

文字と数字で構成された単語

さらに、単語の分割数を減らすために、数字とハイパーリンクを正規化し、数字を「0」に、ハイパーリンクを http://u に置き換える必要があります。

実装されたコードは次のとおりです。

  1. def GeneSeg(ペイロード):
  2. ペイロード =ペイロード.lower ()
  3. ペイロード = unquote(unquote(ペイロード))
  4. ペイロード,num=re.subn(r '\d+' , "0" ,ペイロード)
  5. ペイロード、num=re.subn(r '(http|https)://[a-zA-Z0-9\.@&/#!#\?]+' "http://u" 、ペイロード)
  6. r = '' '
  7. (?x)[\w\.]+?\(
  8. |\)
  9. | "\w+?"  
  10. | '\w+?'  
  11. |http://\w
  12. |</\w+>
  13. |<\w+>
  14. |<\w+
  15. |\w+=
  16. |>
  17. |[\w\.]+
  18. '' '
  19. nltk.regexp_tokenize(payload,r)を返す

単語分割後の正例:

  1. [ 'topic=' , 'http://u' , '<script>' , 'alert(' , 'document.cookie' , ')' , '</script>' ]
  2. ')' '>' '> ' '>' 、 ' <script>' 、 'alert(' 、 'string.fromcharcode(' 、 '0' 、 ' 0 ' ' 0 ' ' 0 ' ' ) ' ' alert (' ' string.fromcharcode(' '0' 、 '0' '0' '0' 、 ')' 、 ')' 、 ' alert (' 、 ' string.fromcharcode(' 、 '0' 、 '0' 、 '0' 、 ')' 、 ')' 、 ' alert (' 、 'string.fromcharcode(' 、 ' 0 ' ' 0 ' ' 0 ' ' ) ' ' )' 、 '> ' '</script>' '>' '>' '<script>' 'alert(' , 'string.fromcharcode(' , '0' , '0' , '0' , ')' , ')' , '</script>' ]
  3. ]

単語分割後の負の例:

  1. [ '_=' '0' 'list=' 'fu0' 'fu0' 'fu0' 'fu0' 'fu0' 、 'fu0' 'fu0' 'fu0' 'fu0' ]
  2. [ 'hid=' 'sgpy' 'windows' 'generic' 'device' 'id' 'v=' '0.0.0.0' 'brand=' '0' 'platform=' '0' 'ifbak=' '0' 'ifmobile=' '0' 'ifauto=' '0' 'type=' '0' 'filename=' 'sgim_privilege.zip' ]
  3. ' device_type = ' ' fdr ' ' a0l ' ' device_brand = ' ' huawei ' ' language = ' ' zh ' ' os_api = ' ' 0 ' ' os_version = ' ' 0.0.0 ' 'uuid=' '0' 'openudid=' 'fc0d0ebeb0' 'manifest_version_code=' '0' 'resolution=' '0' '0' 'dpi=' '0' 'update_version_code=' '0' '_rticket=' '0' ]

4. 埋め込み単語ベクトル

セグメント化されたテキストを機械学習の問題に変換するにはどうすればよいでしょうか。最初のステップは、これらの単語を数学化する方法を見つけることです。最も一般的な方法はワンホットエンコーディングで、語彙を非常に長いベクトルとして表し、1つの次元のみが1の値を持ち、他の次元は0になります。たとえば、「<script>」は[0,0,0,1,0,0,0,0…….]と表されます。この方法の重要な問題は、テキストを構成するベクトルが非常にまばらで、単語が互いに独立しているため、機械学習が単語の意味を理解できないことです。埋め込み単語ベクトルは、テキストを学習し、単語を空間に埋め込むことで、意味が似ている単語間の距離を空間内で近づけることで、単語の意味情報を単語ベクトルで表します。空間ベクトルは、「マイク」や「マイク」などの同義語を表現でき、「猫」、「犬」、「魚」などの単語も空間内で一緒にクラスター化されます。

ここでは、マシンが <script> や alert() などの HTML 言語を理解できるように、埋め込み単語ベクトル モデルを使用して XSS のセマンティック モデルを構築する必要があります。ポジティブサンプルで最も頻繁に出現する 3000 語が選択され、語彙を形成します。その他の単語は「UKN」としてマークされ、gensim モジュールの word2vec クラスを使用してモデル化されます。単語空間の次元は 128 次元です。

コアコード:

  1. def build_dataset(データ、単語):
  2. カウント= [[ "UNK" , -1]]
  3. counter=カウンター(単語)
  4. count .extend(counter.most_common(vocabulary_size-1))
  5. 語彙=[c[0] c場合 カウント]
  6. データセット=[]
  7. データ内のデータの場合:
  8. d_set=[]
  9. データ単語:
  10. 語彙内の単語:
  11. d_set.append(単語)
  12. それ以外
  13. d_set.append( "UNK" )
  14. カウント[0][1]+=1
  15. data_set.append(d_set)
  16. データセットを返す
  17. data_set = build_dataset(データ、単語)
  18. モデル=Word2Vec(データセット、サイズ=埋め込みサイズ、ウィンドウ=スキップウィンドウ、負の数=サンプル数、反復数=反復数)
  19. 埋め込み=モデル.wv

5. データ前処理

適切な単語ベクトル モデルを構築することで、空間ベクトルを使用してテキストを表すことができます。前のプロセスを組み合わせると、完全なプロセスは次のようになります。

最後に、すべてのデータはランダムに 70% のトレーニング データと 30% のテスト データに分割され、次の 3 つのニューラル ネットワークのトレーニングとテストに使用されます。コード例:

  1. sklearn.model_selectionからtrain_test_split をインポートします
  2.  
  3. トレーニングデータ、テストデータ、トレーニングラベル、テストラベル = トレーニングテスト分割 (データ、ラベル、テストサイズ = 0.3)

6. 多層パーセプトロン

多層パーセプトロン (MLP) は、入力層、出力層、および複数の隠れ層で構成されます。 Keras は、バックエンドとして Tensorflow を使用して、多層パーセプトロンを簡単に実装できます。アルゴリズム全体の精度は 99.9%、再現率は 97.5% です。コアコードは次のとおりです。

モデルのトレーニング:

  1. deftrain(train_generator、train_size、input_num、dims_num):
  2. print( "トレインジョブを開始します!" )
  3. 開始 =時間.時間()
  4. 入力=InputLayer(入力シェイプ=(入力番号、寸法番号)、バッチサイズ=バッチサイズ)
  5. レイヤー1 = Dense(100、アクティベーション = "relu" )
  6. レイヤー2 = Dense(20, アクティベーション = "relu" )
  7. フラット化 = フラット化()
  8. layer3 = Dense(2, activation = "softmax" , name = "Output" )
  9. オプティマイザー=Adam()
  10. モデル=シーケンシャル()
  11. モデルを追加します(入力)
  12. モデルを追加(レイヤー1)
  13. model.add(ドロップアウト(0.5))
  14. モデルを追加(レイヤー2)
  15. model.add(ドロップアウト(0.5))
  16. モデル。追加(平坦化)
  17. モデルを追加(レイヤー3)
  18. 呼び出し = TensorBoard(log_dir = log_dir、write_grads = True 、histogram_freq = 1)
  19. model.compile(optimizer,loss= "categorical_crossentropy" ,metrics=[ "accuracy" ])
  20. model.fit_generator(train_generator、steps_per_epoch=train_size//batch_size、epochs=epochs_num、callbacks=[call])

テスト:

  1. deftest(model_dir、test_generator、test_size、input_num、dims_num、batch_size):
  2. モデル = load_model(model_dir)
  3. ラベル_pre=[]
  4. ラベル_true=[]
  5. batch_num=テストサイズ//batch_size+1
  6. ステップ=0
  7. バッチの場合、test_generatorラベル:
  8. len(labels)==batch_sizeの場合:
  9. labels_pre.extend(model.predict_on_batch(バッチ))
  10. それ以外
  11. バッチ = np.concatenate((バッチ、np.zeros((バッチサイズ-長さ(ラベル)、入力数、ディメンション数))))
  12. labels_pre.extend(model.predict_on_batch(バッチ)[0:len(ラベル)])
  13. labels_true.extend(ラベル)
  14. ステップ+=1
  15. print( "%d/%dbatch" %(steps,batch_num))
  16. labels_pre = np.array(labels_pre).round()
  17. def to_y(ラベル):
  18. y=[]
  19. i が範囲(len(ラベル))内にある場合:
  20. ラベル[i][0]==1の場合:
  21. y.追加(0)
  22. それ以外
  23. y.append(1)
  24. yを返す
  25. y_true = to_y(ラベルが真)
  26. y_pre=to_y(ラベルのpre)
  27. 精度= precision_score(y_true,y_pre)
  28. リコール = リコールスコア(y_true,y_pre)
  29. print( "精度スコアは: " , precision )
  30. print( "リコールスコアは:" ,recall)

7. リカレントニューラルネットワーク

リカレント ニューラル ネットワークは、シーケンス内のコンテキスト知識を理解できる時間再帰ニューラル ネットワークです。このネットワークも Keras を使用して構築されています。最終モデルの精度は 99.5%、再現率は 98.7% です。コアコード:

モデルのトレーニング:

  1. 定義トレイン(トレインジェネレータ、トレインサイズ、入力数、ディメンション数):
  2. print( "トレインジョブを開始します!" )
  3. 開始 =時間.時間()
  4. 入力=InputLayer(入力シェイプ=(入力番号、寸法番号)、バッチサイズ=バッチサイズ)
  5. レイヤー1=LSTM(128)
  6. 出力= Dense(2, アクティベーション = "softmax" 名前= "出力" )
  7. オプティマイザー=Adam()
  8. モデル=シーケンシャル()
  9. モデルを追加します(入力)
  10. モデルを追加(レイヤー1)
  11. model.add(ドロップアウト(0.5))
  12. model.add (出力)
  13. 呼び出し = TensorBoard(log_dir = log_dir、write_grads = True 、histogram_freq = 1)
  14. model.compile(optimizer,loss= "categorical_crossentropy" ,metrics=[ "accuracy" ])
  15. model.fit_generator(train_generator、steps_per_epoch=train_size//batch_size、epochs=epochs_num、callbacks=[call])

tensorboard を使用してネットワークを視覚化します。

8. 畳み込みニューラルネットワーク

MLP ネットワークと比較すると、畳み込みニューラル ネットワーク (CNN) は、トレーニングが必要なパラメータの数と計算量を削減します。同時に、分析のための深い特徴を洗練することができます。ここでは、Google VGG に似た 1 次元畳み込みニューラル ネットワークが使用されています。これには、4 つの畳み込み層、2 つの最大プーリング層、および 1 つの完全接続層が含まれます。最終的な精度は 99.5%、再現率は 98.3% です。コア コードは次のとおりです。

  1. deftrain(train_generator、train_size、input_num、dims_num):
  2. print( "トレインジョブを開始します!" )
  3. 開始 =時間.時間()
  4. 入力=InputLayer(入力シェイプ=(入力番号、寸法番号)、バッチサイズ=バッチサイズ)
  5. レイヤー1 = Conv1D(64,3,アクティベーション = "relu" )
  6. レイヤー2 = Conv1D(64,3,アクティベーション = "relu" )
  7. レイヤー3 = Conv1D(128,3,アクティベーション = "relu" )
  8. レイヤー4 = Conv1D(128,3,アクティベーション = "relu" )
  9. レイヤー5 = 高密度 (128、アクティベーション = "relu" )
  10. 出力= Dense(2, アクティベーション = "softmax" 名前= "出力" )
  11. オプティマイザー=Adam()
  12. モデル=シーケンシャル()
  13. モデルを追加します(入力)
  14. モデルを追加(レイヤー1)
  15. モデルを追加(レイヤー2)
  16. model.add (MaxPool1D(pool_size=2))model.add ( Dropout(0.5))
  17. モデルを追加(レイヤー3)
  18. モデル追加(レイヤー4)
  19. モデルを追加します(MaxPool1D(pool_size=2))
  20. model.add(ドロップアウト(0.5))
  21. モデルを追加します(Flatten())
  22. モデルを追加(レイヤー5)
  23. model.add(ドロップアウト(0.5))
  24. model.add (出力)
  25. 呼び出し = TensorBoard(log_dir = log_dir、write_grads = True 、histogram_freq = 1)
  26. model.compile(optimizer,loss= "categorical_crossentropy" ,metrics=[ "accuracy" ])
  27. model.fit_generator(train_generator、steps_per_epoch=train_size//batch_size、epochs=epochs_num、callbacks=[call])

IX. 結論

この記事では、埋め込み単語ベクトルを使用して XSS セマンティック認識モデルを構築する方法を紹介し、MLP、リカレント ニューラル ネットワーク、畳み込みニューラル ネットワークの 3 つのアルゴリズムを使用して XSS 攻撃を検出します。3 つのアルゴリズムはすべて良好な結果を達成しています。

<<:  RNNに注目メカニズムを導入し、5つの主要分野におけるシーケンス予測問題を解決する

>>:  GAFT: Python で実装された遺伝的アルゴリズム フレームワーク

推薦する

タオバオライブストリーミングにおける機械学習に基づく帯域幅推定の探求と実践

背景メディア伝送における一般的な帯域幅推定アルゴリズムには、GCC/BBR/PCC/QUBIC など...

Python データ分析の基礎: 外れ値の検出と処理

機械学習において、異常検出と処理は比較的小さな分野、または機械学習の副産物です。一般的な予測問題では...

AIと機械学習のサイバーセキュリティという新興分​​野で考慮すべき3つのこと

[[343105]] [51CTO.com クイック翻訳] サイバー脅威の複雑さと数は時代とともに進...

COVID-19 最新情報: COVID-19 との戦いに役立つトップ 10 のイノベーション

[[320870]]迅速な感染検査から3Dプリントソリューションまで、世界中のテクノロジー企業が協力...

機械学習実践体験: データプラットフォームの設計と構築

近年人気の技術である機械学習は、数多くの「人工知能」製品でよく知られているだけでなく、従来のインター...

無料の Python 機械学習コース 9: K 平均法クラスタリング

K-クラスタリングとはどういう意味ですか? K-means クラスタリングは、最も人気があり、広く使...

AIは感情に関してより賢くなってきているのでしょうか?人間もそうすべきだ

人々は、一人でいるときと公共の場では行動が大きく異なりますが、基本的な性格は同じままです。観客のいな...

2.7B は Llama 2 70B に勝てる、Microsoft は「小さな言語モデル」を提供! 96台のA100が14日間でPhi-2を訓練し、Google Gemini nanoを圧倒

大きなモデルの髪は、本当にどんどんカールしてきています! 11月に、OpenAIはまずGPTを使用し...

...

交通大学ACMクラス卒業生のGoogleでの新たな仕事:Excelの表の数式を自動で記述

[[433049]]数式ビルダーのテーブルバージョンが登場しました。交通大学の ACM クラスを卒業...

人工知能が農業市場に浸透:機械農業は従来の農家よりも優れている

山東省寿光市は中国の有名な野菜生産地です。そこには野菜温室がいくつあるのでしょうか? 機械で数えてみ...

...

...

...

一流の科学者はどうやって AI を習得するのでしょうか? DeepSpeed4Science: 高度な AI システム最適化技術を使用して科学的発見を可能にする

今後 10 年間で、ディープラーニングは自然科学に革命をもたらし、自然現象をモデル化して予測する能力...