zoukankan      html  css  js  c++  java
  • PHP代码审计学习-php安全基础

    PHP代码审计-php安全基础

    php.ini选项

    register_globals

    php>=4.2.0,php.ini 的 register_globals 选项的默认值预设为 Off,当 register_globals 的设定为 On 时,程序可以接收来自服务器的各种环境变量,包括表单提交的变量,而且由于 PHP不必事先初始化变量的值,从而导致很大的安全隐患。

    实例1

    //ex1.php
    <?php
    if (check_admin())
    {
    $is_admin = true;
    }
    if ($is_admin)
    {
    do_something();
    }
    ?>
    

    当register_globals = on,$is_admin没有初始化为FLASE,这时候提交 http://www.test.com/ex1.php?is_admin=true,就可以绕过 check_admin()的验证。

    实例2

    //ex2.php
    <?php
    if (isset($_SESSION["username"]))
    {
    do_something();
    }
    else
    {
    echo "您尚未登录!";
    }
    ?>
    

    当 register_globals=On 时 ,我们提交http://www.sectop.com/ex2.php?_SESSION[username]=dodo,就具有了此用户的权限

    所以不管 register_globals 为什么,我们都要记住,对于任何传输的数据要经过仔细验证,变量要初始化。

    safe_mode

    安全模式,PHP 用来限制文档的存取、限制环境变量的存取,控制外部程序的执行。启用

    安全模式必须设置 php.ini 中的 safe_mode = On

    1、限制文件存取

    safe_mode_include_dir = "/path1:/path2:/path3"

    不同的文件夹用冒号隔开

    2、限制环境变量的存取

    safe_mode_allowed_env_vars = string

    指定 PHP 程序可以改变的环境变量的前缀,如:safe_mode_allowed_env_vars = PHP_ ,当这个

    选项的值为空时,那么 php 可以改变任何环境变量

    safe_mode_protected_env_vars = string

    用来指定 php 程序不可改变的环境变量的前缀

    3、限制外部程序的执行

    safe_mode_exec_dir = string

    此选项指定的文件夹路径影响 system、exec、popen、passthru,不影响 shell_exec 和“ ”。

    disable_functions = string

    不同的函数名称用逗号隔开,此选项不受安全模式影响

    magic quotes

    用来让 php 程序的输入信息自动转义,所有的单引号(“'”),双引号(“"”),反斜杠(“”)和空字符(NULL),都自动被加上反斜杠进行转义

    magic_quotes_gpc = On 用来设置 magic quotes 为 On,它会影响 HTTP 请求的数据(GET、POST、Cookies)

    程序员也可以使用 addslashes 来转义提交的 HTTP 请求数据,或者用 stripslashes 来删除转义

    命令注入攻击

    system

    https://www.php.net/manual/zh/function.system.php

    string system(string command, int &return_var)

    • command

      ​ 要执行的命令。

    • return_var

      ​ 如果提供 return_var 参数,则外部命令执行后的返回状态将会被设置到此变量中。

    实例

    //ex1.php
    <?php
    $dir = $_GET["dir"];
    if (isset($dir))
    {
    echo "<pre>";
    system("ls -al ".$dir);
    echo "</pre>";
    }
    ?>
    

    我们提交 http://www.sectop.com/ex1.php?dir=| cat /etc/passwd

    提交以后,命令变成了 system("ls -al | cat /etc/passwd");

    exec

    https://www.php.net/manual/zh/function.exec.php

    string exec (string command, array &output, int &return_var)

    • command

      ​ 要执行的命令。

    • output

      ​ 如果提供了 output 参数,那么会用命令执行的输出填充此数组,每行输出填充数组中的一个元素。数组中的数据不包含行尾的空白字符,例如 字符。请注意,如果数组中已经包含了部分元素,exec()函数会在数组末尾追加内容。如果你不想在数组末尾进行追加,请在传入 exec() 函数之前 对数组使用 unset() 函数进行重置。

    • return_var

      ​ 如果同时提供outputreturn_var` 参数,命令执行后的返回状态会被写入到此变量。

    passthru

    https://www.php.net/manual/zh/function.passthru.php

    ​ 当所执行的 Unix 命令输出二进制数据,并且需要直接传送到浏览器的时候,需要用此函数来替代 exec()system() 函数。常用来执行诸如 pbmplus 之类的可以直接输出图像流的命令。通过设置 Content-type 为 image/gif,然后调用 pbmplus 程序输出 gif 文件,就可以从 PHP 脚本中直接输出图像到浏览器。

    void passthru (string command, int &return_var)

    • command

      ​ 要执行的命令。

    • return_var

      ​ 如果提供 return_var 参数,Unix 命令的返回状态会被记录到此参数。

    shell_exec

    https://www.php.net/manual/zh/function.shell-exec.php

    string shell_exec (string command)

    • command

      ​ 要执行的命令。

    一些函数

    isset

    (PHP 4, PHP 5, PHP 7)

    isset — 检测变量是否已设置并且非 null

    返回值

    如果 var 存在并且值不是 null 则返回 true,否则返回 false

    Session

    PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。

    https://www.runoob.com/php/php-sessions.html

    未完,持续更新

  • 相关阅读:
    POJ1006: 中国剩余定理的完美演绎(非原创)
    poj 1001 分析
    document.createElement()的用法
    js innertext
    转csdn-css4
    css中最基本几个选择器
    Django解决(1146, "Table 'd42.django_session' doesn't exist")方法
    django清理migration终极解决办法
    linux中的fork炸弹
    nginx转发php文件到php-fpm服务器提示502错误
  • 原文地址:https://www.cnblogs.com/Secde0/p/14256246.html
Copyright © 2011-2022 走看看