PHP立体安全:一网打尽攻击向量

news2024/11/28 8:36:12

PHP立体安全:一网打尽攻击向量

所谓攻击向量,就是指黑传递有效负载或恶意结果而可以访问计算机或网络服务器的路径或方法。

PHP的安全并不只有危险函数, 这只是冰山一角 。本文将介绍PHP从汇编层面到框架层面直到标准层面的所有攻击向量。

攻击向量枚举图

enum.png

PHP代码层面

介绍

危险函数是PHP代码层面的主要审计对象,它们通常有如下功能:

1.进行I/O操作

2.进行命令/代码执行

3.进行网络交互

4.进行数据库交互

实际上这些功能都是开发所不可缺少的,功能设计本身没有问题,只是被滥用了。

实例-preg_replace的e参数

这是thinkphp2.x的一个历史漏洞,存在于/ThinkPHP/Lib/Think/Util/Dispatcher.class.php

// $depr是取得的操作系统目录分隔符,可以认为等效如下形式
$depr='\/';
...
$paths = explode($depr,trim($_SERVER['PATH_INFO'],'/'));
...
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));

构造特定路由访问即可控制反向引用2处的值,又因为这里是双引号可以解析变量,利用PHP复杂变量进行命令执行.

例如/any_1/any_2/any_3/${phpinfo()}即可触发代码执行。(为了直观,省略了一些对路由机制的处理,实际上前几个any位置会被丢弃)

攻击向量分析

在PHP代码层面,本质上就是利用PHP已有的一些敏感功能,无论是phar反序列化,或者是file_put_content文件操作函数,还是call_user_function之类的回调函数,
本身都是没有问题的,只是被恶意滥用,达到了开发者预期之外的效果。

PHP实现层面

介绍

PHP官方提供了PHP的C语言源码,可以在[php/php-src: The PHP Interpreter
(github.com)](https://github.com/php/php-
src)下载到源码,方便查看PHP函数的C语言实现。悠悠这里调试的PHP源码是分支PHP-5.6版本。

在PHP实现层面,C语言的业务逻辑缺陷外显成一个又一个的PHP的小trick,包括open_basedir的软链接绕过、is_file触发phar反序列化等等。

实例-strip_tags实现缺陷

$str = strip_tags($str, '<audio>');
//本意是设置白名单只允许标签audio存在
// 但是可以任意位置加斜杠,不影响audio白名单,这是一个底层trick
// 例如<a/udio href=’‘》会变成<a udio href=''>,再配合javascript伪协议触发xss

这一trick成因来自于底层的C语言实现,我们来看一下。
gdb1.png
gdb2.png
gdb3.png

关键代码如下

