ディープラーニングを使用して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 で実装された遺伝的アルゴリズム フレームワーク

ブログ    

推薦する

人工知能技術は交通にどのように応用できるのでしょうか?

都市交通の分野では、AI信号制御、インテリジェントな街路交通監視、スマートバス停、スマート高速道路な...

自動運転競争が熱を帯び、実用化への道が始まろうとしている

科学技術の継続的な発展に伴い、人工知能、5Gネットワ​​ーク、生体認証、ロボットなどのインテリジェン...

ディープ ニューラル ネットワークを構築するための 20 の「未熟な」ヒント

当社の機械学習ラボでは、数多くの高性能マシンで何万時間ものトレーニングを行って豊富な経験を蓄積してき...

...

新型コロナウイルスは「ターミネーター」か?人工知能で疫病と闘う

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

2020年、全国の産業用ロボット出荷台数は前年比19.1%増加した。

工業情報化部が発表したデータによると、2020年1月から12月まで、全国の産業用ロボットの生産台数は...

AIの導入は増加しているが、障壁は残っている

AI の可能性は魅力的ですが、導入までの道のりには課題がないわけではありません。企業は、急速に変化す...

人間に一歩近づく | MIT×UMichが物体の空間関係を理解できる人工知能を研究

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

AIが将来のスマートマスモビリティソリューションへの道を切り開く

2030年までに人口の60%が都市部に住むようになると推定されています。現在そして将来に必要な条件は...

生成AIの可能性を活用してビジネスの成功を推進する

絶えず進化するデジタル環境において、「人工知能」(AI)という用語はもはや馴染みのない概念ではありま...

冷たい水の入った洗面器! FDAはロボット手術はまだそれほど信頼できないと警告

海外メディアの報道によると、ほとんどの場合、手術対象はブドウではないため、「科学者がブドウの手術を行...

機械学習モデルをトレーニングする際に避けるべき 6 つの間違い

[51CTO.com クイック翻訳] AI や機械学習モデルの開発は簡単ではありません。さまざまなシ...

機械学習に基づく自動脆弱性修復分析法

[[393588]]まとめファームウェア/ソフトウェアのセキュリティ脆弱性はグリッド セキュリティに...

エネルギー効率を向上させるために、脳は予測知覚能力を発達させた。

[[436377]]この記事はLeiphone.comから転載したものです。転載する場合は、Lei...