PHP在渗透测试、护网中的面试题及解答

php 反序列化漏洞的原理与解决方案

php序列化围绕着 serialize()unserialize() 这两个函数。

serialize() 函数用于序列化对象或数组,并返回一个字符串。
其序列化对象后,可以很方便的将它传递给其他需要它的地方,且其类型和结构不会改变。

如果想要将已序列化的字符串变回 PHP 的值,可使用 unserialize()

序列化就是把⼀个对象变成可以传输的字符串,如果服务器能够接收我们反序列化过的字符串、并且未经过滤的把其中的变量直接放进这些魔术方法⾥⾯的话,就容易造成很严重的漏洞。例如:

O:7:"chybeta":1:{s:4:"test";s:3:"123";}

这⾥的 O 代表存储的是对象(object), 假如你给 serialize() 传⼊的是⼀个数组,那它会变成字⺟ a。
7 表示对象的名称有 7 个字符。
“chybeta” 表示对象的名称。
1 表示有⼀个值。
{s:4:“test”;s:3:“123”;} 中,s 表示字符串,4 表示该字符串的长度,“test” 为字符串的名称,之后的类似。

当传给 unserialize() 的参数可控时,我们可以通过传⼊⼀个精心构造的序列化字符串控制对象内部的变量甚至是函数。

php 的 %00 截断(0字节截断)的原理

因为在 C 语⾔中字符串的结束标识符 %00 是结束符号,⽽ PHP 就是 C 写的,所以继承了 C 的特性,所以判断为%00 是结束符号不会继续往后执⾏

index.php?file=phpinfo.txt%00

条件:PHP<5.3.29,且 GPC 关闭
能利用00截断的场景现在应该很少了

php 的本地包含漏洞(LFI)原理、手工发掘、如果无报错回显,怎么遍历⽂件

if ($_GET['fifile']){ 
include $_GET['fifile']; 
}

包含的⽂件设置为变量,并且⽆过滤导致可以调⽤恶意⽂件 还可以对远程⽂件包含,但需要开启 allow_url_include = ON 通过测试参数的地⽅进⾏本地⽂件 / etc/passwd 等包含。
如果存在漏洞⽽且没有回显,有可能没有显示在⻚⾯⽽是⽹⻚源代码中,除了些可以利⽤ DNSlog 进⾏获取包含的信息。从 index.php ⽂件⼀级级往读取也可以利⽤ PHP 封装协议读取⽂件。
文件包含漏洞(LFI、RFI)

php.ini 的路径查看、可以设置的安全特性

php.ini的是PHP的配置文件。
(1)路径查看
新建一个PHP文档,该文档的目的是检测PHP的环境配置并在浏览器输出信息,示例:

<?php
phpinfo();

在该页面查找:Loaded Configuration File,(加载配置文件),方框中便是php.ini的具体路径了
在这里插入图片描述
如果配置了PHP环境变量,也可以在CMD窗口输入:

php -i | findstr php.ini

(2)可以设置的安全特性

禁⽤ PHP 函数
允许 include 或打开访问远程资源

posted @ 2022-02-06 18:51  Hardworking666  阅读(116)  评论(0编辑  收藏  举报