while (i < len) {
		switch (c) {
			case '\0':
				break;
			case '<':
				...
				if (state == 0) {
					...
				} else if (state == 1) {
					depth++;
				}
				break;
				...
                case '>':
				if (depth) {
					depth--;
					break;
				}
					...
						if (allow) {
							if (tp - tbuf >= PHP_TAG_BUF_SIZE) {
								pos = tp - tbuf;
								tbuf = erealloc(tbuf, (tp - tbuf) + PHP_TAG_BUF_SIZE + 1);
								tp = tbuf + pos;
							}
							*(tp++) = '>';
							*tp='\0';
							if (php_tag_find(tbuf, tp-tbuf, allow)) {
								memcpy(rp, tbuf, tp-tbuf);
								rp += tp-tbuf;
							}
							tp = tbuf;
						}
						break;

发现此时只是在内存开辟空间,没有进行白名单处理。跳到php_tag_find函数。

gdb4.png

while (!done) {
		switch (c) {
			case '<':
				*(n++) = c;
				break;
			case '>':
				done =1;
				break;
			default:
				if (!isspace((int)c)) {
					if (state == 0) {
						state=1;
					}
                    // 这个地方就是trick出现的原因
					if (c != '/') {
						*(n++) = c;
					}
				} else {
					if (state == 1)
						done=1;
				}
				break;
		}
		c = tolower(*(++t));
	}
	*(n++) = '>';
	*n = '\0';
	if (strstr(set, norm)) {
		done=1;
	} else {
		done=0;
	}
	efree(norm);
	return done;

我们可以看到,c等于”/“时不被计数,而它的位置并没有限定,导致trick诞生。

攻击向量分析

这种攻击向量中,PHP代码层面并不是危险函数,甚至是用于过滤的安全函数,但是底层实现逻辑与官方文档原意并不完全相同,导致非预期行为引发漏洞。实际上,PHP的大量trick都来源于此,即使开发者小心翼翼的按照官方文档进行开发,充分考虑安全因素,仍然可能生产不安全的代码。

PHP汇编层面和扩展层面

介绍

即使PHP的代码层面毫无问题,C语言实现层面完美无瑕,仍然可能存在攻击向量。那就是二进制安全,在汇编层面具有漏洞。

实例-htmlspecialchars()缓冲区溢出

bug编号: 60965
PHP版本: 5.4
bug描述: 40个字节以上长实体将导致缓冲区溢出。



<?php
echo htmlspecialchars('
"""""""""""""""""""""""""""""""""""""""""""""
',ENT_QUOTES, 'UTF-8', false), "\n";

在这个实例中,攻击向量变得非常隐秘,它不是PHP使用者的问题,也不是PHP开发者的问题,而是二进制层面的漏洞。

实例-不安全的.so扩展

so1.png

这是一个自定义的恶意扩展,修改php.ini,增加extension=youyou.so启用之后,就可以调用system(),通过原先不存在的函数获得权限等,自定义的函数当然是不会被waf拦截的。

这里演示的是.so作为后门的用途,但实际上很多扩展本来不是作为后门,只是开发功能时留下了二进制层面的漏洞,被加以滥用了而已。

攻击向量分析

这一层面防不胜防,与代码层面的缺陷可以由个人用户自行修补不同,汇编和扩展层面寻常开发者不能自己修补,所以危害巨大,容易成为突破口。

C特性、操作系统层面

介绍

PHP语言毕竟底层是C语言,在毫不设防的情况下,C语言的特性就会保留且暴露出来。

实例-CVE-2015-2348

cve.png

操作系统在识别字符串时,认为\0字符是一个字符串的结束符号。PHP源码的ext/standard/basic_functions.c中对长度的安全检查受限于C语言特性失效。php版本<=5.4.39
、5.5.0-5.5.23、5.6.0-5.6.7时存在。

move_uploaded_file($_FILES['file']['tmp_name'],"/tmp/youyou.php\x00.png")

攻击向量分析

C语言特性为安全过滤等操作带来了不便,好在PHP官方对此积极修复,实际上PHP8.0在以windows作为服务器环境时仍然存在大量类似的安全缺陷,例如>转为.问题。

PHP框架层面

介绍

现代框架一般由model,controller,view,router,middle部分组成,其中model包括与数据库的交互脚本,controller包括对业务逻辑的具体实现,view是前端的视图,router控制访问的请求的处理器行驶路由权限,middle作为中间件完成各种过滤功能。框架本身提供了更多更新的功能,可能会被开发者滥用。

实例-CodeIgniter框架sql缓存滥用

ci.png

CI框架的model层已经封装了result()方法来获取数据库查询得到的数据,这其中经过大量复杂的解耦,我们直接看重点,省略部分过程,看到主要功能类。通过result找到它的具体逻辑result_object()

ci2.png

找一下这个类的属性来源。

ci3.png

继续看它的用途。

ci4.png

也就是说结果早就出来了储存在某个属性里…

ci5.png

ci6.png

我们惊奇的发现,这里优化性能时把数据库查询的缓存运用ORM技术经过反序列化存在了一个文件里。这是一个奇特的框架功能,但是由于写入控制的很好,本身没有安全问题。

ci7.png

ci8.png

写入逻辑不可控,只是功能比较奇特,但是不能利用。不过,如果遇到一个这样的控制器。

ci9.png

由于这里没有对…进行过滤,存在一个目录穿越漏洞,虽然在别处控制了目录权限限制/var/html/www目录执行,但是可以借助框架的那个特殊功能触发反序列化构造利用链条扩大攻击面。

攻击向量分析

框架的大量功能构建在PHP代码层面之上,它们本身可能是安全的,但是却可以作为新的”自定义“函数与业务逻辑捧出火花产生安全问题,是不容忽视的攻击向量来源。

PHP标准层面

介绍

web技术有许许多多的技术标准例如GraphQ、Jwt等等,它们的设计都是为了满足某种开发需求,但是在具体实现的时候可能会出现一些问题。

实例-OAtuh2.0实现缺陷

oa1.png

这是OAuth官网写的OAuth2.0技术标准脉络。

正如官方所说,OAuth2.0的作用是供用户授权访问第三方应用。涉及权限的问题,就是敏感的问题。

The OAuth 2.0 authorization framework enables a third-party
   application to obtain limited access to an HTTP servic

这是微软对OAtuth授权代码授予的说明图。

oay2.png

这是微软对OAtuh隐式授权流的说明图。

oay1.png

我们可以发现,授权代码授予方式与隐式授权流的不同在于使用场景有无后端,前者是拥有后端,所以发送了the app’s
cilent_id,后者没有后端,没有提供这一信息。

如果采用了错误的实现方式,让前者在OAuth服务器上把acess
token与cilent_id绑定,根据不同的client_id确定了可访问资源的范围,后者如果也是用的相同实现方式,相当于为none的client_id绑定了所有acess
token,没有清晰的拥有者,同时对应了多个资源,就会出现问题。

采用错误实现的时候,我们可以通过正常操作获取acess token,然后等待它更新token,通过重放的方式修改图中的hidden
sign改变获取资源的范围,绕过身份认证。

正确的实现方式应该是把acess token和资源绑定,有clent_id则连带绑定,没有则忽略。

攻击向量分析

PHP标准层面的漏洞是致命的,因为标准设计是为了解决某些开发上的问题,而具体实现时开发者可能不会考虑其安全性的问题,某种具有缺陷的实现思路一旦传播开来就会产生大面积的安全缺陷。尤其是标准设计本身具有难度,开发者难以察觉问题所在。RSA标准曾经使用过一种圆锥曲线密钥,后来发现存在数学上的缺陷,但是高明的开发者也不可能发现标准本身具有这种问题,可是不怀好意的人利用它却不是一件难事。

总结

PHP的安全是立体的、多维度的安全,从宏观到微观有各种各样的攻击面。本文枚举了PHP所有可能的攻击向量,虽然所举实例并不丰富,但是足够经典,如有不足还望指正。

绑定,没有则忽略。

攻击向量分析

PHP标准层面的漏洞是致命的,因为标准设计是为了解决某些开发上的问题,而具体实现时开发者可能不会考虑其安全性的问题,某种具有缺陷的实现思路一旦传播开来就会产生大面积的安全缺陷。尤其是标准设计本身具有难度,开发者难以察觉问题所在。RSA标准曾经使用过一种圆锥曲线密钥,后来发现存在数学上的缺陷,但是高明的开发者也不可能发现标准本身具有这种问题,可是不怀好意的人利用它却不是一件难事。

总结

PHP的安全是立体的、多维度的安全,从宏观到微观有各种各样的攻击面。本文枚举了PHP所有可能的攻击向量,虽然所举实例并不丰富,但是足够经典,如有不足还望指正。

网络安全工程师企业级学习路线

这时候你当然需要一份系统性的学习路线

如图片过大被平台压缩导致看不清的话,可以在文末下载(无偿的),大家也可以一起学习交流一下。

一些我收集的网络安全自学入门书籍

一些我白嫖到的不错的视频教程:

上述资料【扫下方二维码】就可以领取了,无偿分享

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【H5】html实现微信授权登陆

html实现微信授权登陆前言网页授权的两种 scope 的区别开发指南第一步&#xff1a;用户同意授权&#xff0c;获取code第二步&#xff1a;通过 code 换取网页授权access_token第三步&#xff1a;拉取用户信息(需 scope 为 snsapi_userinfo)代码实现&#xff1a;效果图总结前言 …

用Python出了3000道数学题,外甥表示要正月剪头

人生苦短&#xff0c;快学Python&#xff01; 过年期间发现小外甥已经上小学了&#xff0c;我姐说老师今天给他们布置了寒假作业&#xff1a;每天坚持做乘法和加减法混合运算。 这我必须帮帮忙&#xff0c;用Python写了一段自动生成小学生计算题的代码&#xff0c;并支持导出…

Python入门之ChatGPT的API调(Python版)

一、Python环境部署 参考Python 环境搭建 | 菜鸟教程 Python官网&#xff1a;Welcome to Python.org Python文档下载地址&#xff1a;Our Documentation | Python.org 二、Thonny的安装 安装包地址&#xff1a;Thonny, Python IDE for beginners 三、ChatGPT的Key申请 网…

学Qt想系统的学习,看哪本书?

Qt 是一个跨平台应用开发框架&#xff08;framework&#xff09;&#xff0c;它是用 C语言写的一套类库。使用 Qt 能为 桌面计算机、服务器、移动设备甚至单片机开发各种应用&#xff08;application&#xff09;&#xff0c;特别是图形用户界面 &#xff08;graphical user in…

虹科分享|在ntopng中使用多用户模式

并非所有 ntop 用户都知道 ntopng 本机实现了多用户支持。也就是说&#xff0c;您可以使用ntopng收集和分析来自多个用户的流量&#xff0c;并向每个用户显示自己的流量&#xff0c;隐藏其余所有流量。 您需要做的就是非常简单&#xff1a; 1. 启动 ntopng 并将其配置为接收受…

Python将字典转换为csv

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

设计模式C++实现4:装饰模式

前言 参考大话设计模式&#xff1b; 详细内容参见大话模式一书第六章&#xff0c;该书使用C#实现&#xff0c;本实验通过C语言实现。 装饰模式&#xff08;Decorator&#xff09;&#xff0c;动态地给一个对象添加一些额外的职责&#xff0c;就增加功能来说&#xff0c;装饰…

MapReduce工作原理

一.MapReduce工作流程图 1、分片操作&#xff1a;FileInputstream&#xff0c;首先要计算切片大小&#xff0c;FileInputstream是一个抽象类&#xff0c;继承InputFormat接口&#xff0c;真正完成工作的是它的实现类&#xff0c;默认为是TextInputFormat&#xff0c;TextInputF…

docker一键部署网址导航+博客+管理系统(强势开源)

花森门户 在线地址(首次加载请耐心等待)&#xff1a;http://n.huasen.cc/ 码云仓库地址&#xff1a;https://gitee.com/HuaSenJioJio/huasenjio-compose Github仓库地址&#xff1a;https://github.com/huasenjio/huasenjio-compose huasenjio 系列网站增添新作品&#xff0c;&…

CSCCTF-2019-Qual-FlaskLight

网页里有提示 参数为search&#xff0c;GET传值 测试{{7*7}} 存在SSTI模板注入&#xff0c;在这里简单介绍python魔法函数&#xff0c;与Flask内置 __class__ 返回类型所属的对象 __mro__ 返回一个包含对象所继承的基类元组&#xff0c;方法在解析时按照元组的顺序解析。 __bas…

Dropout的深入理解(基础介绍、模型描述、原理深入、代码实现以及变种)

目录前言一、DropOut简介1-1、DropOut论文图解1-2、DropOut介绍1-3、DropOut产生动机1-4、DropOut流程简介二、模型描述2-1、公式描述2-2、神经网络图描述2-3、一些需要注意的问题&#xff01;三、Dropout代码实现以及相关变种&#xff08;部分有实现&#xff09;3-1、Dropout实…

Part 4 描述性统计分析(占比 10%)——上

文章目录【后续会持续更新CDA Level I&II备考相关内容&#xff0c;敬请期待】【考试大纲】【考试内容】【备考资料】1、统计基本概念1.1、统计学的含义及应用1.1.1、统计学的含义1.2.1、统计学的应用1.2、统计学的基本概念1.2.1、数据及数据的分类1.2.2、总体和样本1.2.3、…

体系结构原则

构建和设计软件解决方案时应考虑到可维护性。 本部分概述的原则可帮助指导你作出体系结构决策&#xff0c;生成简洁、可维护的应用程序。 一般而言&#xff0c;在这些原则的指导下构建的应用程序各部分间可通过显式接口或消息传送系统进行通信&#xff0c;并非松散耦合的离散组…

WinRAR自解压实现安装程序并开机自启

1、选择要打包的文件&#xff0c;右键添加到压缩文件&#xff0c;勾选“创建自解压格式压缩文件” 2、切换到高级&#xff0c;选择“自解压文件选项” 3、常规 - 指定解压缩路径 4、安装 - 解压缩后运行指定程序 5、模式 - 隐藏全部 全部显示&#xff1a;显示启动对话框&#…

bcript 算法

一、简介 今天要给大家介绍的一种“加密”算法叫做 bcrypt&#xff0c;bcrypt 是由 Niels Provos 和 David Mazires 设计的密码哈希函数&#xff0c;他是基于 Blowfish 密码而来的&#xff0c;并于 1999 年在 USENIX 上提出。 除了加盐来抵御 rainbow table 攻击之外&#xf…

Vue3电商项目实战-首页模块6【22-首页主体-补充-vue动画、23-首页主体-面板骨架效果、4-首页主体-组件数据懒加载、25-首页主体-热门品牌】

文章目录22-首页主体-补充-vue动画23-首页主体-面板骨架效果24-首页主体-组件数据懒加载25-首页主体-热门品牌22-首页主体-补充-vue动画 目标&#xff1a; 知道vue中如何使用动画&#xff0c;知道Transition组件使用。 当vue中&#xff0c;显示隐藏&#xff0c;创建移除&#x…

C语言基础(十)—— 文件操作

1. 概述1.1磁盘文件和设备文件磁盘文件指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上&#xff0c;使用时才调入内存。设备文件在操作系统中把每一个与主机相连的输入、输出设备看作是一个文件&#xff0c;把它们的输入、输出等同于对磁盘文件的读和写。1.2 磁盘文件的…

【C++】nullptr C++中的空指针(C++11)

前言 在平时我们写C/C代码时你可能会看到有人使用NULL表示空指针&#xff0c;也有人用nullptr表示空指针&#xff0c;那么你可能会很好奇它们都是空指针吗&#xff1f;为什么空指针有两种写法&#xff1f;下面就带你了解这背后的原理。 我们都知道NULL是C语言中的空指针&#x…

JDK14 新特性详解,2020-03-17 正式发布

预览版&#xff1a;该功能在当前版本可以使用&#xff0c;如果效果不是很好的话&#xff0c;可能以后的其他版本就会删去该功能。 最终版&#xff1a;该功能在之前版本效果很好&#xff0c;之后的每个版本中都会存在该功能。 1、Switch&#xff08;最终版&#xff09; 和之前…

从线程原理的角度来看C++内存的使用

文章目录线程的内存结构栈帧线程/进程调度线程的进一步使用线程安全和可重入一般的内存使用static变量使用new关键字&#xff0c;访问堆上的内存类中的内存使用从上一篇文章来看&#xff0c;线程的使用是比较简单的。但是在c环境下使用线程&#xff0c;最难也是最麻烦的点在于对…