PHP代码审计(一)之PHP代码审计的意义

news2025/1/10 10:16:48

PHP代码审计的意义

什么是代码审计

什么是代码审计?代码审计就是获取目标的源代码,这个目标可以是一个网站,也可以是一个手机app,只要我们得到了目标的源代码,我们就可以去挖掘目标系统的漏洞,代码审计是指对源代码进行检查,寻找到代码中的bug,这是一项需要多方面技能的技术,包括对编程的掌握、漏洞形成原理的理解,系统和中间件等的熟悉。代码审计是企业安全运营人员及安全从业者必备的基础能力,代码审计在很多场景中都需要用到,比如企业安全运营、渗透测试、漏洞研究等

黑盒测试与白盒测试的区别

在代码审计中,黑盒测试和白盒测试的主要区别就在于是否可以拿到源代码,黑盒测试是拿不到源代码的,白盒测试是可以拿到源代码的

是否应该掌握代码审计

渗透测试人员掌握代码审计是非常重要的,因为我们在渗透测试的过程中经常需要针对目标环境的payload进行调试。另外,如果通过目录扫描工具扫到Web目录下的一个源码备份包,通常攻击者都会利用源码包找寻一些配置文件或者敏感信息,因为里面有数据库、API等一类的配置。对于掌握和没掌握代码审计的人来说,结果完全不一样、对于没掌握代码审计的人来说,可能就止步于此,而对于掌握了代码审计的人,他可以对源码包进行安全审计,发现网站的代码里面存在的漏洞,然后利用挖掘的漏洞进行渗透,总而言之,代码审计是渗透测试必不可少的一部分

编程能力的要求

代码审计对编程语言的基础有一定的要求,至少要能看的懂代码,能够理解代码是什么意思还有代码的逻辑,即使在代码审计中碰到一些你没见过的函数,也是可以直接上百度去查的,所以只要初步掌握了编程语言,想学习PHP代码审计应该都不是什么问题

PHP代码审计流程

首先做代码审计第一种是通读全文法,通读全文法作为最麻烦的方法也是最全面的审计方法,特别是大型的项目,通读全文也是了解整个项目,了解业务逻辑最好方法,了解整个项目,这样也可以挖掘到更多的中高危漏洞,然后第二种是检查敏感函数的参数,然后回溯变量,判断变量是否可控并且没有经过严格的过滤,这是一个逆向追综的过程,名为敏感函数参数回溯法,这个方法是最有效的,最常用的方法,大多数漏洞的产生是因为函数的使用不当导致的,我们可以全局搜索一些敏感函数,看看是否有未经过滤的参数传进来,就可以挖掘漏洞。第三种叫定向功能分析方法,这个方法主要是根据程序的业务逻辑来进行代码审计的,查看网站的功能,大概推测可能存在那些漏洞常见的功能漏洞,程序初始安装、文件上传、数据库备份、找回密码、验证码等。还有一种是可以先找出哪些文件在接受外部传入的参数,然后跟踪变量的传递过程,观察是否有变量传入到高危的函数中,或者在传递的过程中是否有代码逻辑的漏洞,这是一种正向追踪的方式、这样的挖掘方式比逆向挖掘的更全。

代码审计需要使用那些软件

我们在PHP代码审计的过程中经常需要用到以下几款软件:

  • PHPStorm
  • SQLyog
  • 虚拟机
  • Burpsuite
  • PHPStudy
  • Seay源代码审计系统

代码审计环境搭建

这里提供了代码审计需要用到的工具,大家可以通过以下链接下载

链接:https://pan.baidu.com/s/1e-526vPdsDtSUoexZKZP8w?pwd=8888 
提取码:8888

代码审计工具

代码审计工具是一类辅助我们做白盒测试的程序,他可以分为很多类,列如安全性审计以及代码规范性审计等。Seay源代码审计是一款针对于PHP代码安全性审计的系统,主要运行于Windows系统上,这款软件能够发现SQL注入、代码执行、命令执行、文件包含、文件上传、绕过转义防护、拒绝服务、XSS跨站、信息泄露、任意URL跳转等漏洞,基本上覆盖常见的PHP漏洞,系统配置了有以下的功能:

  • 一键审计
  • 快速函数定位
  • 自定义多窗口搜索
  • MySQL执行监控
  • 一键调试选中代码
  • 文档自动查询
  • 插件扩展
  • 代码高亮
  • 编码调试转换
  • 数据库执行监控

主界面如图所示:

在这里插入图片描述

