系统命令注入

我们有时候写代码会用php脚本去调用系统函数完成业务功能,但是一些系统函数属于高危操作,一旦被webshell或者抓住漏洞则后患极大。

下面整理如下风险系统函数.

  • exec() 函数

该函数可以执行系统命令,并且返回输出结果到$output中。具体使用请参考官网。

例如 用户访问 http://localhost/exec.php?cmd=ls -al,cmd中的命令将被执行.

<?php
echo exec($_GET["cmd"], $output);
foreach($output as $value) {
echo $value;
}
  • system()函数

该函数和exec函数类似,唯一不同是直接返回结果,无需赋值给第二个参数变量。

<?php
system($_GET["cmd"]);
  • passthru()函数

    该函数也会调用系统命令,并把运行结果二进制数据原样地直接输出到标准输出设备上。
<?php
passthru($_GET["cmd"]);
  • shell_exec()函数

这是我比较也喜欢用的函数,通过执行shell命令并返回完整输出字符串,和执行shell效果一样。

<?php

    $output = shell_exec($_GET["cmd"]);
echo $output;
  • pcntl_exec()函数

pcntl是Linux系统下的一个扩展,可以支持PHP实现多线程。

<?php
pcntl_exec($_GET["cmd"], $_GET["args"]);

为了防止命令注入,我们可以关注的方面比较多,如下:

  • 1.我们可以尽量避免使用这类函数,从业务层面避免从用户端接受到命令。

  • 2.另一方面,如果一定使用,一定不能暴露给用户能直接不鉴权就调用。

  • 3.然后我们也可以设置php.ini配置,将这些可能造成风险的系统调用函数禁用。

    只需要将php.ini中的safe_mode设置为On,然后修改如下部分:

disable_functions=exec,system,shell_exec,passthru,popen,pcntl_exec

有人可能会用如果我一定要用到这些函数来实现功能呢?

那我们可以自定义实现,或者在执行的时候将逻辑判断健壮性加强,增加一些必要判断逻辑。

  • 4.使用escapeshellarg()和escapeshellcmd()函数来处理命令参数是一个不错的选择。

  • 5.使用safe_mode_exec_dir指定可执行文件的路径。

在php.ini文件中设置如下:

safe_mode = On

safe_mode_exec_dir = /usr/local/php/bin

参数尽量使用引号包裹,并在拼接的时候使用addslashes函数进行转义。

PHP安全之道学习笔记4:系统命令注入的更多相关文章

  1. SQL反模式学习笔记21 SQL注入

    目标:编写SQL动态查询,防止SQL注入 通常所说的“SQL动态查询”是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. 反模式:将未经验证的输入作为代码执行 当向SQL查询的字符串中插入别 ...

  2. SQLMAP学习笔记1 access注入

    SQLMAP学习笔记1  access注入 Sqlmap是开源的自动化SQL注入工具,由Python写成,具有如下特点: 完全支持MySQL.Oracle.PostgreSQL.Microsoft S ...

  3. SpringMVC:学习笔记(11)——依赖注入与@Autowired

    SpringMVC:学习笔记(11)——依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...

  4. Spring源码学习笔记9——构造器注入及其循环依赖

    Spring源码学习笔记9--构造器注入及其循环依赖 一丶前言 前面我们分析了spring基于字段的和基于set方法注入的原理,但是没有分析第二常用的注入方式(构造器注入)(第一常用字段注入),并且在 ...

  5. Spring 4.0.2 学习笔记(2) - 自动注入及properties文件的使用

    接上一篇继续, 学习了基本的注入使用后,可能有人会跟我一样觉得有点不爽,Programmer的每个Field,至少要有一个setter,这样spring配置文件中才能用<property> ...

  6. postgresql修炼之道学习笔记(1)

    好好学习吧. 本笔记 仅作为摘要记录 前两章,主要是数据库对比和安装等. 对比,就比多说了,总是和别人比较,会显得自己身价低,呵呵. 安装也有很多文章,不多说. 第二章提到了一些简单的配置, 其在 d ...

  7. postgresql修炼之道学习笔记(2)

    随后的章节  介绍了基础的sql,这个我略过了,我喜欢在开发的时候,慢慢的研究,毕竟有oracle的基础. 现在,学习psql工具 使用create database创建数据库的时候,出现如下问题: ...

  8. linux学习笔记-4.系统命令

    1.查看主机名 hostname 2.修改主机名(重启后无效) hostname hadoop 3.修改主机名(重启后永久生效) vi /ect/sysconfig/network 4.修改IP(重启 ...

  9. PHP安全之道学习笔记1:PHP项目安全设置

    在全球范围来看,超过了80%的网站是使用php进行搭建的,由于脚本语言和早期版本设计的诸多原因,php项目存在不少安全隐患.从配置选项来看,可以做如下的优化. 1.屏蔽PHP错误输出. 在/etc/p ...

随机推荐

  1. dev gridcontrol 行号

    /// <summary> /// GridView 显示行号 设置行号列的宽度 /// </summary> /// <param name="gv" ...

  2. mysql复制表结构和表数据

    我们知道,在SQL Server中,如果要复制表结构和表数据的话,可以使用select into语句. select * into yanggb1 from yanggb; 但是在MySQL中是不支持 ...

  3. python 多线程编程之使用进程和全局解释器锁GIL

    本文主要介绍如何在python中使用线程. 全局解释器锁: python代码的执行是由python虚拟机(又名解释器主循环)进行控制的.python中,主循环中同时只能有一个控制线程在执行,就像单核C ...

  4. [译]C# 7系列,Part 3: Default Literals 默认文本表达式

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/06/c-7-series-part-3-default-literals/ C#的default ...

  5. linux 文件管理命令

    一,文件查看more,less,head,tail,cat,tac 分屏查看文件内容 more:和man用法一样,但翻屏到尾部自动推出. less:和man用法一样. head:查看文件的前n行.n默 ...

  6. DFA敏感词过滤实现

    package test.java.com.odianyun.util.sensi; import java.util.*; /** * 敏感词处理工具 - DFA算法实现 * * @author s ...

  7. Cocos Creator 资源加载流程剖析【五】——从编辑器到运行时

    我们在编辑器中看到的资源,在构建之后会进行一些转化,本章将揭开Creator对资源进行的处理. 资源处理的整体规则 首先我们将Creator的开发和运行划分为以下几个场景: 编辑器 当我们将资源放到编 ...

  8. 破解另一家网站的反爬机制 & HMAC 算法

    零.写在前面 本文涉及的反爬技术,仅供个人技术学习,禁止并做到: 干扰被访问网站的正常运行 抓取受到法律保护的特定类型的数据或信息 搜集到的数据禁止传播.交给第三方使用.或者牟利 如有可能,在爬到数据 ...

  9. .netcore3.0 System.Text.Json 日期格式化

    .netcore3.0 的json格式化不再默认使用Newtonsoft.Json,而是使用自带的System.Text.Json来处理. 理由是System.Text.Json 依赖更少,效率更高. ...

  10. java 整合redis缓存 SSM 后台框架 rest接口 shiro druid maven bootstrap html5

    A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成 ...