PHP审计(一)
一、php中常见的危险函数和审计要点
危险函数(功能过于强大)
参数是否外部可控,有没有正确的过滤。
PHP获取外界传入参数是通过下面几个全局函数的形式,所以审计参数传入经常要和下面几个变量打交道
PHP中危险函数有五大特性:
| 变量 | 说明 |
| $_GET | 数组,存放着所有通过URL参数传递的数据 |
| $_POST | 数组,当HTTP POST请求的Content-Type是application/x-www-form-urlencoded或multipart/form-data的部分解析成关联数组 |
| $_FILES | 数据,存放着HTTP POST上传的文件信息 |
| $_COOKIE | 数组,存放着HTTP头里面cookie段内容 |
| $_REQUEST | 数组,默认情况下包含了$_GET, $_POST, $_COOKIE的数据 |
| $_SERVER | 数组,包含了HTTP头,服务器环境等信息 |
| $_SESSION | 数组,存放当前会话可用的session变量 |
参数是否可控
执行任意代码函数
1)把传入的字符串直接当成php代码直接执行,如:
| A | B | C | D | |
| 1 | 函数 | 函数说明 | 例子 | 运行结果 |
| 2 | assert | 判断一个断言是否为false | assert('print(123)') | 输出123 |
| 3 | eval | 把一个字符串当做php代码执行 | eval('echo 123') | 输出123 |
| 4 | create_function | 用给的一个字符串创建匿名函数 | create_function('$a','print($a);')(123) | 输出123 |
2)通过引入文件的形式执行php代码,如:(利用:查看这些引入文件参数是否外部可控)
| A | B | C | D | |
| 1 | 函数 | 函数说明 | 例子 | 结果 |
| 2 | include | 包含并运行指定文件 | include '1.php' | 包含文件1.php,并执行里面的代码 |
| 3 | include_once | 包含并运行指定文件 | include_once '1.php' | 包含文件1.php,并执行里面的打码 |
| 4 | require | 包含并运行指定文件 | require '1.php' | 包含文件1.php,并执行里面的代码 |
| 5 | require_once | 包含并运行指定文件 | require_once '1.php' | 包含文件1.php,并执行里面的代码 |
3)数据处理函数
| 函数 | 函数说明 | 例子 | 结果 | |
| 1 | preg_replace | 使用正则替换内容,php7之前的正则表达式参数可以开启\e的模式,执行任意代码 | preg_replce("/(.)/e",'print(\1),'123'); |
php5下输出123 |
| 2 | array_map | 为数组的每个元素应用回调函数 | $b=array_map('assert',['print(123)']); | php5下输出123 |
| 3 | array_filter | 用回调函数过滤数组中的单元 | array_filter(['print(123)'],'assert'); | php5下输出123 |
| 4 | array_walk | 使用用户自定义函数对数组中的每个元素做回调处理 |
$a=['print(123)'];array_walk($a,'assert') |
php5下输出123 |
| 5 | call_user_func | 把第一个参数作为回调函数调用 | call_user_func('assert','print(123)'); | 输出123 |
4)能够读取网络资源的函数(配置 allow_url_include=1 才可以使用)
| 函数 | 函数说明 | 例子 | 结果 | |
| 1 | curl系列 | 发起网络请求 | ||
| 2 | file_get_contents | 原本功能是读取文件,但是支持封装协议,所以可以读取网络上的资源 | file_get_contents('https://url.com') | 请求url.com |
| 3 | file | 原本功能是读取文件,但是支持封装协议,所以可以读取网络上的资源 | file('https://url.com') | 请求url.com |
| 4 | fopen | 原本功能是读取文件,但是支持封装协议,所以可以读取网络上的资源 | fopen('https://url.com') | 请求url.com |
| 5 |
copy |
原本功能是复制文件,但是支持封装协议,所以可以读取网络上的资源 | copy('https://url.com') | 请求url.com,并保存txt文档 |
5)能够执行系统命令或者调用外部程序的函数
| 函数 | 函数说明 | 例子 | 结果 |
| exec | 执行一个外部程序 | exec('touch 1.txt') | 在当前目录下生成1.txt |
|
shell_exec |
通过shell执行命令,并且将完整的输出以字符串的方式返回 | shell_exec('touch 1.txt') | 在当前目录下生成1.txt |
| system | 执行外部程序,并显示输出 | system('touch 1.txt') | 在当前目录下生成1.txt |
| passthru | 执行外部程序,并显示输出 | passthru('touch 1.txt') | 在当前目录下生成1.txt |
| popen | 打开进程文件指针 | popen('touch 1.txt','r') | 在当前目录下生成1.txt |
| proc_open | 执行一个命令,并打开用来输入/输出的文件指针 | proc_open('touch 1.txt',[],$a) | 在当前目录下生成1.txt |
| `` | 反引号包含的内容会当成系统命令执行 | `touch 1.txt` | 在当前目录下生成1.txt |
6)能够修改运行时候的上下文环境
| 函数 | 函数说明 | 例子 | 结果 |
| extract | 从数组中将变量导入到当前的符号表,审计时候需要判别传输数组是否外部可控 | $a='1';extract(['a'=>'2']);echo $a | 输出2 |
|
parse_str |
将字符串解析成多个变量 | $a='1';parse_str('a=2');echo $a | 输出2 |
| ini_set | 修改运行时php配置 | ini_set('memory_limit','2048M') | 设置运行时最大占用额内存为2048M |
PHP审计(一)的更多相关文章
- ABP(现代ASP.NET样板开发框架)系列之19、ABP应用层——审计日志
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之19.ABP应用层——审计日志 ABP是“ASP.NET Boilerplate Project (ASP.NET ...
- ABP文档 - 审计日志
文档目录 本节内容: 简介 关于 IAuditingStore 配置 通过特性启用/禁用 注意 简介 维基百科:“一个审计追踪(也叫审计日志)是一个安全相关的时序记录.记录组.和/或记录源和目标,作为 ...
- 解析大型.NET ERP系统 数据审计功能
数据审计,英语表达是Audit,是追踪数据变化的过程,记录数据变化前后的值,供参考分析.通过设置,ERP可以追踪一个表的所有字段的变化,也可以只记录指定的字段的值变化.欧美企业每年都有独立的审计部门, ...
- Linux简单的日志审计
生产环境日志审计解决方案 所谓的日志审计,就是记录所有系统及相关的用户行为,并且可以自动分析.处理.展示(包括文本或者录像) 1) :通过环境变量以及rsyslog服务进行全部日志审计(信息太 ...
- ABP理论学习之审计日志
返回总目录 本篇目录 介绍 配置 通过特性开启/关闭 注意 我项目中的例子 介绍 维基百科说: "审计跟踪(也叫审计日志)是与安全相关的按照时间顺序的记录,记录集或者记录源,它们提供了活动序 ...
- Oracle 10g安全加固(审计、监听密码)
环境: Linux 6.4 + Oracle 10.2.0.4 1. Oracle 10g 审计功能 2. 对数据库监听器的关闭和启动设置密码 1. Oracle 10g 审计功能 Oracle 10 ...
- Linux系统实战项目——sudo日志审计
Linux系统实战项目——sudo日志审计 由于企业内部权限管理启用了sudo权限管理,但是还是有一定的风险因素,毕竟运维.开发等各个人员技术水平.操作习惯都不相同,也会因一时失误造成误操作,从而 ...
- 利用paramiko模块实现堡垒机+审计功能
paramiko模块是一个远程连接服务器,全真模拟ssh2协议的python模块,借助paramiko源码包中的demos目录下:demo.py和interactive.py两个模块实现简单的堡垒机+ ...
- 数据库DDL审计
一.为什么需要数据库DDL审计? DDL在生产系统中扮演非常重要的作用. 1)首先从业务角度来说,DDL可能意味着表结构变更,意味着新的版本即将发布,是个重要的时刻. 2)其次从运维角度来说,DDL尤 ...
- [转]ORACLE 审计功能
审计是对选定的用户动作的监控和记录,通常用于: u 审查可疑的活动.例如:数据被非授权用户所删除,此时安全管理员可决定对该 数据库的所有连接进行审计,以及对数据库的所有表的成功地或不 ...
随机推荐
- mongodb 用户权限控制
MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特地花了一点时间研究了一下,研究成果如下: 注:研究成果基于W ...
- Xtrareport 多栏报表
首先看下布局designer 细节: 分组一定要用到GroupHeather 设置好有 右边会出现 接下来是代码部分 Form1中代码 using DevExpress.XtraReports.UI; ...
- SpringBoot系列之——整合JPA、mysql
一.JPA 1. 概念:JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 2. ...
- java虚拟机之GC(转)
垃圾回收主要内容: 1. 那些内存需要回收? 2. 什么时候回收? 3. 如何回收? 垃圾回收主要针对运行时数据区那些区域? 运行时数据区的线程私有区域有:虚拟机栈,本地方法栈,程序计数器等: 栈中的 ...
- 内表转WORD
组合HTML字符串的方法来导出WORD文件 DATA: BEGIN OF wa_html, zhtml(), END OF wa_html, gt_html LIKE TABLE OF wa_html ...
- cookie乱码处理 示例
package com.log; import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; ...
- 手机APP 后端设计
原则: 命名知其意. 一看api名字就知道这个api是干啥. api返回数据禁止null 服务器动态处理原图(如 60x60 .80x80). 例如,客户端需要图片(http://w ...
- hive自定义UDTF函数叉分函数
hive自定义UDTF函数叉分函数 1.介绍 从聚合体日志中需要拆解出来各子日志数据,然后单独插入到各日志子表中.通过表生成函数完成这一过程. 2.定义ForkLogUDTF 2.1 HiveUtil ...
- 05、Spark
05.Spark shell连接到Spark集群执行作业 5.1 Spark shell连接到Spark集群介绍 Spark shell可以连接到Spark集群,spark shell本身也是spar ...
- BSP和JSP里的UI元素ID生成逻辑
CRM WebClient UI WebClient UI渲染出来的DOM元素的这些C#_W#格式的id是在哪行ABAP代码被生成出来的? 参考我的博客WebClient UI element ID ...