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的值给覆盖掉。

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

  • 相关阅读:
    Session
    python内存优化机制中的小秘密
    跨域请求
    Cookie
    json
    Python深浅拷贝辨析
    Django form组件相关
    Python 中的 if __name__ == '__main__'
    online_judge_1108
    online_judge_1107
  • 原文地址:https://www.cnblogs.com/-chenxs/p/11461475.html
Copyright © 2011-2022 走看看