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 ...
随机推荐
- dev gridcontrol 行号
/// <summary> /// GridView 显示行号 设置行号列的宽度 /// </summary> /// <param name="gv" ...
- mysql复制表结构和表数据
我们知道,在SQL Server中,如果要复制表结构和表数据的话,可以使用select into语句. select * into yanggb1 from yanggb; 但是在MySQL中是不支持 ...
- python 多线程编程之使用进程和全局解释器锁GIL
本文主要介绍如何在python中使用线程. 全局解释器锁: python代码的执行是由python虚拟机(又名解释器主循环)进行控制的.python中,主循环中同时只能有一个控制线程在执行,就像单核C ...
- [译]C# 7系列,Part 3: Default Literals 默认文本表达式
原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/06/c-7-series-part-3-default-literals/ C#的default ...
- linux 文件管理命令
一,文件查看more,less,head,tail,cat,tac 分屏查看文件内容 more:和man用法一样,但翻屏到尾部自动推出. less:和man用法一样. head:查看文件的前n行.n默 ...
- DFA敏感词过滤实现
package test.java.com.odianyun.util.sensi; import java.util.*; /** * 敏感词处理工具 - DFA算法实现 * * @author s ...
- Cocos Creator 资源加载流程剖析【五】——从编辑器到运行时
我们在编辑器中看到的资源,在构建之后会进行一些转化,本章将揭开Creator对资源进行的处理. 资源处理的整体规则 首先我们将Creator的开发和运行划分为以下几个场景: 编辑器 当我们将资源放到编 ...
- 破解另一家网站的反爬机制 & HMAC 算法
零.写在前面 本文涉及的反爬技术,仅供个人技术学习,禁止并做到: 干扰被访问网站的正常运行 抓取受到法律保护的特定类型的数据或信息 搜集到的数据禁止传播.交给第三方使用.或者牟利 如有可能,在爬到数据 ...
- .netcore3.0 System.Text.Json 日期格式化
.netcore3.0 的json格式化不再默认使用Newtonsoft.Json,而是使用自带的System.Text.Json来处理. 理由是System.Text.Json 依赖更少,效率更高. ...
- java 整合redis缓存 SSM 后台框架 rest接口 shiro druid maven bootstrap html5
A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成 ...