《白帽子讲 Web 安全》之开发语言安全深度解读

目录

引言

1.PHP 安全

1.1变量覆盖

1.2空字节问题

1.3弱类型

1.4反序列化

1.5安全配置

2Java 安全

2.1Security Manager

2.2反射

2.3反序列化

3Python 安全

3.1反序列化

3.2代码保护

4.JavaScript 安全

4.1第三方 JavaScript 资源

4.2JavaScript 框架

5.Node.js 安全

小结


引言

在 Web 应用开发的广袤天地里,开发语言宛如构建大厦的基石,其安全性直接关乎整个应用的安危。吴翰清在《白帽子讲 Web 安全》中对开发语言安全的剖析,犹如一盏明灯,照亮了我们探索语言安全风险与防护的道路。接下来,让我们一同深入解读这一关键章节。

1.PHP 安全

1.1变量覆盖

在早期的 PHP 开发环境中,若配置文件中register_globals设置为On,这就如同敞开了一扇危险的大门。此时,外部的 POST 或 GET 请求参数能够直接注册为全局变量,完全处于外部可控状态。

例如,假设在一个用户权限验证的 PHP 脚本中,存在一个未初始化的关键变量$admin,正常情况下它应该在特定逻辑中被赋值为true或false来判断用户是否为管理员。但由于register_globals = On,攻击者可以通过构造一个恶意的 GET 请求,如Example Domain,直接篡改$admin变量的值,从而实现非预期的执行逻辑,甚至可能导致越权访问,获取管理员权限。从安全角度出发,现代 PHP 开发早已摒弃了这种危险的配置方式,建议始终将register_globals设置为Off。

1.2空字节问题

PHP 在执行文件操作时,会调用底层的 C 语言库。C 语言的字符串以空字节(\0)作为结束标志,然而 PHP 的字符串结构与之不同。当 PHP 字符串中出现空字节时,就会引发严重问题。

例如,假设存在一个文件上传功能,代码意图将用户上传的文件保存到uploads/目录下,文件名由用户输入并拼接在路径后。如果攻击者在文件名中插入空字节,如test.php\0.jpg,PHP 底层调用 C 语言库进行文件操作时,获取的字符串会在空字节处截断。原本应该保存uploads/test.php\0.jpg的文件,实际可能被保存为uploads/test.php,这就导致攻击者可以绕过文件类型检查,上传恶意的 PHP 文件,进而获取服务器权限。值得庆幸的是,PHP 5.3 版本修复了这一漏洞,极大地提升了文件操作的安全性。

1.3弱类型

PHP 的一大特点是定义变量时无需显式指定类型,变量的值可以在运行过程中自由改变类型。在进行变量相等判断时,PHP 提供了严格比较(===)和松散比较(==)两种方式。松散比较在某些情况下会产生意想不到的结果。例如:

$a = "1";$b = 1;var_dump($a == $b); // truevar_dump($a === $b); // false

在这个例子中,$a是字符串类型,$b是整型,但在松散比较时,PHP 会自动进行类型转换,导致两者被判断为相等。在安全敏感的场景中,如密码验证,若使用松散比较,可能会让攻击者有机可乘。因此,为了确保代码的安全性,在 PHP 开发中应尽量明确变量类型,并优先使用严格比较。

1.4反序列化

在 PHP 开发中,对象序列化存储是一种常见的操作,它将对象转换为可存储或传输的格式。然而,如果对不可信数据进行反序列化,就如同打开了一个潘多拉魔盒。攻击者可以精心构造恶意对象,利用对象的魔术方法在特定时机自动调用的特性,执行任意命令。例如,假设存在一个包含用户信息的类User,其中定义了一个__destruct魔术方法用于清理资源:

