0x01 源码
<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if(preg_match("/[0-9]/", $num)){
die("no no no!");
}
if(intval($num)){
echo $flag;
}
}
num传入数组,preg_match()函数获得的参数为数组而不是字符串生成警告,并返回0,if匹配失败。intval()函数对非空的 array 返回 1,if匹配成功。
0x02 Payload
?num[]=10
0x03 PHP preg_match()函数信息泄露漏洞
受影响系统:
描述:
PHP所使用的preg_match()函数从用户输入字符串获得参数,如果所传送的值为数组而不是字符串就会生成警告,警告消息中包含有当前运行脚本的完整路径。
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 — 执行匹配正则表达式
preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) : int
搜索subject
与pattern
给定的正则表达式的一个匹配.
参数
pattern
要搜索的模式,字符串类型。subject
输入字符串。
返回值
preg_match()返回 pattern
的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索。preg_match_all()不同于此,它会一直搜索subject
直到到达结尾。 如果发生错误preg_match()返回 **FALSE**
。
2.intval
intval — 获取变量的整数值
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,虽然取决于字符串最左侧的字符。 使用 整型转换 的共同规则。