当前位置: 首页 > news >正文

【Web安全】PHP安全

一、文件包含漏洞

严格来说,文件包含就是代码注入的一种。代码注入,其原理就是注入一段用户能控制的脚本或代码并让服务器端执行。代码注入的典型代表就是文件包含。文件包含可能会出现在JSP、PHP、ASP等语言中,常见函数如下:

PHP:include()、include_once()、require()、require_once()、fopen()、readfile()……

JSP/Servlet:ava.io.File()、java.io.FileReader()……

ASP:include file 、include virtual……

PHP当使用include()、include_once()、require()、require_once()这四个函数包含一个新文件时,该文件会被当做PHP代码执行,且不在意被包含的文件是什么类型。

想要成功利用文件包含漏洞,需要满足两个条件:
include()等函数通过动态变量的方式引入需要包含的文件
用户能够控制该动态变量

1.1 本地文件包含

可以温习一下dvwa的文件包含

DVWA文件包含漏洞

通常控制参数的值为../../etc/password,代表php将访问/etc/password文件

字符串截断也是文件包含中常用的技巧

%00截断:可以用0字节(\x00)作为字符串结束符

长度截断:目录字符串,在Windows下256字节、Linux下4096字节时会达到最大值,最大值长度之后的字符串会被丢弃

可构造:./././././././././././././abc

/abc

../1/abc/../1/abc/../1/abc

通过../../../这种方式返回上层目录,这种方式又被称为”目录遍历

可以通过不同编码方式来绕过

但是当PHP配置了open_basedir时,会使得目录遍历失效。

open_basedir的作用是限制在某个特定目录下PHP能打开的文件,其作用与safe_mode是否开启无关。

主要注意的是,open_basedir的值是目录的前缀

如果open_basedir = /home/app/aaa

那么以下目录都是合理的

/home/app/aaa
/home/app/aaa123
/home/app/aaabbb

1.2 远程文件包含

如果PHP的配置选项allow_url_include=ON,则include和require函数可以加载远程文件

1.3 本地文件包含的利用技巧

  1. 包含用户上传的文件

如果文件内容包含PHP代码,则这些代码会被include()加载后执行
  1. 包含data://或php://input等伪协议

前提是allow_url_include=ON

可以参考之前的文章:php文件包含常用伪协议

  1. 包含Session文件

PHP默认生成的Session文件往往放在/tmp目录下
/tmp/sess_SESSIONID
  1. 包含日志文件,比如Web Server的access log

服务器一般会往Web Server的access log里记录客户端的请求信息,在error_log里记录出错请求。因此攻击者可以间接地将PHP代码写到日志文件中,在文件包含时,只需要包含日志文件即可。
  1. 包含/proc/self/environ文件

http://www.website.com/view.php?page=../../../../../proc/self/environ
通常在User-Agent里注入PHP代码最终完成攻击
  1. 包含上传的临时文件

  1. 包含其他应用创建的文件,比如数据库文件、缓存文件、应用日志等

二、变量覆盖漏洞

2.1 全局变量覆盖

PHP中使用变量不需要初始化,当register_globals=ON时,变量来源于各个不同的地方,很可能会导致安全问题。

类似的,通过¥GLOBALS获取的变量,也可能导致变量覆盖

2.2 extract()变量覆盖

extract() 函数从数组中将变量导入到当前的符号表。

extract(array,extract_type,prefix)

该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。

第二个参数 type 用于指定当某个变量已经存在,而数组中又有同名元素时,extract() 函数如何对待这样的冲突。最常见的两个值是”EXTR_OVERWRITE“和”EXTR_SKIP“。

当值为”EXTR_OVERWRITE“时,如果变量名冲突则覆盖已有变量,值为”EXTR_SKIP“则表示跳过不覆盖。默认是”EXTR_OVERWRITE“。

2.3 遍历初始化变量

常见的一些以遍历的方式释放变量的代码,可能会导致变量覆盖。

