PHP安全之道学习笔记4:系统命令注入
系统命令注入
我们有时候写代码会用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:系统命令注入的更多相关文章
- SQL反模式学习笔记21 SQL注入
目标:编写SQL动态查询,防止SQL注入 通常所说的“SQL动态查询”是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. 反模式:将未经验证的输入作为代码执行 当向SQL查询的字符串中插入别 ...
- SQLMAP学习笔记1 access注入
SQLMAP学习笔记1 access注入 Sqlmap是开源的自动化SQL注入工具,由Python写成,具有如下特点: 完全支持MySQL.Oracle.PostgreSQL.Microsoft S ...
- SpringMVC:学习笔记(11)——依赖注入与@Autowired
SpringMVC:学习笔记(11)——依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...
- Spring源码学习笔记9——构造器注入及其循环依赖
Spring源码学习笔记9--构造器注入及其循环依赖 一丶前言 前面我们分析了spring基于字段的和基于set方法注入的原理,但是没有分析第二常用的注入方式(构造器注入)(第一常用字段注入),并且在 ...
- Spring 4.0.2 学习笔记(2) - 自动注入及properties文件的使用
接上一篇继续, 学习了基本的注入使用后,可能有人会跟我一样觉得有点不爽,Programmer的每个Field,至少要有一个setter,这样spring配置文件中才能用<property> ...
- postgresql修炼之道学习笔记(1)
好好学习吧. 本笔记 仅作为摘要记录 前两章,主要是数据库对比和安装等. 对比,就比多说了,总是和别人比较,会显得自己身价低,呵呵. 安装也有很多文章,不多说. 第二章提到了一些简单的配置, 其在 d ...
- postgresql修炼之道学习笔记(2)
随后的章节 介绍了基础的sql,这个我略过了,我喜欢在开发的时候,慢慢的研究,毕竟有oracle的基础. 现在,学习psql工具 使用create database创建数据库的时候,出现如下问题: ...
- linux学习笔记-4.系统命令
1.查看主机名 hostname 2.修改主机名(重启后无效) hostname hadoop 3.修改主机名(重启后永久生效) vi /ect/sysconfig/network 4.修改IP(重启 ...
- PHP安全之道学习笔记1:PHP项目安全设置
在全球范围来看,超过了80%的网站是使用php进行搭建的,由于脚本语言和早期版本设计的诸多原因,php项目存在不少安全隐患.从配置选项来看,可以做如下的优化. 1.屏蔽PHP错误输出. 在/etc/p ...
随机推荐
- BFC 以及 外边距合并问题
BFC定义: BFC(Block formatting context)直译为"块级格式化上下文". 它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部 ...
- AE单词备忘
类的基本特性内 approved 已批准 implemented 已实施 mandatory 强制性的 proposed 偍仪的 validated 已验证
- [Linux] linux路由表
路由表用于决定数据包从哪个网口发出,其主要判断依据是目标IP地址Linux路由表其实有2个主要概念:按顺序走路由策略,在路由策略对应的路由表中匹配规则路由策略(rule)路由表(table) 查看所有 ...
- Beta版本演示
小组信息 组名:斗地组 组长博客:地址 组内成员: 组员 学号 林涛(组长) 031702616 童圣滔 031702117 林红莲 031702213 潘雨佳 031702214 覃鸿浩 03170 ...
- javascript学习总结之函数
前言 在学习javascript函数的时候,有几个经常很容易混淆的方法,call,apply,bind,caller,callee,这些方法的使用,这些也可以说是会频繁使用的一些方法,在此通过查阅相关 ...
- C# Monitor and transfer or copy the changed or created file to a new location
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...
- Git实战指南----跟着haibiscuit学Git(第十篇)
笔名: haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...
- linux下的服务器上传与下载
上传 scp 文件 用户名@服务器ip 服务器保存路径 例如:scp bookmarks_2019_6_24.html root@192.168.0.103:/home 下载 scp 用户名@服务器i ...
- HTML入门(html基本文本标签+快捷键讲解以及基本html组成解释)
id 标签 功能 1 <hr /> 水平分割线 2 <br /> 强制让文本换行 3 <p>段落</p> 段落标签(自带换行效果) 4 < ...
- Dynamics 365 Customer Engagement V9.X新引入的自动编号属性介绍
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...