zoukankan      html  css  js  c++  java
  • 遇到的基础php函数、方法

    0x01 PHP file() 函数

    file() 函数把整个文件读入一个数组中。

    数组中的每个元素都是文件中相应的一行,包括换行符在内。

    实例:

    <?php
    print_r(file("test.txt"));
    ?>

    上面的代码将输出:

    Array
    (
    [0] => Hello World. Testing testing!
    [1] => Another day, another line.
    [2] => If the array picks up this line,
    [3] => then is it a pickup line?
    )

    0x02PHP print_r() 函数

    print_r() 函数用于打印变量,以更容易理解的形式展示。

    PHP 版本要求: PHP 4, PHP 5, PHP 7

    实例:

    <?php
    $a = array ('a' => 'apple', 'b' => 'banana', 'c' => array ('x','y','z'));
    print_r ($a);
    ?>

    输出结果为:

    Array
    (
        [a] => apple
        [b] => banana
        [c] => Array
            (
                [0] => x
                [1] => y
                [2] => z
            )
    
    )

    0x03 php函数system(),exec(),passthru()的区别

    php提供了system(),exec(),passthru()这几个函数来调用外部的命令.

    区别: 
    system() 输出并返回最后一行shell结果。 
    exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。 
    passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。 
    相同点:都可以获得命令执行的状态码

    0x04 php eval函数

    eval() 函数把字符串按照 PHP 代码来计算。 该字符串必须是合法的 PHP 代码,且必须以分号结尾。

    例如:

    eval("echo'hello world';");
    上边代码等同于下边的代码:
    echo"hello world";

    在浏览器中都输出:hello world
    1.eval函数的参数的字符串末尾一定要有分号,在最后还要另加一个分号(这个分号是php限制)

    2.注意在命令式字符串(包括分号)两边必须要有双引号或者根据需要用单引号。否则报错。 命令式字符串是指:字符串中包括echo、print之类的命令的时候。 如果参数只有一个变量则可以不用。

    3.注意单引号,双引号和反斜杠的运用。如果参数中带有变量时,并且变量有赋值操作的话,变量前的$符号钱一定要有来转义。如果没有赋值操作可以不需要。

    @ 放在函数前有屏蔽出错信息的作用。

    0x05 PHP file_get_contents() 函数

    file_get_contents() 把整个文件读入一个字符串中。

    该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。

    实例:

    <?php
    echo file_get_contents("test.txt");
    ?>

    上面的代码将输出:

    This is a test file with test text.

    容易造成伪协议与文件包含

    0x06 PHP的get_defined_functions()函数

    列出所有函数

    php内置函数和自己定义的所有函数

    print_r(get_defined_functions());

    0x07 PHP中的array_merge()函数与array+array的区别

    在PHP中可以使用array_merge函数和两个数组相加array+array的方式进行数组合并,但两者效果并不相同,下面为大家介绍两者具体的使用区别.

    区别如下:

     1、当下标为数值时,array_merge()不会覆盖掉原来的值,但array+array合并数组则会把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉(不是覆盖). 

    2、当下标为字符时,array+array仍然把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉,但array_merge()此时会覆盖掉前面相同键名的值. 

    例子:

    $arr1 = ['PHP', 'apache'];
    $arr2 = ['PHP', 'MySQl', 'HTML', 'CSS'];
    $mergeArr = array_merge($arr1, $arr2);
    $plusArr = $arr1 + $arr2;
    var_dump($mergeArr);
    var_dump($plusArr);

    结果:

    $mergeArrarray (size=6)
      0 => string 'PHP' (length=3)
      1 => string 'apache' (length=5)
      2 => string 'PHP' (length=3)
      3 => string 'MySQl' (length=5)
      4 => string 'HTML' (length=4)
      5 => string 'CSS' (length=3)
    
    $plusArrarray (size=4)
      0 => string 'PHP' (length=3)
      1 => string 'apache' (length=5)
      2 => string 'HTML' (length=4)
      3 => string 'CSS' (length=3

    0x08 PHP中的include()函数

    include()语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。

    <?php include 'filename'; ?>
    <?php include("dbconnect.php");
    ?>

    require语句和include的功能是相同的,只是在错误处理方面不一样。

    require 会生成致命错误(E_COMPILE_ERROR)并停止脚本。

    include 只生成警告(E_WARNING),并且脚本会继续。

    容易造成文件包含

    0x09 PHP中的die()函数

    die() 函数输出一条消息,并退出当前脚本。

    该函数是 exit() 函数的别名。

    die(status)

    0x10 PHP中preg_replace() 函数

    preg_replace 函数执行一个正则表达式的搜索和替换。

    就是php中的匹配正则的函数

    例如

    <?php
    $string = 'google 123, 456';
    $pattern = '/(w+) (d+), (d+)/i';
    $replacement = 'runoob ${2},$3';
    echo preg_replace($pattern, $replacement, $string);
    ?>

    执行结果如下所示:

    runoob 123,456

    ctf中可以利用其存在的”/e“漏洞,函数的第一个参数的值为”/(.*)/e“即可造成第二个参数的代码执行。

    0x11 PHP中var_dump() 函数

    var_dump() 函数用于输出变量的相关信息。

    var_dump() 函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

    CTF中配合超级全局变量GLOBALS使用,将全局变量里面的结构和值给输出来。

    0x12 PHP中strstr()、substr()、str_replace() 函数

    strstr() 函数搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE。区分大小写

    查找 "world" 在 "Hello world!" 中是否存在,如果是,返回该字符串及后面剩余部分:
    <?php
    echo strstr("Hello world!","world");  // 输出 world!
    ?>

    substr() 函数返回字符串的一部分。字符串0索引开始,后面的值代表从哪个索引开始截取

    从字符串中的索引6截取后面的字符串,即返回 "world"<?php
    echo substr("Hello world",6);
    ?>

    str_replace() 函数替换字符串中的一些字符(区分大小写)。

    把字符串 "Hello world!" 中的字符 "world" 替换成 "Peter"<?php
    echo str_replace("world","Peter","Hello world!");
    ?>
    //输出Hello Peter!
    这里可以用双写绕过

    0x13 PHP中$_SERVER['REQUEST_URI'] 变量

    SERVER['REQUEST_URI']:访问此页面所需的 URI 。

    例如:http://www.5idev.com/php/index.php/test/foo?username=hbolive

    $_SERVER['REQUEST_URI'] 得到:/php/index.php/test/foo?username=hbolive

    0x14 PHP中的parse_str() 函数

    parse_str() 函数把查询字符串解析到变量中。

    <?php
    parse_str("name=Peter&age=43");
    echo $name."<br>";
    echo $age;
    ?>
    //字符串name已经变为变量,且值为Peter,输入为Peter和43

    这个函数可造成变量覆盖漏洞,如果前面有一个$name变量,那么用来了这个函数之后,就将以前的$name变量给覆盖了,且值为Peter。

    0x14 PHP中的strcmp()函数

    strcmp() 函数比较两个字符串,且区分大小写

        0 - 如果两个字符串相等
        <0 - 如果 string1 小于 string2
        >0 - 如果 string1 大于 string2

    这个函数有个漏洞

    就是只要一个字符属于数组或其他类型的,就会始终返回0

    例如strcmp($st[]="admin",$flag)

    0x14 PHP中的sha1()函数

    计算字符串的hash值

    在ctf中,如果遇到使两个变量的hash值相等,那么把两个变量定义成数组,因为数组的哈希值相等。

    例如:bugku中的 各种绕过

    0x15 PHP中的unserialize()函数和serialize()函数

    serialize()函数是将字符串序列化,而unserialize()则是将序列化的字符反序列化为字符串。

    如果要查询某个字符串的序列化字符,可以在本机上敲php代码加上serialize()函数,让其print输出就行。

    0x16 parse_url函数

    作用:parse_url — 解析 URL,返回其组成部分

    parse_url($_SERVER['REQUEST_URI']);

    获取请求的url所有的组成部分。

    对严重不合格的 URL,parse_url() 可能会返回 FALSE (CTF常用 返回值False 用于逃逸判断)

    加入url为:http://127.0.0.1/test/baby.php?id=1&love=flag.php
    在test前敲“///”就会匹配为false,这样可以绕过很多对请求变量的正则过滤。
    http://127.0.0.1///test/baby.php?id=1&love=flag.php

    0x17 parse_str()函数

    parse_str() 函数用于把查询字符串解析到变量中,如果没有array 参数,则由该函数设置的变量将覆盖已存在的同名变量。 极度不建议 在没有 array参数的情况下使用此函数,并且在 PHP 7.2 中将废弃不设置参数的行为。此函数没有返回值

    @parse_str($id)把查询字符串解析到变量中,没有使用array选项,若有同名变量,将原来的覆盖。这里明显将原来的$a的值给覆盖掉。

    这就可能造成了变量覆盖漏洞。

  • 相关阅读:
    数据库字段太多,批量快速建立实体类方法(适合大量字段建立实体类)
    SQL service 中的 ”输入SQL命令窗口“ 打开了 “属性界面” 回到 ”输入SQL命令窗口“
    计算机软件编程英语词汇集锦
    编程常用英语词汇
    svn上传和下载项目
    当启动tomcat时出现tomcat setting should be set in tomcat preference page
    Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor
    eclipse中选中一个单词 其他相同的也被选中 怎么设置
    Spring Boot的@SpringBootApplication无法引入的问题
    最全的SpringCloud视频教程
  • 原文地址:https://www.cnblogs.com/-chenxs/p/11461475.html
Copyright © 2011-2022 走看看