<?PHP
$flag='xxx';
extract($_GET);
if(isset($shiyan))
{
$content=trim(file_get_contents($flag));//将读取$flag内容并去除左右空白后保存到$content
if($shiyan==$content)
{
echo'ctf{xxx}';
}
else
{
echo'Oh.no';
}
}
?>
重要点为$shiyan==$content
只要满足这个条件就可以获取flag。
首先extract()
函数的作用为从数组将变量导入到当前符号表,也就是说我们如果构造
xxx.com/index.php?$shiyan=1
则会生成一个名字为$shiyan
的变量,值为1。
然后通过isset
函数来判断刚生成的$shiyan
变量是否为null,如果为null就进入判断。
$content
变量则是通过file_get_contents
函数和trim
函数来读取文件,但是此时它所读取的文件$flag
值为xxx,此时这个目录是不存在的,所以它的值为空。
所以我们此时要做的就是将$shiyan
的值变为空即可。
所以构造链接xxx.com/index.php?$shiyan=&flag=1
即可获得ctf{xxx}
绕过过滤空白字符
<?php
$info = "";
$req = [];
$flag="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
ini_set("display_error", false); //为一个配置选项设置值
error_reporting(0); //关闭所有PHP错误报告
if(!isset($_GET['number'])){
header("hint:26966dc52e85af40f59b4fe73D8c323a.txt"); //Http头显示hint 26966dc52e85af40f59b4fe73d8c323a.txt
die("have a fun!!"); //die — 等同于 exit()
}
foreach([$_GET, $_POST] as $global_var) {//foreach 语法结构提供了遍历数组的简单方式
foreach($global_var as $key => $value) {
$value = trim($value);//trim — 去除字符串首尾处的空白字符(或者其他字符)
is_string($value) && $req[$key] = addslashes($value); // is_string — 检测变量是否是字符串,addslashes — 使用反斜线引用字符串
}
}
function is_palindrome_number($number) {
$number = strval($number); //strval — 获取变量的字符串值
$i = 0;
$j = strlen($number) - 1; //strlen — 获取字符串长度
while($i < $j) {
if($number[$i] !== $number[$j]) {
return false;
}
$i++;
$j--;
}
return true;
}
if(is_numeric($_REQUEST['number'])) //is_numeric — 检测变量是否为数字或数字字符串
{
$info="sorry, you cann't input a number!";
}
elseif($req['number']!=strval(intval($req['number']))) //intval — 获取变量的整数值
{
$info = "number must be equal to it's integer!! ";
}
else
{
$value1 = intval($req["number"]);
$value2 = intval(strrev($req["number"]));
if($value1!=$value2){
$info="no, this is not a palindrome number!";
}
else
{
if(is_palindrome_number($req["number"])){
$info = "nice! {$value1} is a palindrome number!";
}
else
{
$info=$flag;
}
}
}
echo $info;
根据代码判断,它需要满足多个条件才可以执行$info=$flag;
之后echo出来的才是flag。
if(is_numeric($_REQUEST['number'])) //is_numeric — 检测变量是否为数字或数字字符串
{
$info="sorry, you cann't input a number!";
}
先来看看第一个条件,它要求number参数传入的内容不能为数字,否则返回sorry, you cann't input a number!
但是它的第二个要求为数字必须为整数,否则输出number must be equal to it's integer!!
elseif($req['number']!=strval(intval($req['number']))) //intval — 获取变量的整数值
{
$info = "number must be equal to it's integer!! ";
}
导致我们输入字符串也会报错
这里我们用到%00来绕过is_numeric
函数的判断。
根据报错,再来看看$value1
,它是$req["number"]
的整数值,$value2
则为反转之后的$req["number"]
的整数值。
$value1 = intval($req["number"]);
$value2 = intval(strrev($req["number"]));
if($value1!=$value2){
$info="no, this is not a palindrome number!";
}
所以第三步要满足的条件为,它必须为回文数即从左往右和从右往左读取都要相同的数值,所以我们构造如下