【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 本地文件包含的利用技巧
包含用户上传的文件
如果文件内容包含PHP代码,则这些代码会被include()加载后执行
包含data://或php://input等伪协议
前提是allow_url_include=ON
可以参考之前的文章:php文件包含常用伪协议
包含Session文件
PHP默认生成的Session文件往往放在/tmp目录下
/tmp/sess_SESSIONID
包含日志文件,比如Web Server的access log
服务器一般会往Web Server的access log里记录客户端的请求信息,在error_log里记录出错请求。因此攻击者可以间接地将PHP代码写到日志文件中,在文件包含时,只需要包含日志文件即可。
包含/proc/self/environ文件
http://www.website.com/view.php?page=../../../../../proc/self/environ
通常在User-Agent里注入PHP代码最终完成攻击
包含上传的临时文件
包含其他应用创建的文件,比如数据库文件、缓存文件、应用日志等
二、变量覆盖漏洞
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安全
一、文件包含漏洞严格来说,文件包含就是代码注入的一种。代码注入,其原理就是注入一段用户能控制的脚本或代码并让服务器端执行。代码注入的典型代表就是文件包含。文件包含可能会出现在JSP、PHP、ASP等语言中,常见函数如下:PHP&a…...
双向链表+循环链表
循环链表双向链表 循环链表 循环链表是头尾相接的链表(即表中最后一个结点的指针域指向头结点,整个链表形成一个环)(circular linked list) **优点:**从表中任一结点出发均可访问全部结点 循环链表与单链表的主要差别当链表遍历时,判别当前…...
Java程序的逻辑控制
一、顺序结构 顺序结构比较简单,如果我们按照代码书写的顺序一行一行执行,将会是这样的: 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 数据的流动 一条用户注册数据流动到后端服务器,持久化保存到数据库中。 1.2 数据的持久化 校验数据的合法性修改内存写入存储介质2 存储&数据库简介 2.1 存储系统特点 性能敏感、容易受硬件影响、存储系统代码既“简单”又“复杂”。 2.2 数…...
新一代骨传导机皇重磅发布:南卡Neo骨传导运动耳机,性能全面提升
近日,中国最强骨传导品牌NANK南卡发布了最新一代骨传导耳机——南卡Neo骨传导耳机!该款耳机与运动专业性更强的南卡runner Pro4略微不同,其主要定位于轻运动风格,所以这款耳机的音质和佩戴舒适度达到了令人咂舌的地步!…...
Hbase Schema设计与数据模型操作
一、Hbase Schema设计 1,Schema 创建 使用 Apache HBase Shell 或使用 Java API 中的 Admin 来创建或更新 HBase 模式。 Configuration config HBaseConfiguration.create(); Admin admin new Admin(conf); TableName table TableName.valueOf("myTable&…...
微电影广告有哪些传播优势?
微电影广告是在基于微电影的模式下发展而来的,是伴随着当下快节奏、碎片化的生活方式而诞生的新兴广告表现形式。微电影广告凭借其具备的独特传播优势以及时代特征成为广大企业主塑造企业品牌形象的主要方式。那么,微电影广告究竟有哪些传播优势…...
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,用于包裹各种元素内容<view><text>hh</text> </view>scroll-view ~~可滚动视图区域scroll-x 允许横向滚动scroll-y 允许纵向滚动scroll-top 设置竖向滚动条位置,可以一键回到顶部refresh…...
《数字中国建设整体布局规划》发布,推进IPv6部署和应用是重点
近日,中共中央、国务院印发了《数字中国建设整体布局规划》(以下简称《规划》),并发出通知,要求各地区各部门结合实际认真贯彻落实。 《规划》指出,建设数字中国是数字时代推进中国式现代化的重要引擎&…...
【Java】 异步调用实践
本文要点: 为什么需要异步调用CompletableFuture 基本使用RPC 异步调用HTTP 异步调用编排 CompletableFuture 提高吞吐量BIO 模型 当用户进程调用了recvfrom 这个系统调用,kernel 就开始了 IO 的第一个阶段:准备数据。对于 network io 来说…...
园区智慧能源管理系统
实现对园区的用能情况实时、全方位监测,重点设备进行数据自动采集并智能统计、分析,根据需要绘制各种趋势曲线、能源流向图和分析报表。将物联网、大数据与全过程能源管理相融合,提供全生命周期的数字化用能服务,实现用能的精细化…...
基于卷积神经网络CNN的分类研究,基于卷积神经网络的手写体识别
目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 卷积神经网络CNN手写体识别 基本结构 主要参数 MATALB代码 结果图 展望 背影 现在生活,各种人工智能都要求对图像拥有识别…...
mybatis的增删改查运用
目录 一、总览图 二、运用 一、总览图 代码总览图 数据库总览图 二、运用 数据库的一张表对应一个封装类,一个mapper接口,一个mapper.xml文件, 一个实现类。表中的增删改查都在里面编写 但是配置xml文件整个数据库只要一个就好了 1.…...
centos8安装docker运行java文件
本文由个人总结,如需转载使用请标明原著及原文地址 这里是基于我前一篇搭的centos8服务器做的,如果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环境。(VS自带,傻瓜式操作) 1.1 点击项目,右键,添加,选择Docker支持 1.2 找到项目根目录中的Dockerfile文件,这是VS刚刚帮我们自动生成的。进入和做如图标红地方修改。 把文…...
springcloud 服务调用feign、熔断hystrix、网关gateway
回归cloud的学习,对于springcloud的架构与原理以及性能的分析我们都在之前的文章里写过:springcloud架构的认识我们之前测试过eureka服务注册功能,它能很好的保存服务之间的通讯关系,是维系微服务通讯网之间的电话本,同…...
《C++ Primer》 第十二章 动态内存
《C Primer》 第十二章 动态内存 动态内存与智能指针 shared_ptr允许多个指针指向同一个对象;unique_ptr则“独占”所指向的对象,weak_ptr指向shared_ptr所管理的对象。这三种类型都定义在memory头文件中。 shared_ptr类:默认初始化的智能…...
多个关键字用or、and、包含、不包含动态拼接为正则表达式和SQL查询条件
目录前言校验思路1、存储方式2、实现图一实现图二实现结果最后前言 不知道大家有没有做过这种需求:在某字符串中,根据多个关键字去判断这串字符串是否满足条件。如下图: 亦或是 如果说要根据图二的关键字去数据库中查询符合条件的数据&a…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
rk3506上移植lvgl应用
本文档介绍如何在开发板上运行以及移植LVGL。 1. 移植准备 硬件环境:开发板及其配套屏幕 开发板镜像 主机环境:Ubuntu 22.04.5 2. LVGL启动 出厂系统默认配置了 LVGL,并且上电之后默认会启动 一个LVGL应用 。 LVGL 的启动脚本为/etc/init.d/pre_init/S00-lv_demo,…...
