PHPでログアウト処理の実装

ログアウト処理の実装
#19 ログアウト処理を実装しよう
http://dotinstall.com/lessons/sns_php_v2/9619
を参考に
PHPでのログアウト処理の実装
vim logout.php
でファイルを作成
最初のPHPの部分
require_once() によるファイル読み込み
そして、セッションの開始は
そのままコピペでOK
require_once(‘config.php’);
require_once(‘functions.php’);
session_start();
そして、セッションの中身を空の配列にする
$_SESSION =array();
次に、セッションクッキーの削除
これは、空の値と有効期限を過去の時間にすることで
実現できる
86400は一日の秒数
if(isset($_COOKIE[session_name()])){
setcookie(session_name(),”,time()-86400,’/sns_php/’);
}
そして、セッション情報の破棄するので
session_destroy();
ここまでできたら、ログイン画面に戻すので
header(‘Location: ‘.SITE_URL.’login.php’);
とする
これで実行すると
ログイン機能が実装されているのが実感できる

ユーザプロフィールの表示

ユーザプロフィールの表示
#18 ユーザープロフィールを表示する
http://dotinstall.com/lessons/sns_php_v2/9618
を参考に
ユーザーの詳細情報を表示するためのプロフィールページを実装
編集するのは profile.php
一覧表示はいらないので
<ul>
<?php foreach($users as $user) : ?>
<li><a href=”profile.php?id=<?php echo h($user[‘id’]); ?>”><?php echo h($user[‘name’]); ?></a></li>
<?php endforeach; ?>
</ul>
は削除
代わりに、プロフィールを表示するコードを記述
<h1>user profile</h1>
<p>name: <?php echo h($user[‘name’]); ?></p>
<p>email : <?php echo h($user[‘email’]); ?></p>
そして、index.php に戻るためのリンクもつくる
<p><a href=”index.php”>一覧へ</a></p>
あと、SQL実行のため
php ソース部分に
$sql =”select * from users where id = :id limit 1″;
$stmt=$dbh->prepare($sql);
$stmt->execute(array(“:id”=>(int)$_GET[‘id’]));
これで、実行してユーザ名をクリックすると
プロフィール画面になる
このとき
http://192.168.10.151/sns_php/profile.php?id=1
というように、profile.php?=ユーザIDとなっている
この番号を存在しないIDにすると
そのユーザは存在しないというエラーもでる

PHP+MySQL でユーザ情報表示

PHP+MySQL でユーザ情報表示
#16 ユーザー情報を表示しよう
http://dotinstall.com/lessons/sns_php_v2/9616
を参考に
ログインしているユーザ情報の表示をする
編集するファイルは index.php
まずは php部分の編集
セッションに me が入っているので
$me =$_SESSION[‘me’];
として $me に格納
次に、どのユーザでログインしているか表示するので
HTML部分に
Logged in as <?php echo h($me[‘name’]); ?> (<?php echo h($me[‘email’]); ?>)
としてDBから
ユーザ名とメールアドレスを取得して表示
また、ログアウト機能も作っておく
<a href=”logout.php”>log out</a>
ここまでが個人ユーザ情報の取得と表示
ユーザ一覧を取得して表示するには
PHP部分で
$dbh = connectDb();
$users = array();
$sql =”select * from users order by created desc”;
foreach($dbh->query($sql) as $row){
array_push($users,$row);
}
これで、次にHTML部分にリスト表示するための準備
<h1>ユーザ一覧</h1>
の下に
<ul>
<?php foreach($users as $user) : ?>
<li></li>
<?php endforeach; ?>
<ul>
とする
次に
一覧を表示したいので
<li></li>
の間に
<php echo h($user[‘name’]); ?>
とする
さらに各ユーザ情報を作成して
そこにリンクさせるなら
<a href=”profile.php?id=<?php echo h($user[‘id’]); ?>”><php echo h($user[‘name’]); ?></a>
というようにする
これで、ユーザ一覧に名前がでればOK
そして、profile.php に関しては index.php に近いソースなので
cp index.php profile.php
でコピーして編集する
プロフィール情報なので、一覧のところのSQLを変える
$sql =”select * from users where id = :id limit 1″;
として
編な値が入らないのように
(int )というように型を指定しておく
$stmt = $dbh->execute(array(“:id”=>$_GET[‘id’]));
とすれば、現在ログインしているユーザIDが取得できる
$user = $stmt->fetch();
としてSQLの実行結果を $user へ格納
そして
if(!$user){
echo “no such user !”;
exit;
}
とすれば、ユーザが検出できないときには
エラーメッセージがでるようになる

