php代码审计,php漏洞详解

文章目录

  • 1、输入验证和输出显示
  • 2、命令注入(Command Injection)
  • 3、eval 注入(Eval Injection)
  • 4、跨网站脚本攻击(Cross Site Scripting, XSS)
  • 5、SQL 注入攻击(SQL injection)
  • 6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)
  • 7、Session 会话劫持(Session Hijacking)
  • 8、Session 固定攻击(Session Fixation)
  • 9、HTTP 响应拆分攻击(HTTP Response Splitting)
  • 10、文件上传漏洞(File Upload Attack)
  • 11、目录穿越漏洞(Directory Traversal)
  • 12、远程文件包含攻击(Remote Inclusion)
  • 13、动态函数注入攻击(Dynamic Variable Evaluation)
  • 14、URL 攻击(URL attack)
  • 15、表单提交欺骗攻击(Spoofed Form Submissions)
  • 16、HTTP 请求欺骗攻击(Spoofed HTTP Requests)

1、输入验证和输出显示

大多数漏洞的形成原因主要都是未对输入数据进行安全验证或对输出数据未经过安全处
理,比较严格的数据验证方式为:

对数据进行精确匹配
接受白名单的数据
拒绝黑名单的数据
对匹配黑名单的数据进行编码

在 PHP 中可由用户输入的变量列表如下,我们应该对这些输入变量进行检查:

$_SERVER
$_GET
$_POST
$_COOKIE
$_REQUEST
$_FILES
$_ENV
$_HTTP_COOKIE_VARS
$_HTTP_ENV_VARS
$_HTTP_GET_VARS
$_HTTP_POST_FILES
$_HTTP_POST_VARS
$_HTTP_SERVER_VARS

2、命令注入(Command Injection)

PHP 中可以使用下列 5 个函数来执行外部的应用程序或函数

system、exec、passthru、shell_exec、(与 shell_exec 功能相同)

使用方式

string system(string command, int &return_var)
command 要执行的命令
return_var 存放执行命令的执行后的状态值
string exec (string command, array &output, int &return_var)
command 要执行的命令
output 获得执行命令输出的每一行字符串
return_var 存放执行命令后的状态值
void passthru (string command, int &return_var)
command 要执行的命令
return_var 存放执行命令后的状态值

案例
将下面代码放在服务器,我们在浏览器访问

//ex1
<?php
$ip = $_GET["ip"];
if (isset($ip))
{
echo "<pre>";
system("ping ".$ip);
echo "</pre>";
}
?>

可以看到执行了ping命令
在这里插入图片描述
由于它没有对 ip 参数进行任何验证或过滤,恶意用户可以通过在 URL 中添加特殊字符来执行任意命令
在这里插入图片描述

3、eval 注入(Eval Injection)

eval 函数将输入的字符串参数当作 PHP 程序代码来执行
将下面代码放在服务器,我们在浏览器访问

//ex2
<?php
$var = "var";
if (isset($_GET["arg"]))
{
$arg = $_GET["arg"];
eval("\$var = $arg;");
echo "\$var =".$var;
}
?>

当我们把传递的参数值改为phpinfo的时候,漏洞就产生了
在这里插入图片描述
防范方法

1、尽量不要执行外部命令
2、使用自定义函数或函数库来替代外部命令的功能
3、使用 escapeshellarg 函数来处理命令参数
4、使用 safe_mode_exec_dir 指定可执行文件的路径
esacpeshellarg 函数会将任何引起参数或命令结束的字符转义,单引号“’”,替换成“\’”,双引号““”,替
换成“””,分号“;”替换成“;”
用 safe_mode_exec_dir 指定可执行文件的路径,可以把会使用的命令提前放入此路径内

4、跨网站脚本攻击(Cross Site Scripting, XSS)

反射型跨站常常出现在用户提交的变量接受以后经过处理,直接输出显示给客户端;存储
型跨站常常出现在用户提交的变量接受过经过处理后,存储在数据库里,然后又从数据库中读取
到此信息输出到客户端。输出函数经常使用:echo、print、printf、vprintf、<%=$test%>

