绕过空白过滤
<?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']))
{
$info="sorry, you cann't input a number!";
}
elseif($req['number']!=strval(($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;
鸣谢:bowu678项目 https://github.com/bowu678/php_bugs
is_numeric():判断是否为数字
intval():取整数
strval():取反
addslashes:反斜杠引用
逻辑为:
1、要求number不是数字。
2、要求number过滤前是数字(且为整数)。
3、要求number过滤后是回文数。
4、要求number不是回文数。
(出这种的是不是变态?)
所以访问:http://localhost/filter.php?number= 131
(%00为空格截断,%0c为/f转义符)
鸣谢:bowu678项目 https://github.com/bowu678/php_bugs