【PHP代码审计】 ini配置、常见危险函数及特殊函数(一)

本文详细介绍了PHP配置文件的种类及其配置权限,重点讲解了全局变量、文件上传、目录权限等核心配置项,并列举了一些常见的危险函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PHP配置文件
php.ini --全局配置文件,都是默认信息
可以是php.ini 也可以是php.版本号.ini

user.ini --用户级别的配置文件
在这里插入图片描述php的配置有不同的配置权限,不同的权限在不同的配置文件是不一样的,具体的配置权限可以查阅相关文档。
在这里插入图片描述php 配置 – 语法
指令名 = 值
指令名大小写敏感,值可以是字符串、数字、php常量、ini常量、表达式

在这里插入图片描述常见重要配置 -变量相关
全局变量 register_globals = off 默认是关闭的
可以将键值直接注册为变量
因为有严重的安全问题,在新版本中已经移除。
在这里插入图片描述
安全模式在新的版本中也被移除了,默认关闭。

需要重点关注一下 :禁用类/函数
禁用类函数:disable_classes =,disable_functions =,disable_functions
在这里插入图片描述

常见的重要配置-上传文件及目录权限
file_uploads = on 默认是打开的
定义了上传文件的大小之后,超过定义大小的文件就不会上传成功。

临时目录 不设置默认为空的话就采用系统临时目录 Linux是 /tmp Windows是 C:\Windows\Temp

用户访问目录限制:限制能访问的目录,一般是限制在网站的根目录,用 . 来代替。可以访问临时目录
Linux用 : 作为不同目录的分割符号
Windows用 ; 作为不同目录的分割符号

在这里插入图片描述错误信息
这个需要打开,不然调试的时候没法继续,错误报告级别也应该调到最高
在调试的时候在入口文件就把错误信息打开。
在这里插入图片描述
魔术引号及远程文件
魔术引号在新版本中已经被废弃了。默认打开

远程文件和包含文件有关,默认打开
包含远程文件,默认关闭
在这里插入图片描述

常见的危险函数(一)
php 可以把变量作为函数名执行

代码执行函数 -eval & assert & preg_replace
eval() :把字符串作为php代码执行
assert() :断言,是一个调试函数,也可以把字符串作为代码执行
preg_replace() :执行正则表达式进行搜索和替换
string creat_function() :创建匿名函数,可以把字符串的内容作为函数去执行
call_user_func() :回调函数,多参数形式
call_user_func_array() :回调函数,数组形式
在这里插入图片描述
在这里插入图片描述

包含函数

include 文件名/文件路径
在这里插入图片描述
命令执行函数

调用外部函数或用shell执行命令
在这里插入图片描述
文件操作函数

文件操作函数还有很多很多
在这里插入图片描述
特殊函数

在这里插入图片描述
数组相关:判断变量是否存在在数组里面,在比较之前会自动类型转换,当把strict设置为true则不会自动转换
在这里插入图片描述
比较之前会先自动转换类型
在这里插入图片描述
设置为true则不会自动转换
在这里插入图片描述

### CTF Web PHP 代码审计与安全漏洞分析 #### 1. ThinkPHP 版本特定漏洞分析 针对ThinkPHP框架,在2.x以及3.0至3.1版本中存在的远程命令执行(RCE)漏洞是个重要的研究对象[^1]。这类漏洞允许攻击者通过精心构造的数据包来触发服务器端未预期的行为,从而可能获得对系统的控制权。 #### 2. 环境配置需求 为了成功利用某些类型的PHP应用层面上存在的缺陷,通常需要满足系列前提条件。例如,当涉及到基于FastCGI协议处理请求的应用时,要求PHP版本不低于5.3.3以便支持动态调整`php.ini`设置;同时还需要知晓目标环境中至少PHP脚本的确切位置,并确认PHP-FPM服务正在本地9000端口上等待连接。另外,对于依赖网络库的功能测试,则需保证使用的libcurl工具集达到或超过7.45.0版本[^2]。 #### 3. 绕过逻辑判断技巧 在个具体的案例中展示了如何巧妙运用PHP内置函数特性来规避程序内部设定的安全检查机制。由于在比较操作符两侧分别放置不同类型的数据结构——即左侧为整数而右侧则是字符串形式表示的数组——可以使得原本用于验证用户输入合法性的表达式始终成立。具体来说就是利用了`strlen()`和`strpos()`这两个函数遇到非标量参数时返回null这行为特征配合严格相等运算符实现绕过的策略[^3]。 ```php <?php $flag = "flag"; if (isset($_GET['ctf'])) { if (@ereg("^[1-9]+$", $_GET['ctf']) === FALSE) echo '必须输入数字才行'; elseif (strpos($_GET['ctf'], '#biubiubiu') !== FALSE) die('Flag: '.$flag); else echo '骚年,继续努力吧啊~'; } ?> ``` 上述代码片段存在明显的安全隐患,可以通过传递特殊格式的查询参数使第二个条件分支得以执行并泄露敏感信息。 #### 4. 利用序列化数据注入风险 另个值得注意的现象是在面向对象编程模式下可能出现的对象反序列化进程中的潜在威胁。如果应用程序接受来自外部未经充分净化的数据作为创建实例的基础,则可能会引入恶意构造的内容进而造成不可预见的影响。下面给出的例子演示了种简单的方法用来读取预设变量值: ```php <?php class Config{ public $update_url = 'http://127.0.0.1:4476/'; } class Dao{ private $config; public function __construct(){ $this->config=new Config(); } } echo base64_encode(serialize(new Dao())); ?> ``` 此段代码揭示了个事实:即使属性被声明成私有成员也并不能完全阻止外界对其状态的操作可能性,尤其是在缺乏适当防护措施的情况下[^4]。 #### 5. 正则表达式的误用及其后果 正则表达式引擎的工作方式决定了其解析过程可能存在多种解释路径,特别是在面对复杂或者模糊不清的模式定义之时尤为明显。考虑到这点,开发人员应当谨慎对待任何形式化的字符匹配语句以免无意间留下可被滥用的空间。比如`preg_match()`函数虽然能够有效地完成单次查找任务但是却容易受到意外终止的影响而导致异常情况的发生[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值