这里用pikachu的存储型代码进行分析
在这里插入图片描述
这段代码它没有对用户输入的留言进行任何验证或过滤,因此可能会受到存储型跨站脚本攻击(Stored XSS Attack)的威胁。存储型跨站脚本攻击是一种常见的网络攻击方式,攻击者通过在网页中插入恶意脚本,来窃取用户信息或破坏网页内容1

5、SQL 注入攻击(SQL injection)

SQL 注入攻击(SQL Injection),是攻击者在表单中提交精心构造的 sql 语句,改动原来的 sql 语句,如
果 web 程序没有对提交的数据经过检查,那么就会造成 sql 注入攻击。

1、攻击者访问有 SQL 注入漏洞的站点,寻找注入点
2、攻击者构造注入语句,注入语句和程序中的 SQL 语句结合生成新的 sql 语句
3、新的 sql 语句被提交到数据库中执行 处理
4、数据库执行了新的 SQL 语句,引发 SQL 注入攻击

SQL 注入因为要操作数据库,所以一般会查找SQL 语句关键字:

insert、delete、update、 select

查看传递的变量参数是否用户可控制,有无做过安全处理,可以使用参数化查询防范

6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)

跨站请求伪造攻击,是攻击者伪造一个恶意请求链接,通过各种方式让正常用户访问后,
会以用户的身份执行这些恶意的请求。我们应该对比较重要的程序模块,比如修改用户密码,添 加用户的功能进行审查,检查有无使用一次性令牌防御
csrf 攻击。

7、Session 会话劫持(Session Hijacking)

会话劫持是指攻击者利用各种手段来获取目标用户的 session id。一旦获取到 session id,那么攻击者可以利用目标用户的身份来登录网站,获取目标用户的操作权限。

服务端和客户端之间是通过 session(会话)来连接沟通。当客户端的浏览器连接到服务器后,服务器就会建立一个该用户的session。
每个用户的 session 都是独立的,并且由服务器来维护。 每个用户的 session是由一个独特的字符串来识别,成为session id。用户发出请求时,所发送的 http 表头内包含 session id 的值。
服务器使用 http 表头内的session id 来识别时哪个用户提交的请求。
session 保存的是每个用户的个人数据,一般的 web 应用程序会使用session 来保存通过验证的用户 账号和密码。在转换不同的网页时,如果需要验证用户身份,就是用 session内所保存的账号和密码来比较。
session 的生命周期从用户连上服务器后开始,在用户关掉浏览器或是注销时用户session_destroy 函数删除 session 数据时结束。如果用户在 20 分钟内没有使用计算机的动作,session也会自动结束。

8、Session 固定攻击(Session Fixation)

如果当权限级别改变时(例如核实用户名和密码后,普通用户提升到管理员),我们就应该
修改即将重新生成的会话 ID,否则程序会面临会话固定攻击的风险。

9、HTTP 响应拆分攻击(HTTP Response Splitting)

HTTP 响应拆分是由于攻击者经过精心设计利用电子邮件或者链接,让目标用户利用一个请求产生两个响应,前一个响应是服务器的响应,而后一个则是攻击者设计的响应。此攻击之所以会发生,是因为 WEB程序将使用者的数据置于 HTTP 响应表头中,这些使用者的数据是有攻击者精心设计的。
可能遭受 HTTP 请求响应拆分的函数包括以下几个:

header(); setcookie(); session_id(); setrawcookie();

注意
PHP 的高版本会禁止 HTTP 表头中出现换行字符,这类可以直接跳过本测试

10、文件上传漏洞(File Upload Attack)

PHP 文件上传通常会使用 move_uploaded_file,也可以找到文件上传的程序进行具体分析

防范方式:
使用白名单方式检测文件后缀
上传之后按时间能算法生成文件名称
上传目录脚本文件不可执行
注意%00截断

11、目录穿越漏洞(Directory Traversal)

