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 ...
随机推荐
- ES6 promise 使用示例
new Promise(function (resolve, reject) { $.ajax({ type : 'post', data : formData, dataType : 'json', ...
- 下载Abook 高等教育出版社网站资料
一.背景 又快到了期末复习周,这个学期学了一门操作系统,老师没有给课本习题的答案,说是配套网站上有,我看了一下,确实有,是高等教育出版社的数字课程网站Abookl http://abook.hep.c ...
- [译]C# 7系列,Part 6: Read-only structs 只读结构
原文:https://blogs.msdn.microsoft.com/mazhou/2017/11/21/c-7-series-part-6-read-only-structs/ 背景 在.NET世 ...
- 用Bootstrap做一个历史朝代表
引入CDN,算好需要合并的单元格. <!DOCTYPE html> <html> <head> <!-- 移动设备 --> <meta name= ...
- ABAP分享六 alv显示的几种方式的简单示例
方法1,也是大家常见的方法通过函数 REUSE_ALV_GRID_DISPLAY TYPES: BEGIN OF ty_spfli, "定义结构 carrid like s ...
- SAP 基础知识
SAP R/3系统的应用层由应用服务器及消息服务器(Message Server)组成. 应用服务器组件如下: 工作进程(Work Process) 调度机(Dispatcher) 网关服务器(Gat ...
- Android 插件化开发(一):Java 反射技术介绍
写在前面:学习插件化开发推荐书籍<Android 插件化开发指南>,本系列博客所整理知识部分内容出自此书. 在之前的项目架构的博文中,我们提到了项目插件化架构,提到插件化架构不得不提的到J ...
- day07什么是方法、方法的定义、方法的调用
复习 1.数组 1)什么是数组 数组就是一种能够保存 多个相同数据类型的数据的变量 2)为什么使用数组 3)数组的构成 3.1)数组名 3.2)数组元素 3.3)数组长度 3.4)数组下标 4)数组的 ...
- Ansible-下部
ansible-playbook playbook是由一个或多个模块组成的,使用多个不同的模块,完成一件事情. ansible软件特点 可以实现批量管理可以实现批量部署ad-hoc(批量执行命令)- ...
- python3装饰器用法示例
装饰器在编写后台的逻辑时有可能会用到,比方说一个场景:公司的员工想要登录自己公司的考勤记录系统去修改自己的考勤,以前是随便谁都有权限去修改,这样老板不同意了,现在,要在你登录前加一个权限验证的逻辑,如 ...