$chs = '';
if($_POST && $charset != 'utf-8'){$chs = new Chinese('UTF-8',$charset";foreach($_POST as $key => $value){$$key = $chs->Convert ($value);}unset($chs);

若提交参数chs,则可能覆盖变量”$chs“的值。

2.4 import_request_variavles变量覆盖

bool import_request_variables ( string $types [, string $prefix ] )

import_request_variavles()将GET、POST、Cookie中的变量导入到全局,使用这个函数只需要简单地指定类型即可。第二个参数是为导入的变量添加的前缀,若没有指定,则将覆盖全局变量。

2.5 parse_str()变量覆盖

parse_str(string,array)

该函数用于解析URL的query string,但是当参数值能被用户控制时,可能导致变量覆盖

如果指定了第二个参数,则会将query string中的变量解析后存入该数组变量中。因此在使用该函数时,应该养成指定第二个参数的好习惯

针对覆盖变量的安全建议
1.确保register_globals = OFF
2.熟悉可能造成变量覆盖的函数和方法,检查用户能否控制变量来源
3.养成初始化变量的好习惯

三、代码执行漏洞

3.1 危险函数执行代码

危险函数,例如popen()、system()、passthru()、exec()等都可以执行系统命令

eval()函数也可以执行PHP代码

3.2 文件写入执行代码

可以参考vulhub漏洞复现的文章

CVE-2016-3088 ActiveMQ任意文件写入漏洞

3.3 其他执行代码方式

直接执行代码的函数

PHP:eval()、assert()、system()、exec()、shell_exec()、passthru()、escapeshellcmd()、pcntl_exec()等

文件包含函数

PHP:include()、include_once()、require()、require_once()

本地文件写入函数

file_put_contents()、fwrite()、fputs()等

preg_replace()代码执行

如果是/e模式,则允许代码执行(也可能通过%00截断注入/e)
可参考Thinkphp 2.x 任意代码执行的漏洞复现:Thinkphp 2.x 任意代码执行

动态函数执行

调用函数直接导致代码执行,create_function()也具有此能力

Curly Syntax

PHP的Curly Syntax也能导致代码执行,它将执行{……}间的代码,并将结果替换回去
如:
<?php
$var = "I was innocent until ${'ls'} appeared here";
?>
ls命令将列出本地目录的文件并将结果返回

回调函数执行代码

很多函数都可以执行回调函数,当回调函数用户可控时,将导致代码执行

unserialize()导致代码执行

unserialize()就是反序列化函数,它能将序列化的数据重新映射为PHP变量。但是unserialize()在执行时如果定义了__destruct()函数或wakeup()函数,这两个函数将执行。
unserialize()代码执行有两个条件,一是unserialize()的参数用户可控,这样可以构造出需要反序列化的数据结构;二是存在__destruct()函数或wakeup()函数,这两个函数决定执行的代码。

四、定制安全的PHP环境

推荐php.ini中一些相关安全参数的配置

  • reguster_globals=OFF

  • open_basedir在设置目录时应该在最后加上”/",否则会被认为是前缀

  • allow_url_include=OFF

  • allow_uel_fopen=OFF

  • display_errors=OFF

  • log_errors=ON

  • magic_quotes_gpc=OFF

  • cgi.fix_pathinfo=0

  • session.cookie_httponly=1

  • session.cookie_secure=1

  • ……

相关文章:

【Web安全】PHP安全

一、文件包含漏洞严格来说&#xff0c;文件包含就是代码注入的一种。代码注入&#xff0c;其原理就是注入一段用户能控制的脚本或代码并让服务器端执行。代码注入的典型代表就是文件包含。文件包含可能会出现在JSP、PHP、ASP等语言中&#xff0c;常见函数如下&#xff1a;PHP&a…...

双向链表+循环链表

循环链表双向链表 循环链表 循环链表是头尾相接的链表(即表中最后一个结点的指针域指向头结点&#xff0c;整个链表形成一个环)(circular linked list) **优点&#xff1a;**从表中任一结点出发均可访问全部结点 循环链表与单链表的主要差别当链表遍历时&#xff0c;判别当前…...

Java程序的逻辑控制

一、顺序结构 顺序结构比较简单&#xff0c;如果我们按照代码书写的顺序一行一行执行&#xff0c;将会是这样的&#xff1a; System.out.println("aaa"); System.out.println("bbb"); System.out.println("ccc"); // 运行结果 aaa bbb ccc 如…...

BUCTOJ - 2023上半年ACM蓝桥杯每周训练题-1-A~K题C++Python双语版

文章目录BUCTOJ - 2023上半年ACM&蓝桥杯每周训练题-1-A~K题CPython双语版前言问题 A: 1.2 神奇兔子数列题目描述输入输出解题思路AC代码CPython问题 B: 1.3 马克思手稿中的数学题题目描述输入输出解题思路AC代码CPython问题 C: 1.4 爱因斯坦的阶梯题目描述输入输出解题思路…...

存储的本质-学习笔记

1 经典案例 1.1 数据的流动 一条用户注册数据流动到后端服务器&#xff0c;持久化保存到数据库中。 1.2 数据的持久化 校验数据的合法性修改内存写入存储介质2 存储&数据库简介 2.1 存储系统特点 性能敏感、容易受硬件影响、存储系统代码既“简单”又“复杂”。 2.2 数…...

新一代骨传导机皇重磅发布:南卡Neo骨传导运动耳机,性能全面提升

近日&#xff0c;中国最强骨传导品牌NANK南卡发布了最新一代骨传导耳机——南卡Neo骨传导耳机&#xff01;该款耳机与运动专业性更强的南卡runner Pro4略微不同&#xff0c;其主要定位于轻运动风格&#xff0c;所以这款耳机的音质和佩戴舒适度达到了令人咂舌的地步&#xff01;…...

Hbase Schema设计与数据模型操作

一、Hbase Schema设计 1&#xff0c;Schema 创建 使用 Apache HBase Shell 或使用 Java API 中的 Admin 来创建或更新 HBase 模式。 Configuration config HBaseConfiguration.create(); Admin admin new Admin(conf); TableName table TableName.valueOf("myTable&…...

微电影广告有哪些传播优势?

微电影广告是在基于微电影的模式下发展而来的&#xff0c;是伴随着当下快节奏、碎片化的生活方式而诞生的新兴广告表现形式。微电影广告凭借其具备的独特传播优势以及时代特征成为广大企业主塑造企业品牌形象的主要方式。那么&#xff0c;微电影广告究竟有哪些传播优势&#xf…...

html基础(列表(ul、ol、dl)、表格table、表单(input、button、label)、div和span、空格nbsp)

1无序列表<ul>和有序列表<ol>1.1无序列表<ul><!-- 无序列表 --><ul><li>吃饭</li><li>睡觉</li><li>打豆豆</li></ul>1.2有序列表<ol><!-- 有序列表 --><ol><li>吃饭</li…...

uniapp常用标签

view ~~ 视图容器类似于传统html中的div&#xff0c;用于包裹各种元素内容<view><text>hh</text> </view>scroll-view ~~可滚动视图区域scroll-x 允许横向滚动scroll-y 允许纵向滚动scroll-top 设置竖向滚动条位置&#xff0c;可以一键回到顶部refresh…...

《数字中国建设整体布局规划》发布,推进IPv6部署和应用是重点

近日&#xff0c;中共中央、国务院印发了《数字中国建设整体布局规划》&#xff08;以下简称《规划》&#xff09;&#xff0c;并发出通知&#xff0c;要求各地区各部门结合实际认真贯彻落实。 《规划》指出&#xff0c;建设数字中国是数字时代推进中国式现代化的重要引擎&…...

【Java】 异步调用实践

本文要点&#xff1a; 为什么需要异步调用CompletableFuture 基本使用RPC 异步调用HTTP 异步调用编排 CompletableFuture 提高吞吐量BIO 模型 当用户进程调用了recvfrom 这个系统调用&#xff0c;kernel 就开始了 IO 的第一个阶段&#xff1a;准备数据。对于 network io 来说…...

园区智慧能源管理系统

实现对园区的用能情况实时、全方位监测&#xff0c;重点设备进行数据自动采集并智能统计、分析&#xff0c;根据需要绘制各种趋势曲线、能源流向图和分析报表。将物联网、大数据与全过程能源管理相融合&#xff0c;提供全生命周期的数字化用能服务&#xff0c;实现用能的精细化…...

基于卷积神经网络CNN的分类研究,基于卷积神经网络的手写体识别

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 卷积神经网络CNN手写体识别 基本结构 主要参数 MATALB代码 结果图 展望 背影 现在生活&#xff0c;各种人工智能都要求对图像拥有识别…...

mybatis的增删改查运用

目录 一、总览图 二、运用 一、总览图 代码总览图 数据库总览图 二、运用 数据库的一张表对应一个封装类&#xff0c;一个mapper接口&#xff0c;一个mapper.xml文件&#xff0c; 一个实现类。表中的增删改查都在里面编写 但是配置xml文件整个数据库只要一个就好了 1.…...

centos8安装docker运行java文件

本文由个人总结&#xff0c;如需转载使用请标明原著及原文地址 这里是基于我前一篇搭的centos8服务器做的&#xff0c;如果yum baseos源或appstream源有问题可以去看看前一篇 https://blog.csdn.net/qq_36911145/article/details/129263830 1.安装docker 1.1配置docker yum…...

Docker容器化部署.net core API

1.为API集成Docker环境。&#xff08;VS自带&#xff0c;傻瓜式操作&#xff09; 1.1 点击项目&#xff0c;右键&#xff0c;添加&#xff0c;选择Docker支持 1.2 找到项目根目录中的Dockerfile文件&#xff0c;这是VS刚刚帮我们自动生成的。进入和做如图标红地方修改。 把文…...

springcloud 服务调用feign、熔断hystrix、网关gateway

回归cloud的学习&#xff0c;对于springcloud的架构与原理以及性能的分析我们都在之前的文章里写过&#xff1a;springcloud架构的认识我们之前测试过eureka服务注册功能&#xff0c;它能很好的保存服务之间的通讯关系&#xff0c;是维系微服务通讯网之间的电话本&#xff0c;同…...

《C++ Primer》 第十二章 动态内存

《C Primer》 第十二章 动态内存 动态内存与智能指针 shared_ptr允许多个指针指向同一个对象&#xff1b;unique_ptr则“独占”所指向的对象&#xff0c;weak_ptr指向shared_ptr所管理的对象。这三种类型都定义在memory头文件中。 shared_ptr类&#xff1a;默认初始化的智能…...

多个关键字用or、and、包含、不包含动态拼接为正则表达式和SQL查询条件

目录前言校验思路1、存储方式2、实现图一实现图二实现结果最后前言 不知道大家有没有做过这种需求&#xff1a;在某字符串中&#xff0c;根据多个关键字去判断这串字符串是否满足条件。如下图&#xff1a; 亦或是 如果说要根据图二的关键字去数据库中查询符合条件的数据&a…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...