12、远程文件包含攻击(Remote Inclusion)

13、动态函数注入攻击(Dynamic Variable Evaluation)

14、URL 攻击(URL attack)

15、表单提交欺骗攻击(Spoofed Form Submissions)

16、HTTP 请求欺骗攻击(Spoofed HTTP Requests)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/67409.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虾皮运营每天需要做什么?如何处理后台数据?

#shopee#​有很多朋友想做电商&#xff0c;但是对电商运营比较朦胧&#xff0c;不知道电商运营每天到底该做些什么。今天咱们就来解析下&#xff0c;Shopee电商运营每天该做哪些事情一个合格的电商运营&#xff0c;每天都会做好以下几点&#xff1a; 一、查看数据&#xff1a; …

【100天精通python】Day31:使用python操作数据库_数据库编程接口,连接对象和游标对象,数据库连接配置

目录 专栏导读 一、数据库编程接口 1. Python标准库接口 2. MySQL Connector/Python接口 3. Psycopg2接口&#xff08;用于连接PostgreSQL数据库&#xff09; 4. SQLAlchemy接口 二、连接对象和游标对象 1. 连接对象&#xff08;Connection Object&#xff09; 2. 游标…

❤ vue3 使用 ElementPlus

❤ vue3 使用ElementPlus 承接自上一篇文章 VUE3 项目具体配置&#xff08;二&#xff09; ① 使用 ElementPlus Icon 图标 官网地址&#xff1a; https://element-plus.org/zh-CN/component/icon.html 1、安装 yarn add element-plus/icons-vue安装成功以后&#xff1a; …

【分布式技术专题】「数据一致性体系」带你一同建立采用消息队列实现的数据一致性框架技术体系方案

带你一同建立采用消息队列实现的数据一致性框架技术体系方案 分布式服务数据一致性问题采用分布式事务3PC模式3PC模式阶段分析 采用分布式锁采用数据同步机制采用数据分片机制针对常规方案所具有的问题预发送消息阶段切换为可发送状态定时补偿更新为可发送状态定时补偿发送数据…

Java基础篇--基本数据类型

目录 前言&#xff1a; 内置数据类型 类型默认值 示例: 内置数据类型转换 自动类型转换&#xff08;隐式类型转换&#xff09;&#xff1a; 强制类型转换&#xff08;显式类型转换&#xff09;&#xff1a; 隐含强制类型转换&#xff1a; 引用类型 前言&#xff1a; …

浅谈JVM中的即时编译器(Just-In-Time compiler, JIT)

Java虚拟机&#xff08;JVM&#xff09;中的即时编译器&#xff08;Just-In-Time compiler, JIT&#xff09;是一个非常重要的组件&#xff0c;它负责将字节码转换为本地机器代码。在不使用JIT的情况下&#xff0c;JVM通过解释字节码来执行程序&#xff0c;这意味着它会为每个字…

Vue2嵌入HTML页面空白、互相传参、延迟加载等问题解决方案

一、需求分析 最近做的一个用H5加原生开发的html项目&#xff0c;现需要集成到Vue2.0项目里面来。遇到的相关问题做个记录和总结&#xff0c;以便能帮到大家避免踩坑。 二、问题记录 1、页面空白问题 将html页面通过iframe的方式嵌入进来之后&#xff0c;发现页面是空白的&am…

2023牛客暑期多校训练营7(C/I/M)

目录 C.Beautiful Sequence I.We Love Strings M.Writing Books C.Beautiful Sequence 思路&#xff1a;显然若得到了a[1]&#xff0c;则整个序列a我们都知道了。所以我们要求出第k大的a[1]&#xff0c;这个可以利用序列a为不递减序列的性质来得出。 首先&#xff0c;由题…

商品推荐系统浅析 | 京东云技术团队

一、综述 本文主要做推荐系统浅析&#xff0c;主要介绍推荐系统的定义&#xff0c;推荐系统的基础框架&#xff0c;简单介绍设计推荐的相关方法以及架构。适用于部分对推荐系统感兴趣的同学以及有相关基础的同学&#xff0c;本人水平有限&#xff0c;欢迎大家指正。 二、商品…

