空白字符截断

0x00

$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; ?> 解析: 可以看出拿到flag条件:

  • number = intval(strval(number))
  • intval(number) = intval(strrev(number))
  • number is not a palindrome
  • Number must be a string(字符串型数字也不行)

PS:原题中并没有④if(is_numeric($_REQUEST[‘number’]))这一句,这句话限制了我们的输入不能是整数,也就是说不能利用intval函数的整数溢出或者是php浮点数机制来解题,但是从学习角度讲,还是mark一下这两种方法 解法一 看起来第二个条件和第三个条件冲突 intval函数参数有最大值限制,超过最大限制返回一个固定的最大值,number只要超过这个最大值即可 http://php.net/manual/zh/function.intval.php 详见php手册 9223372036854775807是intval函数中规定参数的最大值,因为其回文明显小于最大值,所以我们在前面加一个0 ,即可绕过前三个条件 payload:http://………/?number=09223372036854775807 解法二 先来看一个代码 发现php浮点书在小数点后第16位就忽略不计了,这和php内部存储浮点数的机制有关.所以我们构造浮点数1000000000000000.00000000000000010,即可绕过前三个条件 payload:http://………/?number=1000000000000000.00000000000000010 解法三 针对本题添加的第三个条件,限制了输入变量不能为纯数字,所以前两个方法就都用不了了。 这里涉及到php【数字类】函数的一个特点,例如is_numeric,intval。他们在判断的时候会跳过空白字符例如\n\t\f\r\v。所以利用这个特性可以跳过数字类函数,也避免了回文。注意,trim去除两侧空白字符的时候是不会去除\f的,所以添加一个\f即可。 payload:http://………/?number=121%0c %0c的urldecode为\f

  • 本文作者: 安大侠
  • 本文链接: 13.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!