class User {public $name;public $email;public function __destruct() {// 假设这里执行一些文件操作file_put_contents('log.txt', "User $this->name logged out\n");}}

攻击者可以构造一个恶意的序列化字符串,通过反序列化操作,在__destruct方法中注入恶意代码,如修改系统文件或执行任意命令。为了防范这种风险,应避免对不可信数据进行反序列化操作,或者在反序列化前对数据进行严格的校验。

1.5安全配置

在过去的 PHP 版本中,安全模式是一种重要的安全防护机制。它可以对文件操作、变量操作等行为进行限制,例如限制 PHP 脚本只能访问特定目录下的文件,防止恶意脚本对系统文件进行非法读写。

然而,从 PHP 5.4 版本开始,安全模式不再被建议依赖。此外,PHP 还有一些其他重要的安全配置选项,如allow_url_include,若设置为On,PHP 脚本可以包含远程 URL 的文件,这可能导致远程代码执行风险,因此建议设置为Offdisable_functions可以禁用一些危险的函数,如eval、system等,防止攻击者利用这些函数执行恶意代码;LD_PRELOAD用于指定动态链接库的加载顺序,不当使用可能被攻击者利用来注入恶意代码;magic_quotes_gpc曾经用于自动转义用户输入数据中的特殊字符,防止 SQL 注入等攻击,但由于存在一些问题,已被移除。在现代 PHP 开发中,开发者需要根据项目需求和安全最佳实践,合理配置这些选项,以提升应用的安全性。

2Java 安全

2.1Security Manager

Java 的 Security Manager 是一个强大的安全策略定义工具,尤其在运行不可信代码时,启用 Security Manager 显得尤为重要。启用方式有两种,一种是通过指定策略文件,在启动 Java 应用时使用-Djava.security.policy参数指定策略文件路径,策略文件中详细定义了哪些操作是允许的,哪些是禁止的。例如:

grant {permission java.io.FilePermission "/tmp/*", "read,write";};

上述策略表示允许应用对/tmp/目录下的文件进行读写操作。

另一种启用方式是在代码中直接调用System.setSecurityManager(new SecurityManager());。当应用执行的操作不符合策略定义时,就会抛出异常。不过,需要注意的是,从 Java 17 开始,Security Manager 的标准资源被移除,在未来的版本中可能会被完全删除,这也促使开发者寻找其他更可靠的安全防护机制。

2.2反射

Java 的反射机制赋予了开发者在运行时动态获取类的属性和方法,并调用对象属性和方法的强大能力。例如:

Class<?> clazz = Class.forName("com.example.MyClass");Object obj = clazz.newInstance();Method method = clazz.getMethod("myMethod", String.class);method.invoke(obj, "Hello");

然而,这种灵活性也带来了安全隐患。攻击者可以利用反射机制,在反序列化过程中,绕过正常的访问控制,调用一些敏感的方法或修改关键的属性。许多 Java 反序列化漏洞很大程度上依赖于反射特性,攻击者通过构造恶意的序列化数据,利用反射执行任意代码,获取系统权限。

2.3反序列化

在 Java 应用中,对象的序列化和反序列化操作广泛应用于对象的传输和存储。需要序列化的对象必须实现Serializable接口。在反序列化过程中,如果在Classpath中找不到对应的类,会抛出异常。但攻击者可以利用这一机制,构造恶意对象,利用反序列化执行任意命令。以 Apache Commons Collections 库中的 Transformer 接口相关漏洞为例,攻击者可以通过精心构造的序列化数据,利用 Transformer 接口的特性,在反序列化时执行恶意代码,如创建远程连接、读取敏感文件等。为了防范 Java 反序列化漏洞,开发者需要谨慎处理外部输入的序列化数据,避免对不可信数据进行反序列化操作,同时及时更新相关库的版本,修复已知的漏洞。

3Python 安全

3.1反序列化

Python 自带的pickle序列化库在处理对象序列化时非常方便,但也存在安全隐患。在pickle反序列化过程中,__reduce__方法可能会自动调用,攻击者可以利用这一特性构造恶意对象,执行任意命令。例如:

import pickleimport osclass MaliciousObject:def __reduce__(self):return (os.system, ('rm -rf /',))malicious_obj = MaliciousObject()serialized_data = pickle.dumps(malicious_obj)

如果将上述序列化数据进行反序列化操作,就会执行rm -rf /命令,删除系统中的所有文件。为了防御反序列化漏洞,开发者可以采取多种措施。首先,尽量选择高版本的pickle库,因为高版本通常修复了一些已知的安全问题。其次,可以定义过滤器,对反序列化的数据进行严格筛选,只允许反序列化安全的对象。还可以重写过滤方法,在反序列化前对数据进行全面检查。另外,对序列化数据进行签名校验也是一种有效的手段,确保数据在传输过程中未被篡改。

3.2代码保护

Python 作为一种解释型语言,在运行过程中有一个编译阶段,源代码会被编译成字节码并存储在.pyc文件中。然而,.pyc文件并不具备保密性,任何人都可以轻松获取并反编译,无法有效保护源代码。这对于一些商业应用或涉及敏感业务逻辑的项目来说,是一个需要关注的问题。为了在一定程度上保护 Python 代码,可以使用混淆工具对代码进行混淆处理,使反编译后的代码难以理解和修改。但需要注意的是,这种保护方式并非绝对安全,只是增加了攻击者反编译和篡改代码的难度。

4.JavaScript 安全

4.1第三方 JavaScript 资源

在现代 Web 应用中,加载第三方 JavaScript 资源是一种常见的做法,比如用于广告投放、社交分享等功能。然而,使用第三方资源也伴随着诸多安全风险。第三方 JavaScript 代码可能存在安全漏洞,一旦被攻击者利用,就可能导致用户隐私泄露,如获取用户的浏览历史、地理位置等信息。攻击者还可能在第三方 JavaScript 代码中植入恶意攻击代码,当用户访问页面时,恶意代码被执行,对用户的设备或网络造成损害。为了避免这些影响,开发者可以尽量避免使用不可信的第三方 JavaScript 资源。如果必须使用,可以通过校验资源完整性的方式,确保资源在传输过程中未被篡改。例如,使用Subresource Integrity(SRI)技术,在 HTML 中引入 JavaScript 资源时,添加integrity属性,验证资源的哈希值:

<script src="https://example.com/script.js" 
integrity="sha384-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"></script>

此外,使用沙箱iframe隔离第三方 JavaScript 资源也是一种有效的防护手段,将第三方代码限制在一个独立的环境中运行,减少对主页面的影响。

4.2JavaScript 框架

随着 Web 应用交互的日益复杂,JavaScript 框架在开发中得到了广泛应用。然而,不安全的框架使用可能会引入安全漏洞。以 jQuery 及其插件为例,曾经存在多个安全漏洞,如跨站脚本攻击(XSS)漏洞、代码注入漏洞等。这些漏洞可能导致攻击者在用户浏览器中执行恶意脚本,窃取用户信息或进行其他恶意操作。开发者在使用 JavaScript 框架时,需要密切关注框架的官方发布信息,及时更新到最新版本,以修复已知的安全漏洞。同时,Web 漏洞扫描器也可以对前端组件进行漏洞检测,帮助开发者及时发现并解决潜在的安全问题。

5.Node.js 安全

Node.js 作为一种流行的 Web 服务端开发语言,其应用也可能存在各种安全漏洞。例如,eval函数在 Node.js 中可以执行字符串形式的 JavaScript 代码,如果使用不当,攻击者可以通过注入恶意代码,利用eval函数执行任意命令,获取服务器权限。在使用第三方模块时,Node.js 的开发者需要格外小心。第三方模块可以发布到 npm 仓库,由于 npm 仓库中的模块数量众多,质量和安全性参差不齐,有些模块可能存在安全漏洞,甚至包含恶意代码。开发者在使用第三方模块前,应仔细审查模块的来源和口碑,尽量选择知名、可靠的模块,并及时更新模块版本,以降低安全风险。

小结

不同的开发语言都有其独特的安全属性和特性,在 Web 安全领域,虽然很多安全做法逐渐趋于标准化,但每种语言的安全风险和防护重点依然存在差异。随着技术的不断发展,开发语言也在持续演进,像 PHP、Java 等语言在发展过程中,对一些不安全的特性或做法进行了调整和改进。开发者需要紧跟语言的发展趋势,深入了解所使用语言的安全特性和潜在风险,遵循安全最佳实践,采取有效的防护措施,确保 Web 应用的安全性。只有这样,才能在不断变化的 Web 安全环境中,为用户提供安全可靠的应用服务。

喜欢就点点赞和评论关注一起进步咯

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django设置admin的排列顺序,耗3小时【躲坑指南】

django 项目中&#xff0c;这个数据栏目的显示排列顺序我希望更贴近业务 比如要让【商品货品信息】中的9个数据表根据人为规定来进行排序 结果&#xff1a;工程量很大。 能够实现人为的自定义排序 最简单的设置就是给模型添加号数标记 主应用中创建admin–设置了其中一个应用…

macOS使用brew切换Python版本【超详细图解】

目录 一、更新Homebrew仓库 二、安装pyenv 三、将pyenv添加到bash_profile文件中 四、使.bash_profile文件的更改生效 五、安装需要的Python版本 六、设置全局使用的Python版本 七、检查Python版本是否切换成功 pyenv常用命令 一、更新Homebrew仓库 brew update 这个…

【深度学习新浪潮】AI ISP技术与手机厂商演进历史

本文是关于AI ISP(人工智能图像信号处理器)的技术解析、与传统ISP(图像信号处理器)的区别、近三年研究进展,以及各大手机厂商在该领域演进历史的详细报告。本报告综合多个权威来源的信息,力求全面、深入地呈现相关技术发展脉络与行业动态。 第一部分:AI ISP的定义及与传…

如何让节卡机器人精准对点?

如何让节卡机器人精准对点&#xff1f; JAKA Zu 软件主界面主要由功能栏、开关栏、菜单栏构成。 菜单栏&#xff1a;控制柜管理&#xff0c;机器人管理与软件管理组成。主要功能为对控制柜关机、APP 设置、机器人本体设 置、控制柜设置、连接机器人和机器人显示等功能。 开关…

QAI AppBuilder 快速上手(7):目标检测应用实例

YOLOv8_det是YOLO 系列目标检测模型&#xff0c;专为高效、准确地检测图像中的物体而设计。该模型通过引入新的功能和改进点&#xff0c;如因式分解卷积&#xff08;factorized convolutions&#xff09;和批量归一化&#xff08;batch normalization&#xff09;&#xff0c;在…

c#难点整理

1.何为托管代码&#xff0c;何为非托管代码 托管代码就是.net框架下的代码 非托管代码&#xff0c;就是非.net框架下的代码 2.委托的关键知识点 将方法作为参数进行传递 3.多维数组 4.锯齿数组 5.多播委托的使用 6.is运算符 相当于逻辑运算符是 7.as 起到转换的作用 8.可…

二次向用户申请授权

HarmonyOS 5.0.3(15) 版本的配套文档&#xff0c;该版本API能力级别为API 15 Release 文章目录 当应用通过requestPermissionsFromUser()拉起弹框请求用户授权时&#xff0c;用户拒绝授权。应用将无法再次通过requestPermissionsFromUser()拉起弹框&#xff0c;需要用户在系统应…

JetsonNano —— 4、Windows下对JetsonNano板卡烧录刷机Ubuntu20.04版本(官方教程)

介绍 NVIDIA Jetson Nano™ 开发者套件是一款面向创客、学习者和开发人员的小型 AI 计算机。按照这个简短的指南&#xff0c;你就可以开始构建实用的 AI 应用程序、酷炫的 AI 机器人等了。 烧录刷机 1、下载 Jetson Nano开发者套件SD卡映像 解压出.img文件并记下它在计算机上的…

Chapter 8 Charge Pump

Chapter 8 Charge Pump 8.1 Introduction 电荷泵就是capacitive DC–DC converters, 一般把小功率bias generation叫做电荷泵, 传输大功率的称为switched-capacitor DC–DC converters. 但其实两者都是通过电容网络的charge redistribution, 来实现电压的倍增或者倍降. 8.1.…

计算机网络——通信基础和传输介质

物理层任务&#xff1a;实现相邻节点之间比特&#xff08;0或1&#xff09;的传输 到了数据链路层之后&#xff0c;它会以帧为单位&#xff0c;把若干个比特交给物理层&#xff0c;物理层需要把这些比特信息转化成信号&#xff0c;在物理传输媒体上进行传输 通信基础基本概念 信…

【架构】单体架构 vs 微服务架构:如何选择最适合你的技术方案?

文章目录 ⭐前言⭐一、架构设计的本质差异&#x1f31f;1、代码与数据结构的对比&#x1f31f;2、技术栈的灵活性 ⭐二、开发与维护的成本博弈&#x1f31f;1、开发效率的阶段性差异&#x1f31f;2、维护成本的隐形陷阱 ⭐三、部署与扩展的实战策略&#x1f31f;1、部署模式的本…

Java-SpringBootWeb入门、Spring官方脚手架连接不上解决方法

一. Spring 官网&#xff1a;Spring | Home Spring发展到今天已经形成了一种开发生态圈&#xff0c;Spring提供了若干个子项目&#xff0c;每个项目用于完成特定的功能(Spring全家桶) Spring Boot可以帮助我们非常快速的构建应用程序、简化开发、提高效率 。 二. Spring Boot入…

springboot整合redis

创建springboot整合redis工程&#xff1a; 一、springboot整合redis步骤 首先我们要知道什么是redis&#xff1a; 三步骤完成springboot对redis数据库的整合&#xff1a; 1、导入springboot整合redis坐标&#xff08;上面勾选的那个就是&#xff09; 2、在yml配置文件中配置re…

图解AUTOSAR_CP_EEPROM_Abstraction

AUTOSAR EEPROM抽象模块详细说明 基于AUTOSAR标准的EEPROM抽象层技术解析 目录 1. 概述 1.1 核心功能1.2 模块地位2. 架构概览 2.1 架构层次2.2 模块交互3. 配置结构 3.1 主要配置容器3.2 关键配置参数4. 状态管理 4.1 基本状态4.2 状态转换5. 接口设计 5.1 主要接口分类5.2 接…

【AI Infra】【RLHF框架】二、VeRL中colocate实现解析

​ colocate的作用是使多个Worker共享相同的资源池。当然&#xff0c;目前verl中所有模型的Worker都共享相同的资源池:global_pool。这篇博客主要通过例子和源代码理解verl中colocate的实现&#xff0c;需要一些前置知识。建议先阅读 【AI Infra】【RLHF框架】一、VeRL中基于R…

PostgreSQL_数据表结构设计并创建

目录 前置&#xff1a; 1 数据表设计思路 2 数据表格SQL 3 创建 3.1 创建数据库 db_stock 3.2 在 pgAdmin4 中创建表 前置&#xff1a; 本博文是一个系列。在本人“数据库专栏”-》“PostgreSQL_”开头的博文 1 数据表设计思路 1 日数据来自优矿&#xff0c;优矿的数据…

植物来源药用天然产物的合成生物学研究进展-文献精读121

植物来源药用天然产物的合成生物学研究进展 摘要 大多数药用天然产物在植物中含量低微&#xff0c;提取分离困难&#xff1b;而且这些化合物一般结构复杂&#xff0c;化学合成难度大&#xff0c;还容易造成环境污染。基于合成生物学技术获得药用天然产物具有绿色环保和可持续发…

Nordic nRF 蓝牙的 Direct Test Mode (DTM) 测试介绍

目录 概述 1. 核心物理层参数 1.1 射频频率 (RF Channel Frequency) 1.2 发射功率 (TX Power) 1.3 调制方式 (Modulation) 1.4 数据包类型 (Packet Type) 1.5 测试模式 (Test Mode) 2. 参数配置方法 2.1 通过 HCI 命令配置 2.2 示例&#xff08;nRF52 系列&#xff0…

区间震荡指标

区间震荡指标的逻辑如下&#xff1a; 一、函数注解 1. Summation函数 功能&#xff1a; 计算给定价格序列Price的前Length个数据点的和&#xff0c;或在数据点数量超过Length时&#xff0c;计算滚动窗口内的价格和。 参数&#xff1a; Price(1)&#xff1a;价格序列&#…

文章防洗稿隐蔽混淆软件

如果你的文章经常被人洗稿搬运&#xff0c;那么这个小工具或许可以帮到你 基本原理: 在文章的每个字后面&#xff0c;加上一些随机的隐藏字符 人眼看不到&#xff0c;但是机器会读取到&#xff0c;如果别人是用AI工具来对你的文章进行洗稿&#xff0c;就会发现这是一堆乱码 你…