独立站如何进行Facebook广告投放?关于广告投放策略的真相

谷歌广告是独立站卖家推广引流的首选渠道&#xff0c;那么谷歌广告该如何投放&#xff1f;在这个过程中有哪些需要特别注意的吗&#xff1f; 创建Facebook广告账户&#xff1a; 访问Facebook广告管理平台&#xff08;Ads Manager&#xff09;并创建一个广告账户。您需要提供一…

Towards Open World Object Detection【论文解析】

Towards Open World Object Detection 摘要1 介绍2 相关研究3 开放世界目标检测4 ORE:开放世界目标检测器4.1 对比聚类4.2 RPN自动标注未知类别4.3 基于能量的未知标识4.4 减少遗忘 5 实验5.1开放世界评估协议5.2 实现细节5.3 开放世界目标检测结果5.4 增量目标检测结果 6 讨论…

【ArcGIS Pro二次开发】(56):界址点导出Excel

界址点成果表是地籍测绘中的一种表格&#xff0c;用于记录地块的界址点坐标和相关属性信息。 这个工具的目的就是为了将地块要素导出为界址点成果表。 一、要实现的功能 如上图所示&#xff0c;在【数据处理】组—【Excel相关】面板下&#xff0c;点击【界址点导出Excel】工具。…

linux文件I/O之 open() 函数用法

#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> typedef unsigned int mode_t ; int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 函数功能 打开或创建一个文件 返回值 成功…

21、springboot的宽松绑定及属性处理类的构造注入

springboot的宽松绑定及属性处理类的构造注入 ★ 如何使用属性处理类所读取的属性 属性处理类最终变成了Spring容器中的一个Bean组件&#xff0c;因此接下来Spring即可将该Bean组件注入任意其他组件。 这种做法的好处是&#xff1a;可以将大量的配置信息封装一个对象——所以…

JavaScript的三大组成部分是什么?JavaScript的核心组成部分解析:语法、BOM和DOM

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【uniapp】封装一个全局自定义的模态框

【需求描述】 在接口401处&#xff0c;需要实现全局提示并弹出自定义模态框的功能。考虑到uni-app内置的模态框和app原生提示框的自定义能力有限&#xff0c;我决定自行封装全局自定义的模态框&#xff0c;以此为应用程序提供更加统一且个性化的界面。 【效果图】 【封装】 主…

Python-OpenCV中的图像处理-几何变换

Python-OpenCV中的图像处理-几何变换 几何变换图像缩放图像平移图像旋转仿射变换透视变换 几何变换 对图像进行各种几个变换&#xff0c;例如移动&#xff0c;旋转&#xff0c;仿射变换等。 图像缩放 cv2.resize() cv2.INTER_AREAv2.INTER_CUBICv2.INTER_LINEAR res cv2.r…

MySQL面试1

Mysql的面试突击1 Mysql的体系结构是什么样子的&#xff08;查询语句怎么进行执行的&#xff09; mysql的架构&#xff1a;单进程多线程的架构模式 CLient -----> Server架构 Mysql的链接方式有没有性能优化的点 2个点 查询缓存(Query Cache) MySQL 内部自带了一个缓存模…

Direct path read LOB

Table full scan &#xff1a; wait event Direct path read because of LOB "Direct path read" Wait Event During LOB Access (Doc ID 2287482.1)​编辑To Bottom In this Document Symptoms Changes Cause Solution References APPLIES TO: Oracle Database …

数据结构--栈和队列

文章目录 栈的概念和结构栈的实现栈的数据结构栈的初始化和销毁出栈和入栈获取栈顶、大小&#xff0c;判空 队列的概念和结构队列的实现队列的数据结构队列的初始化和销毁队列的插入 队列的删除获取队头和队尾的数据获取队列长度和判空 栈和队列的一些题目1.有效的括号2.用队列…