啥都不说,抓包发现了猫腻,访问文件:
<?php
$info = "";
$req = [];
$flag="xxxxxxxxxx";
ini_set("display_error", false);
error_reporting(0);
if(!isset($_POST['number'])){
header("hint:6c525af4059b4fe7d8c33a.txt");
die("have a fun!!");
}
foreach([$_POST] as $global_var) {
foreach($global_var as $key => $value) {
$value = trim($value);
is_string($value) && $req[$key] = addslashes($value);
}
}
function is_palindrome_number($number) {
$number = strval($number);
$i = 0;
$j = strlen($number) - 1;
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(intval($req['number']))){
$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;
1.ini_set — 为一个配置选项设置值,设置指定配置选项的值。这个选项会在脚本运行时保持新的值,并在脚本结束时恢复。
display_errors
该选项设置是否将错误信息作为输出的一部分显示到屏幕,或者对用户隐藏而不显示。
2.禁用错误报告,也就是不显示错误
error_reporting(0);
3.
foreach有两种语法:
第一种:遍历给定的 数组语句 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。
foreach (array_expression as $value)
第二种:同上,同时当前单元的键名也会在每次循环中被赋给变量 $key。
foreach (array_expression as $key => $value)
那么他两个的区别在哪里?我们直接上例子:
$a = array('Tom','Mary','Peter','Jack');
我们用第一种foreach方法来输出。
foreach ($a as $value) {
echo $value."<br/>";
}
最后得到的结果是:
Tom
Mary
Peter
Jack
我们用第二种 foreach 方法来输出。
foreach ($a as $key => $value) {
echo $key.','.$value."<br/>";
}
最后得到的结果是:
0,Tom
1,Mary
2,Peter
3,Jack
无论是一维数组还是二维数组,他们的区别就是第二种情况会在值前面加一个序号。
我们举个例子:
第一种输出
$c = array(
array('1','Tom'),
array('2','Mary'),
array('3','Peter'),
array('4','Jack')
);
得到这样的结果:
Array ( [0] => 11 [1] => Tom )
Array ( [0] => 22 [1] => Mary )
Array ( [0] => 33 [1] => Peter )
Array ( [0] => 44 [1] => Jack )
第二种输出:
foreach ($c as $key => $value) {
echo '$key='.$key."<br/>";
print_r($value);
echo "<br/>";
}
$key=0
Array ( [0] => 11 [1] => Tom )
$key=1
Array ( [0] => 22 [1] => Mary )
$key=2
Array ( [0] => 33 [1] => Peter )
$key=3
Array ( [0] => 44 [1] => Jack )
strval(mixed pre)
功能:获取变量的字符串值
参数:只有一个,$ pre为任何数据类型的变量
返回值:类型(字符型),返回一个变量的字符串形式
5.addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
单引号(’)
双引号(")
反斜杠(\)
NULL
function is_palindrome_number($number) {
$number = strval($number);
$i = 0;
$j = strlen($number) - 1;
while($i < $j) {
if($number[$i] !== $number[$j]) {
return false;
}
$i++;
$j--;
}
return true;
}
以上代码的作用是:
对于number这个变量我们,把他的第一位与最后一位比较,以此类推。
7.intval() 函数用于获取变量的整数值。
if(is_numeric($_REQUEST['number'])){
//不能是数字
$info="sorry, you cann't input a number!";
}elseif($req['number']!=strval(intval($req['number']))){
//不能是数字,而且是number取整数之后不能等于它本身。
$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{ //不是palindrome数字
$info=$flag;
}
}
}
所以我们要的到flag就必须满足:
1.不能是数字
2.字符串翻转之后必须相等,要注意是翻转的整数值相等,不是说必须要翻转的整数相等。
3.不是palindrome数字(第一个数字与最后一个数字不相等)
比如:
02000%20
%20url编码是空格
1.他不是数字
2.正向翻转2,反向也为2
3.不是回文数字