php核心配置详解

代码在不同的环境下执行的结果也会大有不同,可能就因为一个配置问题,导致一个非常高危漏洞能够利用,也可能你已经找到的一个漏洞就因为你的配置的问题,导致你无法成功构造漏洞利用的代码。在PHP中,不同的版本中配置的指令也有不一样的地方,因此我们在代码审计之前需要非常熟悉PHP各个版本中配置文件的核心指令,才能更高效的挖掘漏洞

以下只列出会影响PHP脚本安全的配置列表以及核心配置选项:

  1. register_globals(全局变量注册开关)
    该选项在设置为on的情况下,会直接吧用户GET、POST等方式提交上来的参数注册成全局变量并且初始化值为参数对应的值,使得提交参数可以直接在脚本中使用。register_globals在PHP版本小于等于4.2.3时设置为PHP_INI_ALL,中PHP5.3.0起被废弃,不推荐使用,在PHP5.4.0中移除了该选项
  2. allow_url_include(是否允许包含远程文件)
    在该配置为on的情况下,它可以直接包含远程文件,当存在include( var ) 且 var)且var)且var可控的情况下,可以直接控制$var变量来执行PHP代码。allow_url_include在PHP5.2.0后默认设置为off,配置范围是PHP_INI_ALL。与之类似的配置还有allow_url_fopen,配置是否允许打开远程文件
  3. magic_quotes_gpc(魔术引号自动过滤)
    magic_quotes_gpc在安全方面做了很大的贡献,主要他被开启,在不存在编码或者其他特殊绕过的情况下,可以使得很多漏洞无法被使用,他也是让渗透测试人员很头疼的一个东西。当该选项设置为on时,会自动在GET、POST、COOKIE变量中的单引号、双引号、反斜杠及空字符的前面加上反斜杠,但是在PHP5中并不会过滤$_SERVER变量,导致很多类似client-ip、referer一类的漏洞能够利用。在PHP5.3之后的不推荐使用magic_quotes_gpc,PHP5.4之后取消了magic_quotes_gpc。在PHP版本小于4.2.3时,配置范围是PHP_INI_ALL;在PHP版本大于4.2.3时,是PHP_INI_PERDIR
  4. magic_quotes_runtime(魔术引号自动过滤)
    magic_quotes_runtime也是自动在单引号、双引号、反斜杠及空字符的前面加上反斜杠。与magic_quotes_gpc的区别是处理的对象不一样,magic_quotes_runtime只对从数据库或者文件中获取的数据进行过滤,他的作用也很大,因为很多程序员只对外部输入的数据进行过滤,却没有想过从数据库获取的数据同样也会有特殊字符存在,所以攻击者的做法是先将攻击代码写入数据库,在程序读取、使用到被污染的数据后即可触发估计。同样magic_quotes_runtime在PHP5.4之后也被取消,配置范围是PHP_INI_ALL
  5. magic_quotes_sybase(魔术引号自动过滤)
    magic_quotes_sybase指令用于自动过滤特殊字符,当设置为on时,他会覆盖掉magic_quotes_gpc=on的配置中,即使配置了gpc=on也是没有效果的。这指令与gpc的共同点是处理的对象一致,即都对GET、POST、Cookie进行处理。而他们之间的区别在于处理的方式不同,magic_quotes_sybase仅仅是转义了空字符和吧单引号编程了双引号。于gpc相比他的配置范围是PHP_INI_ALL,在PHP5.4.0中移除了该选项
  6. safe_mode(安全模式)
    安全模式是PHP内嵌的一种安全机制,当safe_mode=on时,联动可以配置的指令有safe_mode_includea_dir、safe_mode_exec_dir、safe_mode_allowed_env_vars、safe_mode_protected_env_vars。safe_mode指令的配置范围为PHP_INI_SYSTEM,PHP5.4之后被取消
  7. open_basedir PHP可访问目录
    open_basedir指令用来现在PHP只能访问哪些目录,通常我们只需要设置Web文件目录即可,如果需要加载外部脚本,也需要吧脚本所在目录路径加入到open_basedir指令中,多个目录以分号分割。使用open_basedir需要注意的一点是,指定的现在实际上是前缀,而不是目录名。如果要将访问仅限制在指定的目录内,请用斜线结束路径名
  8. disable_functions(禁用函数)
    当需要使用指令来禁止危险函数时,切记要把dl()函数也加到禁止列表,因为攻击者可以利用dl()函数来加载自定义的PHP拓展以突破disable_functions指令的限制。disable_functions的指令限制为php_ini_only
  9. display_errors和error_reporting错误显示
    display_errors表明是否显示PHP脚本内部错误的选项,在调试PHP的时候,通常把PHP错误显示打开,但是在生产环境中,建议关闭PHP错误回显,即设置display_errors=off,以避免一些安全隐患。在设置display_errors=on时,还可以配置一个指令是error_reporting,这选项用来配置错误显示的级别,可使用数字也可以使用内置常量配置。这两个指令的配置范围都是PHP_INI_ALL

