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 参数,那么会用命令执行的输出填充此数组,每行输出填充数组中的一个元素。数组中的数据不包含行尾的空白字符,例如 \n 字符。请注意,如果数组中已经包含了部分元素,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

未完,持续更新

PHP代码审计学习-php安全基础的更多相关文章

  1. 这几天开始,先学习一些 java 基础吧,学的有点累

    这几天开始,先学习一些 java 基础吧,学的有点累

  2. Emacs学习心得之 基础配置

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Emacs学习心得之 基础配置 1.前言2.基础配置 一.前言 本篇博文记录了Emacs的一 ...

  3. Emacs学习心得之 基础操作

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Emacs学习心得之 基础操作 1.前言与学习计划2.Emacs基础操作 一. 前言与学习计 ...

  4. 如何学习FPGA?FPGA学习必备的基础知识

    如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA   基础知识       FPGA已成为现今的技术热点之一,无论学生还是工程师都希望 ...

  5. java与.net比较学习系列(2) 基础语言要素

    这一篇从最基础的开始对比总结,说起基础语言要素,故名思义,就是学习语言的基础,主要内容包括标识符,关键字和注释.我想从以下几点进行总结,有区别的地方有都使用红色粗体字进行了总结. 1,标识符 2,关键 ...

  6. MyBatis:学习笔记(1)——基础知识

    MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...

  7. bootstrap学习笔记之基础导航条 http://www.imooc.com/code/3111

    基础导航条 在Bootstrap框中,导航条和导航从外观上差别不是太多,但在实际使用中导航条要比导航复杂得多.我们先来看导航条中最基础的一个--基础导航条. 使用方法: 在制作一个基础导航条时,主要分 ...

  8. AJAX学习前奏----JS基础加强

     AJAX学习前奏----JS基础加强 知识概要: 1.js类&属性&方法的定义 2.静态属性与方法 3.构造方法 4.原型的使用 5.Object对象直接加属性和方法 6.JSO ...

  9. 大数据学习之Linux基础01

    大数据学习之Linux基础 01:Linux简介 linux是一种自由和开放源代码的类UNIX操作系统.该操作系统的内核由林纳斯·托瓦兹 在1991年10月5日首次发布.,在加上用户空间的应用程序之后 ...

随机推荐

  1. JZOJ5384. 【NOIP2017提高A组模拟9.23】四维世界

    题目 Description 众所周知,我们常感受的世界是三维的. Polycarp突然对四维空间产生了兴趣,他想对四维空间进行一些研究.但是在此之前,他必须先对三维世界了解透彻. 于是Polycar ...

  2. 关于个人项目(臻美MV【仿抖音App】)滑动切换视频的分析(前端角度)

    我们知道你天天刷抖音的时候可以上滑切换视频,互不影响.那么我们站在前端的角度能否可以实现这种效果呢?这是我的个人项目:臻美MV 下面我是用Vue写的,现在我把它开源. Vue: 初始界面 <te ...

  3. kali 无线网络渗透测试

    一.无线网络渗透嗅探工具Kismet 如果要进行无线网络渗透测试,则必须先扫描所有有效的无线接入点.在Kali linux中,提供了一款嗅探无线网络工具Kismet.使用该工具可以测量周围的无线信号, ...

  4. 理解 Python 的 for 循环

    在本篇博客中,我们将讨论 Python 中 for 循环的原理. 我们将从一组基本例子和它的语法开始,还将讨论与 for 循环关联的 else 代码块的用处. 然后我们将介绍迭代对象.迭代器和迭代器协 ...

  5. Min-max 容斥与 kth 容斥

    期望的线性性: \[E(x+y)=E(x)+E(y) \] 证明: \[E(x+y)=\sum_i \sum_j(i+j)*P(i=x,j=y) \] \[=\sum_i\sum_ji*P(i=x,j ...

  6. 通过memberlist库实现gossip管理集群以及集群数据交互

    通过memberlist库实现gossip管理集群以及集群数据交互 概述 memberlist库的简单用法如下,注意下面使用for循环来执行list.Join,原因是一开始各节点都没有runing,直 ...

  7. day07 聊天室-1_集合

    聊天室(续) 实现服务端发送消息给客户端 在服务端通过Socket获取输出流,客户端获取输入流,实现服务端将消息发送给客户端. 这里让服务端直接将客户端发送过来的消息再回复给客户端来进行测试. 服务端 ...

  8. 科学计算库Numpy基础&提升(理解+重要函数讲解)

    Intro 对于同样的数值计算任务,使用numpy比直接编写python代码实现 优点: 代码更简洁: numpy直接以数组.矩阵为粒度计算并且支持大量的数学函数,而python需要用for循环从底层 ...

  9. Page和list的区别 mybatis

    先看一段代码 点击查看代码 @Override public Result findUserPage(PageParam pageParam) { Page<SysUser> page = ...

  10. 算法竞赛进阶指南——0x15 字符串学习笔记

    K M P模式匹配 #include <bits/stdc++.h> using namespace std; #define N 100 char s[N]; char m[N]; in ...