16-09-02

本日のコード(1)[Ruby]

class A; end

# クラスAはClassクラスのインスタンスなので
puts A.instance_of? Class    # true

# 以下はクラスメソッド定義となる
A.instance_exec do
  def class_method() :class_method_of_A end
end
puts A.class_method

# 以下はクラス定義域内でメソッドを定義している
# (通常のクラス定義域で行うことをブロック内で行う)
# (module_evalはclass_evalの別名)
A.class_eval do
  def instance_method() :instance_method_of_A end
end
puts A.new.instance_method

本日のコード(2)[MongoDB,PHP]

MongoDBにデータを用意する。

/* データベースを選択 */
use under23

/* データの挿入 */
db.team.insert({name: "oshima", age: 10, position: "mf"})
db.team.insert({name: "endo", age: 15, position: "dmf"})
db.team.insert({name: "yajima", age: 17, position: "rmf"})
db.team.insert({name: "asano", age: 19, position: "cf"})

/* ドキュメント(レコード)を取得 */
db.team.find()

/* フィールド(カラム)値から検索 */
db.team.find({position: "dmf"})

PHPからドキュメント(レコード)を取得する。

<?php
/* mongodコマンドを実行しておく */
$s = "mongodb://localhost:27017";
$m = new MongoDB\Driver\Manager($s);
$query = new MongoDB\Driver\Query([]);
$rows = $m->executeQuery("under23.team", $query);
foreach ($rows as $row) {
    echo $row->name . " : " . $row->position . "\n";
}
/*
=>
oshima : mf
endo : dmf
yajima : rmf
asano : cf
*/
?>

条件を指定して検索。

<?php
/* DBに接続済み */
$filter = ["age" => ['$lte' => 15]];    /* under 15 */
//$filter = ["name" => "endo"];
$query = new MongoDB\Driver\Query($filter);
$cur = $m->executeQuery("under23.team", $query);

/* ドキュメントが取得できれば表示する */
$docs = $cur->toArray();    /* この時点でフェッチしている */
if (!empty($docs)) {
    foreach ($docs as $player) {
        echo $player->name . " (" . $player->age . ") [" . 
            $player->position . "]\n";
    }
}
/*
=>
oshima (10) [mf]
endo (15) [dmf]
*/
?>

IceCTF-chainedIn-75では、フィルターの部分を

<?php
/* name != 1 の意味になる */
$filter = ["name" => ['$ne' => 1]];
?>

のようにできることを利用しており、以上のようにすると
ドキュメントが全件(1という値のものがない限り)
取得されてしまう。従って、不適切な演算子を受け付けないよう
チェック用のコードを本来なら書く必要がある、というものだった。
(検索の対象となるカラムが許容できる(悪用されない)演算子
個別に指定することになる?)

Write-upを読んだ(途中)

IceCTF-2016 : imgblog-130

セッションハイジャック(その他含む)問題。