ApachePHP/5.4.45数组绕过

0x01 源码

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

num传入数组,preg_match()函数获得的参数为数组而不是字符串生成警告,并返回0,if匹配失败。intval()函数对非空的 array 返回 1,if匹配成功。

0x02 Payload

  1. ?num[]=10

0x03 PHP preg_match()函数信息泄露漏洞

受影响系统:

PHP PHP <= 5.3

描述:

PHP所使用的preg_match()函数从用户输入字符串获得参数,如果所传送的值为数组而不是字符串就会生成警告,警告消息中包含有当前运行脚本的完整路径。

  1. Warning: preg_match() expects parameter 2 to be string, array given in /var/www/html/index.php on line 20

0x04 PHP函数

1.preg_match

preg_match — 执行匹配正则表达式

  1. preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) : int

搜索subjectpattern给定的正则表达式的一个匹配.

参数

pattern
要搜索的模式,字符串类型。
subject
输入字符串。

返回值

preg_match()返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索。preg_match_all()不同于此,它会一直搜索subject 直到到达结尾。 如果发生错误preg_match()返回 **FALSE**

2.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,虽然取决于字符串最左侧的字符。 使用 整型转换 的共同规则。