PHP 危险函数归纳

在PHP中,以下的函数是PHP中经常用到的危险函数:

  • include/require/include_once/require_once
  • eval/assert/preg_replace/create_function
  • system/passthru/exec/shell_exec
  • file_get_contents/fread/readfile/file/show_source
  • file_put_contents/fwrite/mkdir
  • unlink/rmdir
  • move_uploaded_file/copy/rename
  • extract/parse_str
  • simplexml_load_files/simplexal_load_string
  • unserialize
  • urldecode/base64_decode

代码执行函数

eval 把字符串作为PHP代码执行,很多常见的webshell都是用eval来执行具体操作的
assert 也是把字符串作为PHP代码执行
preg_replace 是正则表达式函数
create_function 创建匿名函数并执行传入的命令

包含函数

文件包含函数主要作用为包含并运行指定文件,include/require/include_once/require_once $file,如果$file可控的情况下,我们就可以包含任意文件了,从而达到getshell的目的,包含函数也能够读取任意文件内容,这就需要用到支持的协议和封装协议和过滤器

命令执行函数

exec() 执行一个外部程序
system() 执行外部程序,并且显示输出
只要命令就能执行的参数可控系统命令

文件操作函数

copy:拷贝文件
file_get_contents:将整个文件读入一个字符串
file_put_contents:将一个字符串写入文件
unlink:删除文件
rmdir:删除目录

反序列化函数

unserialize 反序列化一个序列化的对象

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

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

相关文章

详解Jenkins配置邮件通知

前言 这几天Darren洋在使用Jenkins定时构建jmeter脚本中,要用到邮箱配置,故记录之。 一、Jenkins默认邮箱通知 这里填好smtp服务器地址和邮箱后缀,这样下面的账号就不用加邮箱后缀了。 网易邮箱设置以下我就不说废话文学了,直接上…

从零搭建ros间的通信,各功能包、节点之间的通信

新建消息类型 catkin_create_pkg car_interfaces roscpp rospy std_msgs message_generation message_runtime书写自定义的msg: 比如我写一个GlobalPathPlanningInterface.msg: float64 timestamp #时间戳 float32[] startpoint #起点位置&#x…

【技能实训】DMS数据挖掘项目-Day01

文章目录 任务1 项目准备一、开发环境二、系统简介三、项目创建 任务2【任务2.1】菜单项设计及其测试【任务2.2】使用数组存储采集的数据【任务2.3】控制显示采集的数据 任务1 项目准备 一、开发环境 1.JDK8下载及其环境变量配置(JDK8以上版本) 2.IDE :Eclipse 或…

马可·坎图 (Marco Cantú) 荣获尼克劳斯·沃斯奖 (Niklaus Wirth Award) Pascal最具价值贡献者奖

我们非常高兴地宣布,我们自己的Marco Cant荣获由西班牙萨拉曼卡大学主办的国际Pascal大会颁发的Niklaus Wirth奖。 评审团的引文最后这样一句话:“ Marco Cant 是Pascal社区最杰出、最原创、最杰出的人物之一”。我不认为我们自己可以说得更好。 国际Pa…

rabbitmq使用笔记

前言 mq的优点:异步提速、解耦、流量削峰 mq的缺点: mq宕机可能导致消息丢失、消费者未成功消费如果保证整个系统架构的事务安全、消息可能被重复消费出现幂等问题、消息未被消费到引发死信问题、消息出现消费延迟或消费异常引发的顺序消费错乱问题...…

Linux 修改网卡 MAC 地址

使用 iproute2 修改网卡 MAC 地址 1. 使用如下命令查看当前所有网卡及其 MAC 地址; sudo ip link show2. 如笔者这里想要修改网卡 ens224 的 MAC 地址,先使用如下命令关闭该网卡; sudo ip link set dev ens224 down3. 设置该网卡的 MAC 地…

阿里云:机器学习平台及OpenSearch