PHPでログイン処理の実装

#15 ログイン処理を完成させよう
http://dotinstall.com/lessons/sns_php_v2/9615
を参考に、ログイン処理の実装
エラーメッセージの表示と動作確認する
変更するのは
login.php
<?php echo h($err[‘email’]); ?>
<?php echo h($err[‘password’]); ?>
を input 要素のところに追記して
それぞれ空白とかのエラー対応メッセージを表示する
また、メールアドレスに関しては
value=””に
<?php echo h($email); ?>
を追記してメールアドレスを表示したままにできるようにする
ここまでできたら、動作確認
ログインできたのを確認したら
if (empty($err)) {
}
の中にセッションハイジャック対策をする
session_regenerate_id(true);
を追記する
$_SESSION[‘me’]=$me;
header(‘Location: ‘.SITE_URL);
exit;
でindex.php に飛ぶようにする
これで、ログイン画面からアクセスして
メールアドレス
パスワードを入力して
ログインして
ユーザ一覧
と表示されていたら成功
これで、次は index.php のページの作り込みになる

メールアドレスの登録チェック

メールアドレスの登録チェック
まずメールアドレスの形式チェック
メールアドレスが空でないか
メールアドレスとパスワードか正しいか
パスワードが空でないか
これらをチェックするようにする
メールアドレスが空の場合
パスワードが空の場合
これらは、signu.phpからコードをコピペ
メールアドレスが空なのか判定するには
signu.phpにあった
ユーザー関数の
emailExists()を使う
ただ、これは、存在しているか調べるので
否定形式て
if(!emailExists($email,$dbh)){
$err[‘email’]=”このメールアドレスは登録されていません”;
}
とすればok
メールアドレスの形式が不正か調べるには
if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
$err[‘email’]=”メールアドレスの形式が正しくありません”;
}
とする
メールアドレスとパスワードがただしくない場合の処理は
まず、そういったユーザーがいるか調べる
$me = getUser($email,$password, $dbh);
で結果を変数へ格納
ちなみにgetUser()は
ユーザー関数
function getUser(){
}
て実装していく
また、エラーのチェックの場所が違うため
$err = array();
の下へ切り取って貼り付ける
そして、ユーザー関数
getUser()は
function getUser($email,$password,$dbh){
$sql=”select * from users where email = :email and :password = $password limit 1″;
$stmt = $dbh->prepare($sql);
$stmt->execute(array(“:email”=>$email,”:password”=>getSha1Password($password)));
$user = $stmt->fetch();
で取得した結果を $userへ格納
あとは、データの有無を
return $user ? $user :false;
として、データがあるなら
ユーザーを返し、ないならfalseを返す
これで、あとはifて判定する
if(!$me){
$err[‘password’]=”パスワードとメールアドレスが正しくありません”;
}
と表示する
$meは、getUser()て取得した内容が格納されている
また、もっと短くコードを書くには
if(!$me = getUser($email,$password,$dbh)){
$err[‘password’]=”メールアドレスとパスワードが正しくありません”;
}
というように
ifの条件式をまとめることもできる

ファイルの解析

ファイルの解析
http://www.byakuya-shobo.co.jp/hj/data/HJ2013_03_Q1.zip
から圧縮ファイルをダウンロード
Unzip HJ2013_03_Q1.zip
で解凍し
bin200
をだす
この拡張子もないファイルを解析していく
VMイメージのBT5R3 は
USキーボードなので
USキーボードと日本のキーボードの違い
http://www.nagasaki-gaigo.ac.jp/toguchi/pc/multilingual/keyboard_us_jis.htm
を見ながら行う
一番わかりにくいのは
全角、半角の切り替えキーが
shift + 全角半角 で ~
全角半角は` というバッククオートになるということ
USキーボード形式は全角半角はたしかに使うことがないと思う
だって英語圏だし
今回のこの問題に必要なスキルは
バイナリ解析系
まず、どんなファイルかを調べるため
file コマンドで調べる
file bin200
すると
bin200: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
となる
この結果から読み取れるのは
ELF 32-bit LSB executable, Intel 80386,
ということなので
IA32アーキテクチャの32bit Linux 用ELFファイルであること
このファイルのバイナリを静的解析して処理のあたりをみつける
使うのは
IDA Pro free 5.0
とはいっても使い方がわからないので検索
http://ameblo.jp/a-f-s-g/entry-11476490443.html
によれば vim でもバイナリエディタ代わりになるとのこと
vim bin200
でファイルを開いて
:%! xxd でバイナリが表示
使い方いまいちわからないので後にして今後の参考に
backtrack ida
で検索したら
http://www.byakuya-shobo.co.jp/hj/moh2/bt5_tools_list.html#p6

Reverse Engineering のところに
install ida-pro free
と有ったので
仮想マシンのBT5R3 で
startx で GUI画面にして
Applications > BackTrack > Reverse Engineering > ida-pro free
で起動
ただ、時間がなかったので
途中でキャンセルしたらインストールできなくなったため
次回。新しく仮想マシンを作りなおして実験
今回は
gdb という動的解析用デバッガーで
スタックとプログラムカウンター(EIPレジスター)
をいじくり
ptrace を経由せずに直接 GeneratePassword を実行する
まず
apt-get install gdb
でインストールして
gdb ./bin200 を行う
この時点ではまだ実行されていないので
break main
でブレークポイントの設置
しかし、次の gdbの使い方がわからないので
とりあえず
これの使い方を調べるところからになりそう

実践CTF模擬訓練の準備

実践CTF模擬訓練の準備
CTFで出題された問題が
Hacker Japan のサイトに公開されたり
リンクが貼られているので
これと
Hacker Japan (ハッカー ジャパン) 2013年 03月号 [雑誌]
の掲載されている内容を参考に実践
hacker japan の過去問のリンクは
http://www.byakuya-shobo.co.jp/hj/backnumber.html

HackerJapan2013年3月号
Q1 謎 のファイルを解析する
Q2 バラバラ画像パズル
Q3 不 審な通信を見つけ出せ!
Q4 マウスポインターが勝手に動く謎
Q5 間 抜けな暗号解読
Q6 JPG 画像の秘密
Q7 見 えないファイルを探せ
Q8 USB デバイス通信を調査
Q9 プ ログラムに隠された文字
のところから行える
解析に使うのは
すでにダウンロード済みの
BT5R3 を使う
ものによっては、windows も使用する

ログイン処理の実装

ログイン処理の実装
#12 ログイン処理を作っていこう
http://dotinstall.com/lessons/sns_php_v2/9612
を参考に
新規登録処理のあとのログイン処理について学習
その前に登録処理の動作確認
適当に名前、メールアドレス、パスワードを入力し
エラーがないのを確認したら
開発環境のサーバーで
mysql -u root -p
でログインして
use dotinstall_sns_php;
でDBを指定
select * from users;
として
今回登録したユーザが入っているならOK
また、パスワードについては暗号化されているのが確認できる
ここまでエラーが起きなければ
次のログイン処理になるけど
もしエラーが起きているのなら
HTTPステータスコード
http://www5.plala.or.jp/vaio0630/mail/st_code.htm
も見ながらデバッグする
デバッグ完了したら
login.php の編集
ソースがそのままなら
singup.php の
32行目あたりの
if ($_SERVER[‘REQUEST_METHOD’] != ‘POST’) {
から
86行目の if の終了あたりまでをコピーし
login.php の
if (!empty($_SESSION[‘me’])) {
header(‘Location: ‘.SITE_URL);
exit;
}
のしたあたりにペースト
内容はその後編集して
if ($_SERVER[‘REQUEST_METHOD’] != ‘POST’) {
// CSRF対策
setToken();
} else {
checkToken();
$email = $_POST[‘email’];
$password = $_POST[‘password’];
$dbh = connectDb();
$err = array();
if (empty($err)) {
}
}
となり、処理は新たに作成する
トークンチェックも行うので
singup.php から
<input type=”hidden” name=”token” value=”<?php echo h($_SESSION[‘token’]); ?>”>
をコピペし
login.php の
</form>
の上あたりに貼りつける
そして、signup.php で作ったユーザ関数は
今後も使うので
functions.php へコピーして
どのファイルからでも読み込んで使えるライブラリにする
書き込む場所は
function h($s){
}
のしたあたり

ユーザ登録の実装

ユーザ登録の実装
#11 ユーザーを登録しよう
http://dotinstall.com/lessons/sns_php_v2/9611
を参考にDBへユーザ情報を登録する方法を学習
singup.php を編集する
if(empty($err)){
}
の中に書いていく
登録はDBなので
$sql =”insert into users (name,email,passowrd,created,modified)
values(:name,:email,:password,now(),now())”;
としてSQLを変数へ格納する
$stmt =$dhb->prepare($sql);
として prepare() でSQLを実行
また、プレースホルダーを使うので、これにも prepare() を使う必要がある
$param = array(
“:name”=>$name,
“:email”=>$email,
“:password”=>getSha1Password($password)
);
password に関しては暗号化するので
getSha1Password($password)
としている
これは、セキュリティのことを考えてのこと
getSha1Password()
はユーザ関数
$stmt->execute($params);
でプレースホルダーにしたものを実行
終わったら、header() で指定した Location へ飛ばす
header(‘Location: ‘.SITE_URL.’.login.php’);
でログイン画面に飛ばす
ここまできたら、exit;
で正常終了
ユーザ関数の getSha1Password() は
function getSha1Password($s){
return sha1(PASSWORD_KEY.$s);
}
というようにして
config.php で指定している定数
PASSWORD_KEY と $s つまり
入力したパスワードをつなげて
sha1 で暗号化している

CTF 攻略ツール

CTF 攻略ツール
掲載されていたので。メモがわりにかいてみた
とりあえず、これだけは知っておいたほうがいいということなので
まず、ネットワーク解析として
wireshark
これはパケット解析の定番ツール
一般的にはIPパケットの解析につかう
wireshark でUSBのキャプチャーデータ解析などもある
コマンドライン系なら
tshark
次に、プログラム解析として
IDA
これは逆アセンブラソフト
フリーでも使えるけど
製品版になると複数のアーキテクチャ対応になる
ただし、かなり高額
製品版の IDA pro は使えそうにないので
objdump コマンドで逆アセンブル
デバッガーによるトレースができるようにしたいところ
objdump コマンドは linux のコマンドで
オブジェクトファイルの情報を表すけど
逆アセンブルにも使える
ただし、普通にインストールした状態だと
ネイティブアーキテクチャしか対応しないとのこと
複数アーキテクチャ対応にするには
binutils を使うことになる
次に、windows系のものだけど
WinDbj
これは MicroSoft製の windows 用デバッグツール
windows バイナリのメモりダンプするときに必要
あと、windows で使える無料デバッガとしてOllyDebg
ゲーム解析、改造するときの定番ツール
次にバイナリエディタ
これはプログラム海席次に必須ソフト
Bz
Stirling
HxD
などいろいろ
そして、仮想マシン環境
VMware
VirtualBox が結構有名
これは私も結構使っている
IA32ならこれだけで十分だけど
これ以外のアーキテクチャの ARMとかMIPSになると
QEMU が必要
そして、プログラミング言語環境
これはexploit を書いたり
簡単なデータパーサーをかくのに必要
そもそも開発環境がないとプログラミングできないし
国内外のCTF解説によれば pythonが多いらしい
これである程度のスクリプトが書ける程度のスキルは必須
また、PHPもマスターして環境の構築も必要
python ,PHP を開始するには
ドットインストールで無料で学習できるので
未経験の場合は参考にするとわかりやすい
そして、web 関連
javascript 実行環境
Paros などのデバッグ環境を用意しておく
web ブラウザーで
chromeとか firefox でアドオンとか
デベロッパーツールなどが使えるとやりやすいかもしれない
そして、Linux 環境
とりあえず、CTF関連を行うなら
backtrack 5 や kalilinux などを使えるようにしておく
Linux 未経験の場合、ubuntu あたりを
vmware や virtualbox など仮想マシンで体験するとよいかも
サーバー構築関連を学ぶなら
最近では ubuntu が多いけど
centOS が結構情報が多い
Linux 関連の雑誌で
日経Linux とか Ubuntu Magazine とか見ると
わかりやすい
あと、Linux100%などで、どんなものか使ってみるという方法もある
Linux でファイルの素性を知るために
file コマンドを使ったり
文字列抽出のために strings コマンドを使うこともある
そして、チーム参戦になるので
情報共有システムもほしいところ
wiki レンタルサービスをつかうか
wikiシステム構築になるけど
システムを構築してしまったほうがいいと思う
wiki 関連のシステムは
pukiwiki とか mediawiki などで
ローカルに wiki 環境の構築が可能なので
興味があれば構築すると面白いかもしれない
また、リアルタイム情報交換にはIRCなどのシステム構築が必要
事前準備などの場合は
掲示板とかグループウェアなどもよいらしい
また、インターネット接続環境については
普通に外部アクセスする環境と
課題を解くために必要なもう1つのネット環境が必要になる
これはDEFCON予選問題の中に
NAPTでない環境からの接続を前提とした問題があったため
このため普通にルータ経由でNAPTで接続する環境
そしてグローバルIPが使える環境
が必要になりそう