i-Vinci TechBlog
株式会社i-Vinciの技術ブログ

チームで開催した勉強会の紹介 ~脆弱性~

皆様こんにちは
エンジニア半年目、毎日ひめうずらを愛でている、うずら系エンジニアの饗庭です。

本日は私が所属しているグループで定期的に行っている勉強会を元にブログ記事にしました!
技術的な内容は少なめとなっていますが、i-Vinciの雰囲気が少しでも伝われば良いなと思います!

勉強会のテーマ選定

メンバーとコミュニケーションをとって交流ができる会をしよう、という目的の上
それぞれメンバーが「やりたい事」「興味あること」を提案していきました。
色々な提案がありどれも面白そうな内容です。

  • 輪読会
  • リファクタリング
  • 技術発表会
  • KPIについて
  • 脆弱性
  • jsで描写
  • 動画鑑賞 競技プログラミング

まずは脆弱性をやるという事になりましたが、他のテーマもとても気になります・・・

教材の選定

ここが割と難しいところで、主に必要だったのは

  • 脆弱性テストが好き勝手にできる環境
  • 皆で出来る共通の課題
  • 適度なレベル感

等でした。
「脆弱性テストを好き勝手にできる環境」というのは結構重要で
オープンなWEBサイトでは絶対に試せない為、ローカル環境で操作出来るものを探す必要がありました。

脆弱性をテストできるアプリは幾つか公開されていて、今回の勉強会では下記の2つを使用しました。

  • OWASP Juice Shop
  • WebGoat

OWASP Juice Shopについて

OWASP Juice Shop

実際にありそうなWEBサイトにわざと脆弱性を持たせたアプリになっています。
ローカル環境で立ち上げると実際に中に入って脆弱性に対する攻撃をする事ができます。

脆弱性を探す楽しさはありましたが、じゃあどう対策するの?の部分の導きが難しかったです。
また探す取っ掛かりも難しく難易度も高いので、それぞれ個人で探す場面が多かったです。

ただ誰かが脆弱性を見つけると、一旦みんなで手を止めてその脆弱性の説明を聞きに行き「おー凄い」となる場面も少なくなかったので、
見つけた事を共有する楽しさみたいなものはあったと思います。

何週間か勉強会を続けていましたが、やはり個人毎に課題をやる場面が多かったので教材を変えた方がよさそうという事になり、途中からWebGoatに切り替える事になりました、なので今回はそちらを主体に紹介します。

WebGoatについて

WebGoat

  • Dockerでの立ち上げができるので各PCのローカル環境で作業が可能
  • レベル感も初級編から高難易度まで幅広く課題数も多い

WebGoatの環境構築

1.Dockerからpullします。

  • docker pull webgoat/webgoat-8.0

2.コンテナを起動します。

  • docker run -p 8080:8080 -t webgoat/webgoat-8.0

3.http://localhost:8080/WebGoat/login にログインします。

勉強会の流れ

毎回ランダムで2~3名のグループを2チームほど作り
それぞれリモートでオンライン上のチャットルームに集まって課題に対して進めました。

チャットルームの中では画面共有をする人を一人決めて、その画面を皆で見ながら
意見を出し合ったり分からないところを共有したりして進めていきました。

WebGoatの方は、レベル感が適度で良かったのと、着手する課題の順番も明確だったので
みんなで同じ課題に取り組むことができました、また回答の内容が分からない人がいたら
理解している人が説明したりして、同じ速度で勉強が出来ていたと思います。

それらを40分ほど続けていき、最後に2チームの代表が勉強した課題の内容や気付き等を発表するスタイルでした。

脆弱性(SQLインジェクション)例

今回はSQLインジェクションを使用した脆弱性に対する攻撃例を紹介します。

なお、こちらの内容は絶対に公開しているサイト等で試したりはしないようお願いします。

  • 「〇 or 〇」を使用した攻撃

例えばログイン用の入力フォームと
それに対応するSQL文があったとします。

入力した値はWHEREの値部分に入るものとします

SELECT * FROM user WHERE user_name = 'フォームの入力内容が入る';

本来であれば一名ずつ入力するのがルールです。

SELECT * FROM user WHERE user_name = 'Tarou';

ここでWHEREの値に入る内容が
シングルクォーテーションで囲った内容が入る事が分かったので
それを利用して、フォームに「' or '1' = '1」と入力してみます・・・

するとSQL文は下記となります。

SELECT * FROM user WHERE user_name = '' or '1' = '1';

これにより条件の'1' ='1'では必ず真となるためuserの全データが対象に取得できてしまうことになります・・・

次に元のSQL文を終了させて別のSQL文を実行させます
フォーム部分に下記を入力します
「' or '1' = '1'; SELECT * FROM task; --」

結果

SELECT * FROM user WHERE user_name = '' or '1' = '1'; SELECT * FROM task;--';

これで、本来関係のないtaskテーブルのデータ取得も出来てしまいました・・・

どちらもフォーム入力後のSQL文がどうなっているのかを予測して
改ざんしたい内容と最終的な形が正しくなるよう特殊文字を組み合わせるというものです。

対策はどうするのか?

エスケープ処理が効果的な方法で、上記のインジェクション例で出てきた特殊文字を通常の文字列として扱わせる処理になります。

フレームワークを使用していれば、クエリのエスケープ処理をしてくれるメソッドを用意してくれているので、
基本的にはそれを使用していれば問題ありません。

まとめ

脆弱性を知るためには、どんな攻撃があるのかというところからの勉強になりましたが
普段攻撃しようとは考えないので、違う確度から頭を使う感じで難しかったです・・・

皆でやる勉強会に関しては、やはりモチベーションが上がったり、適度な緊張感があったりで良かったかと思います。

この勉強会は二週間に一回の間隔で定期的に開催していますので、
今後、別の勉強テーマも記事になるかもしれません・・・!!

それでは、最後まで読んでいただきありがとうございました!!