机器学习流程 相关项目 BladeDISC-AI编译优化 EasyRec-推荐算法库 EasyCV-视觉图像算法库 EasyNLP-NLP/多模态算法库 模型开发中算法团队面临的工程挑战 Develop platform OpenSearch 向量检索库

亚马逊云科技迁移只需5个简单步骤(2023年迁移到云)

您是否正在考虑亚马逊云科技迁移,并将本地项目迁移到云中? 但是不知道从哪里开始以及如何去做? 在这篇文章中,我将指导您完成亚马逊云科技迁移。 什么是亚马逊云科技? 亚马逊云科技或亚马逊网络服务是最受欢迎的云平…

jar程序部署的外部依赖和按名传参和shellUtil传参json串及返回pid问题

文章目录 指定jar程序运行的外部依赖指定参数名称传参给程序shellUtil命令传参JSON串shellUtil获取回调nohub启动程序后的pid 指定jar程序运行的外部依赖 nohup java -Djava.ext.dirs./lib/ -cp DataSourceAccessPage.jar com.sitech.adapter.JsonAdapter arg0 arg1java -cp 命…

10_SPI_Flash 连续写实验

10_SPI_Flash 连续写实验 1. 实验目标2. 连续写方法3. 操作时序4. 流程框图4.1 顶层模块4.2 连续写模块 5. 波形图6. RTL6.1 flash_seq_wr_ctrl6.2 spi_flash_seq_wr 7. Testbench 1. 实验目标 使用页写指令,将串口发送过来的连续不定量数据写入 Flash。本实验中&a…

Linux开发环境的搭建

文章目录 系统安装工具软件安装Xshell远程登录VScode远程登录Linux 下GCC安装 系统安装 (虚拟机安装、云服务器)Ubuntu18.04 网络类型:桥接模式网络、NAT(network access transation)网络地址转换模式、仅主机模式 注意&#xff…

模拟电压与数字脉冲占空比控制的应用与发展前景

摘要:本文将讨论模拟电压控制和数字脉冲占空比控制在嵌入式控制方面的应用场景、共同点和不同点,并探讨它们在未来发展中的前景。 引言: 模拟电压控制和数字脉冲占空比控制都是嵌入式系统中常用的控制方式。模拟电压控制将电压作为控制信号&…

electron 应用优雅的配置 about 信息

使用 electron 的 dialog tray 托盘栏菜单优雅简单的配置 about 关于本应用的信息,效果下图所示。 项目依赖 {"electron": "^24.4.1","electron-builder": "^23.6.0","electron-builder-squirrel-windows": &q…

线程那些事

线程锁 线程锁(Thread Lock),也被称为互斥锁(Mutex Lock),是一种用于多线程编程中的同步机制。它用于保护共享资源在多个线程之间的访问,以避免出现竞态条件(Race Condition&#x…

企业内容建站系统 ModStartCMS v6.8.0 内容页面自定义模板,内容区块功能增强

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议,免费且不限制商业使用。 功能特性 丰富的模块市…

【状态估计】一维粒子滤波研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

虚函数表的地址

结论 1. c多态的实现是靠虚函数表来实现的,有虚函数的类有虚函数表,没虚函数的类就没有虚函数表 2. 虚函数表是类的所有对象共用,切记是共同所有,不是一个对象所有 3. 每个虚函数成员占据虚函数表的一行,是个指针&a…

机械设计制造及其自动化专业向PLC方向发展的可行性

是的,机械设计制造及其自动化专业往PLC(可编程逻辑控制器)方向发展是可行的。PLC是一种用于控制和自动化各种机械设备和工业过程的计算机控制系统。它被广泛应用于工业自动化领域,包括制造业、能源行业、交通运输等。 我这里刚好…

001- database - 数据库

1、新的数据库进入默认有四个数据库,一般不要轻易删除; -- 创建数据库 CREATE DATABASE 数据库名 -- 查询所有数据库 SHOW DATABASES -- 使用数据库 -- USE 数据库名 -- 查询当前使用的数据库 SELECT DATABASE() -- 删除数据库 DROP DATABASE 数据库名

Rdkit|分子3D构象生成与优化

github; 地址 文章目录 Rdkit|分子3D构象生成与优化构象生成算法概述基于距离(distance-based)代码示例 距离几何算法生成3D结构距离几何ETKDG生成3D构象距离几何ETKDG生成多构象将Conformer类转为Mol类手动对齐 距离几何ETKDGMMFF生成3D构象距离几何ETK…